为什么Cross_val_predict不适合测量概括误差



当我用交叉验证训练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。

来计算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)


编辑:

i首先假设在5个验证中的每个实例中,在5个验证中使用cv=5

cross_val_score vs cross_val_predict

cross_val_predictcross_val_score之间的差异在这里确实很清楚地描述了,其中还有另一个链接,因此您可以跟随兔子。

本质上:

  • cross_val_score返回分数
  • cross_val_predict由每个数据点的折叠预测。

现在,您无法知道cross_val_predict中的哪些预测来自哪个折叠,因此您无法像cross_val_score一样计算平均每个折叠。您可以平均cross_val_scorecross_val_predictaccuracy_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更严重,因为每个错误都会影响小组的准确性,远大于影响所有预测的平均准确性(您可以自行检查)。

>

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

为什么都不是概括

的度量

如果您根据交叉验证方案适合算法,则将执行数据泄漏(为火车和验证数据进行微调)。为了获取概括性错误,您必须将数据的一部分从交叉验证和培训中排除在外

您可能要执行双重交叉验证,或者仅保留测试设置,以获取模型的实际概括程度。

最新更新