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



用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.8fnAccuracy cvs: %0.8f' % (accuracy_cvp, accuracy_cvs))

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

Accuracy cvp: 0.95333333
Accuracy cvs: 0.95333333

然而,情况似乎并非总是如此,就像在官方文档中编写的那样(关于使用 cross_val_predict 计算的结果(:

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

想象一下跟随标签和拆分

[010|101|10]

所以你有 8 个数据点,每个类 4 个,你把它分成 3 个折叠,导致 2 个包含 3 个元素和一个包含 2 个元素的折叠。现在让我们假设在交叉验证期间,您得到以下 pred

[010|100|00]

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

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

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

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

例如,如果您有 100 个数据点,其中 33 个是目标类,那么KFold with n_splits=5 会将其拆分为 5 个折叠,每 20 个观测值,但StratifiedKFold不一定会为您提供大小相等的折叠。

最新更新