用cross_val_score计算的度量与从cross_val_predict开始计算的相同度量有何不同(用于获取要提供给度量函数的预测)?

这是一个例子:

from sklearn import cross_validation
from sklearn import datasets
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB


iris = datasets.load_iris()

gnb_clf = GaussianNB()
#  compute mean accuracy with cross_val_predict
predicted = cross_validation.cross_val_predict(gnb_clf, iris.data, iris.target, cv=5)
accuracy_cvp = metrics.accuracy_score(iris.target, predicted)
#  compute mean accuracy with cross_val_score
score_cvs = cross_validation.cross_val_score(gnb_clf, iris.data, iris.target, cv=5)
accuracy_cvs = score_cvs.mean()

print('Accuracy cvp: %0.8f\nAccuracy cvs: %0.8f' % (accuracy_cvp, accuracy_cvs))


在这种情况下,我们获得相同的结果:

Accuracy cvp: 0.95333333
Accuracy cvs: 0.95333333


但是,似乎并非总是这样,因为它是on the official documentation编写的(关于使用cross_val_predict计算的结果):


  请注意,此计算的结果可能会略有不同
  从使用cross_val_score作为元素分组获得的那些
  以不同的方式。

最佳答案

想象以下标签和拆分

[010 | 101 | 10]

因此,您有8个数据点,每个类4个,将其拆分为3折,导致3个元素折合为2折,1个为2折。

[010 | 100 | 00]

因此,您的得分为[100%,67%,50%],而跨值得分(平均)约为72%。现在,关于预测的准确性如何?您显然有6/8件事正确,因此75%。如您所见,分数是不同的,即使它们都依赖于交叉验证。在这里,由于分割的大小不完全相同而产生差异,因此最后一个“ 50%”实际上降低了总分,因为它是仅2个样本的平均值,其余均基于3个样本。

通常,可能还会存在其他类似现象-它应该归结为求平均值的方式。因此,-交叉价值得分是平均值的平均值,而不必是交叉验证预测的平均值。

07-24 13:09