简介
在本实验中,我们将学习如何使用交叉验证,通过 scikit-learn 中的cross_val_predict和PredictionErrorDisplay函数来可视化模型预测和误差。我们将加载糖尿病数据集,创建一个线性回归模型实例,并使用交叉验证来获得一个预测数组。然后,我们将使用PredictionErrorDisplay来绘制实际值与预测值,以及残差与预测值的关系图。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
加载并准备数据
首先,我们将加载糖尿病数据集并为建模做准备。我们将使用 scikit-learn 中的load_diabetes函数将数据集加载到两个数组X和y中。
from sklearn.datasets import load_diabetes
X, y = load_diabetes(return_X_y=True)
创建线性回归模型
接下来,我们将使用 scikit-learn 中的LinearRegression类创建一个线性回归模型实例。
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
生成交叉验证预测
我们将使用 scikit-learn 中的cross_val_predict函数来生成交叉验证预测。
from sklearn.model_selection import cross_val_predict
y_pred = cross_val_predict(lr, X, y, cv=10)
可视化预测误差
我们将使用 scikit-learn 中的PredictionErrorDisplay来可视化预测误差。我们将绘制实际值与预测值,以及残差与预测值的关系图。
import matplotlib.pyplot as plt
from sklearn.metrics import PredictionErrorDisplay
fig, axs = plt.subplots(ncols=2, figsize=(8, 4))
PredictionErrorDisplay.from_predictions(
y,
y_pred=y_pred,
kind="actual_vs_predicted",
subsample=100,
ax=axs[0],
random_state=0,
)
axs[0].set_title("Actual vs. Predicted values")
PredictionErrorDisplay.from_predictions(
y,
y_pred=y_pred,
kind="residual_vs_predicted",
subsample=100,
ax=axs[1],
random_state=0,
)
axs[1].set_title("Residuals vs. Predicted Values")
fig.suptitle("Plotting cross-validated predictions")
plt.tight_layout()
plt.show()
解读结果
从可视化结果中,我们可以看到实际值与预测值的图表显示出一种带有一些变化的相对线性关系。残差与预测值的图表显示出一种相对随机的模式,没有明显趋势,这表明线性回归模型可能很适合该数据。然而,需要注意的是,我们仅将cross_val_predict用于可视化目的。当不同的交叉验证折在大小和分布上存在差异时,通过从cross_val_predict返回的连接预测中计算单个性能指标来定量评估模型性能会有问题。建议使用cross_val_score或cross_validate来计算每折的性能指标。
总结
在本实验中,我们学习了如何使用交叉验证,通过 scikit-learn 中的cross_val_predict和PredictionErrorDisplay函数来可视化模型预测和误差。我们加载了糖尿病数据集,创建了一个线性回归模型实例,并使用交叉验证来获得一个预测数组。然后,我们使用PredictionErrorDisplay绘制实际值与预测值,以及残差与预测值的关系图。最后,我们解读了结果,并讨论了使用每折性能指标进行模型评估的重要性。