使用 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 计算的结果):
Note that the result of this computation may be slightly different from those obtained using cross_val_score as the elements are grouped in different ways.
最佳答案
想象一下以下标签和拆分
[010|101|10]
因此,您有 8 个数据点,每个类 4 个,您将其分成 3 个折叠,导致 2 个折叠包含 3 个元素,一个折叠包含 2 个元素。现在让我们假设在交叉验证期间您得到以下预测
[010|100|00]
因此,您的分数为 [100%, 67%, 50%],交叉验证分数(平均)约为 72%。现在预测的准确性又如何呢?显然你有 6/8 的事情是对的,因此是 75%。正如您所看到的,尽管它们都依赖于交叉验证,但分数还是不同的。在这里,出现差异是因为分割的大小不完全相同,因此最后的“50%”实际上降低了总分,因为它只是 2 个样本的平均值(其余的基于 3 个样本)。
一般来说,可能还有其他类似的现象 - 它应该归结为计算平均值的方式。因此 - 交叉验证分数是平均值的平均值,不一定是交叉验证预测的平均值。
关于python - 使用 cross_val_score 计算的指标与从 cross_val_predict 计算的相同指标有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35318535/