在数据科学领域,评估模型预测性能是一个重要环节。交叉验证是一种常用的技术,用于评估模型在不同数据子集上的表现。本文将介绍如何使用scikit-learn库中的cross_val_predict函数和PredictionErrorDisplay工具来可视化预测误差。
首先,需要加载一个数据集并创建一个线性回归模型的实例。这里使用的是糖尿病数据集,这是一个经典的回归问题数据集。通过线性回归模型,可以尝试预测数据集中的某个连续变量。
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
# 加载数据集
X, y = load_diabetes(return_X_y=True)
# 创建线性回归模型实例
lr = LinearRegression()
接下来,使用cross_val_predict函数来获取交叉验证预测结果。这个函数会返回一个与y相同大小的数组,其中每个条目都是通过交叉验证获得的预测值。在这个例子中,设置了cv=10,这意味着训练了10个模型,每个模型都用于预测10个数据折叠中的一个。
from sklearn.model_selection import cross_val_predict
# 获取交叉验证预测结果
y_pred = cross_val_predict(lr, X, y, cv=10)
现在,可以使用PredictionErrorDisplay工具来可视化预测误差。在左侧的坐标轴上,绘制了观测值y与模型预测的值y_pred。在右侧的坐标轴上,绘制了残差(即观测值与预测值之间的差异)与预测值之间的关系。
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("实际值与预测值对比")
# 绘制残差与预测值的对比图
PredictionErrorDisplay.from_predictions(y, y_pred=y_pred, kind="residual_vs_predicted", subsample=100, ax=axs[1], random_state=0)
axs[1].set_title("残差与预测值对比")
# 设置总标题
fig.suptitle("交叉验证预测可视化")
# 显示图表
plt.tight_layout()
plt.show()
需要注意的是,在本例中,仅使用cross_val_predict进行可视化目的。如果不同CV折叠的大小和分布不同,直接从cross_val_predict返回的连接预测中计算单一性能指标来定量评估模型性能将是有问题的。建议使用cross_val_score或cross_validate来计算每个折叠的性能指标。