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

问题描述 投票:3回答:1

当我训练SVC进行交叉验证时,

y_pred = cross_val_predict(svc, X, y, cv=5, method='predict')

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

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

score = accuracy_score(y, y_pred)

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

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

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


编辑:

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

python scikit-learn svm cross-validation
1个回答
2
投票

cross_val_score vs cross_val_predict

cross_val_predictcross_val_score之间的差异真的很清楚here和那里有另一个链接,所以你可以跟随兔子。

在本质上:

  • cross_val_score每回合得分
  • cross_val_predict对每个数据点进行折叠预测。

现在,你无法知道cross_val_predict中哪些预测来自哪个折叠,因此你不能像cross_val_score那样计算每倍的平均值。您可以对cross_val_scoreaccuracy_scorecross_val_predict进行平均,但average of averages is not equal to average,因此结果会有所不同。

如果一个折叠具有非常低的精度,那么它将比平均cross_val_predict更多地影响整体平均值。

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

Example of difference between cross_val_score and cross_val_predict

让我们想象cross_val_predict使用3个折叠7个数据点,并且折叠预测是[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的分类器误差更严重,因为每个误差都会影响组的准确性,而不是影响所有预测的平均准确度(您可以自己检查)。

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

Why neither is a measure of generalization

如果您根据交叉验证方案拟合算法,则表明您正在执行数据泄漏(对列车和验证数据进行微调)。为了获得泛化错误,您必须将部分数据留在交叉验证和培训之外。

您可能希望执行双交叉验证,或者只是保留测试设置以获得模型实际推广的程度。

© www.soinside.com 2019 - 2024. All rights reserved.