当我训练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实例。
cross_val_predict
和cross_val_score
之间的差异真的很清楚here和那里有另一个链接,所以你可以跟随兔子。
在本质上:
cross_val_score
每回合得分cross_val_predict
对每个数据点进行折叠预测。现在,你无法知道cross_val_predict
中哪些预测来自哪个折叠,因此你不能像cross_val_score
那样计算每倍的平均值。您可以对cross_val_score
的accuracy_score
和cross_val_predict
进行平均,但average of averages is not equal to average,因此结果会有所不同。
如果一个折叠具有非常低的精度,那么它将比平均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
的分类器误差更严重,因为每个误差都会影响组的准确性,而不是影响所有预测的平均准确度(您可以自己检查)。
两者都可用于评估模型在验证集上的性能,但我看不到禁忌症,只是不同的行为(折叠错误不是那么严重)。
如果您根据交叉验证方案拟合算法,则表明您正在执行数据泄漏(对列车和验证数据进行微调)。为了获得泛化错误,您必须将部分数据留在交叉验证和培训之外。
您可能希望执行双交叉验证,或者只是保留测试设置以获得模型实际推广的程度。