为什么 cross_val_predict 不适合测量泛化误差?

zwi*_*uta 8 python svm scikit-learn cross-validation

当我通过交叉验证训练 SVC 时,

y_pred = cross_val_predict(svc, X, y, cv=5, method='predict')
Run Code Online (Sandbox Code Playgroud)

cross_val_predict返回 X 中每个元素的一个类预测,因此y_pred.shape = (1000,)m=1000. 这是有道理的,因为cv=5SVC 在 X 的不同部分上进行了 5 次训练和验证。在这五次验证中,每一次都对五分之一的实例进行了预测 ( m/5 = 200)。随后,将 5 个向量(每个向量包含 200 个预测)合并为y_pred.

y_pred考虑到所有这些,我使用和 y计算 SVC 的整体精度是合理的。

score = accuracy_score(y, y_pred)
Run Code Online (Sandbox Code Playgroud)

但是(!)cross_val_predict声明的文档:

cross_val_predict 的结果可能与使用 cross_val_score 获得的结果不同,因为元素以不同的方式分组。函数 cross_val_score 取交叉验证折叠的平均值,而 cross_val_predict 只是简单地返回来自几个不同模型的标签(或概率)。因此,cross_val_predict 不是泛化误差的适当度量。

有人可以换句话解释一下,为什么cross_val_predict不适合测量泛化误差,例如 via accuracy_score(y, y_pred)


编辑:

我首先假设在cv=55 个验证中的每一个都会对 X 的所有实例进行预测。但这是错误的,每次验证仅对 X 的 1/5 实例进行预测。

Szy*_*zke 6

cross_val_score 与 cross_val_predict

cross_val_predict和之间的区别在这里cross_val_score描述得非常清楚,那里还有另一个链接,所以你可以关注兔子。

在本质上:

  • cross_val_score返回每次折叠的分数
  • cross_val_predict对每个数据点进行折叠预测。

现在,您无法知道哪些预测来自cross_val_predict哪个折叠,因此您无法像cross_val_score以前那样计算每个折叠的平均值。您可以对cross_val_scoreaccuracy_scoreof求平均值cross_val_predict,但平均值的平均值不等于平均值​​,因此结果会有所不同。

如果一次折叠的准确度非常低,那么与平均的情况相比,它对整体平均值的影响更大cross_val_predict

此外,您可以对这七个数据点进行不同的分组并获得不同的结果。这就是为什么有关于分组产生差异的信息。

cross_val_score 和 cross_val_predict 之间的差异示例

让我们想象一下,cross_val_predict对 7 个数据点使用 3 次折叠,并且折叠外预测为[0,1,1,0,1,0,1],而真实目标为[0,1,1,0,1,1,0]。准确度分数将计算为 5/7(只有最后两个预测得很差)。

现在采用相同的预测并将它们分为以下 3 个部分:

  • [0, 1, 1]- 预测和[0, 1, 1]目标 -> 第一次折叠的准确度为 1
  • [0, 1]- 预测和[0, 1]目标 -> 再次完美的准确性
  • [0, 1]- 预测和[1, 0]目标 -> 0 准确度

这就是cross_val_score返回一个精度元组,即[1, 1, 0]。现在,您可以对这个元组进行平均,总准确度为2/3

看?使用相同的数据,您将获得两种不同的准确性度量(一个是5/7,另一个是2/3)。

在这两种情况下,分组都会改变您获得的总准确度。分类器错误严重cross_val_score,因为每个错误对组准确性的影响大于对所有预测的平均准确性的影响(您可以自行检查)。

两者都可以用于评估模型在验证集上的性能,而且我认为没有禁忌症,只是不同的行为(折叠错误没有那么严重)。

为什么两者都不是泛化的衡量标准

如果您根据交叉验证方案来拟合您的算法,则您正在执行数据泄漏(针对训练和验证数据对其进行微调)。为了了解泛化误差,您必须将部分数据排除在交叉验证和训练之外

您可能想要执行双重交叉验证,或者只是保留测试集以了解模型的实际泛化程度。

  • 非常感谢。这个例子真的很有帮助!我做了同样的计算,但各个简历组的大小始终完全相同。在这种情况下,平均值的平均值等于平均值​​(至少里卡多在您发送给我的链接中是这么说的)。 (2认同)