使用cross_val_score计算的指标与从cross_val_predict开始计算的相同指标有何不同?

时间:2016-02-10 14:58:12

标签: python machine-learning scikit-learn metrics cross-validation

使用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获得的那些元素进行分组   以不同的方式。

2 个答案:

答案 0 :(得分:1)

想象一下关注标签和拆分

[010 | 101 | 10]

所以你有8个数据点,每个类4个你将它分成3个折叠,导致2个折叠,3个元素和1个2个。现在让我们假设在交叉验证期间你得到了跟随预测

[010 | 100 | 00]

因此,您的得分为[100%,67%,50%],并且交叉评分(平均值)约为72%。那么准确性超过预测呢?你显然有6/8的东西是正确的,因此75%。正如您所看到的那样,得分是不同的,即使它们都依赖于交叉验证。在这里,差异的产生是因为分裂的大小不完全相同,因此这最后的“50%”实际上降低了总分,因为它只是一个超过2个样本的海藻(其余的基于3个)。

一般来说,可能还有其他类似的现象 - 它应该归结为计算平均值的方式。因此 - 交叉val得分是平均超过平均值,不一定是交叉验证预测的平均值。

答案 1 :(得分:0)

除了lejlot的答案外,cross_val_score和cross_val_predict之间可能会得到略有不同的结果的另一种方式是,目标类的分布方式不允许它们在折痕之间平均分配。

根据cross_val_predict的文档,如果估计量是分类器,而y是二进制或多类,则默认使用StratifiedKFold。这可能会导致一种情况,即使数据集中实例的总数可以被折叠数整除,但最终折叠的大小会稍有不同,因为拆分器是根据目标的存在进行拆分的。这可能导致平均平均值与总体平均值略有不同的问题。

例如,如果您有100个数据点,其中33个是目标类,则KFoldn_splits=5会将其分成20观察值的5折,但是StratifiedKFold不一定会给您同样大小的褶皱。