当我用交叉验证训练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
)。随后,将5个载体(每个都包含200个预测)合并为y_pred
。
考虑到所有这些,对于我来说,使用y_pred
和Y。
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)
?
编辑:
i首先假设在5个验证中的每个实例中,在5个验证中使用cv=5
。
cross_val_score vs cross_val_predict
cross_val_predict
和cross_val_score
之间的差异在这里确实很清楚地描述了,其中还有另一个链接,因此您可以跟随兔子。
本质上:
-
cross_val_score
返回分数 -
cross_val_predict
由每个数据点的折叠预测。
现在,您无法知道cross_val_predict
中的哪些预测来自哪个折叠,因此您无法像cross_val_score
一样计算平均每个折叠。您可以平均cross_val_score
和cross_val_predict
的accuracy_score
,但平均值不等于平均值,因此结果将有所不同。
如果一倍的精度非常低,则比平均cross_val_predict
的总体平均水平更大。
此外,您可以对这七个数据点进行分组不同,并获得不同的结果。这就是为什么有有关使区别的信息的信息。
cross_val_score和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
更严重,因为每个错误都会影响小组的准确性,远大于影响所有预测的平均准确性(您可以自行检查)。
两者都可以用于评估模型在验证集上的性能,我认为没有禁忌症,只是不同的行为(折叠错误并不那么严重)。
为什么都不是概括
的度量如果您根据交叉验证方案适合算法,则将执行数据泄漏(为火车和验证数据进行微调)。为了获取概括性错误,您必须将数据的一部分从交叉验证和培训中排除在外。
您可能要执行双重交叉验证,或者仅保留测试设置,以获取模型的实际概括程度。