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

标签 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 计算的结果):

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/

相关文章:

python - 在 Armbian 上从 i2c 2 读取 BME680

python - 使用 wget 下载 python3.4 时出错

python - Ubuntu 安装 Boto 错误

python - 神经网络中的 SciPy 优化警告

python-2.7 - DICT() 和 MATPLOTLIB?

python - 训练后如何保存和加载我的神经网络模型以及 python 中的权重?

ruby - 实现k最近邻需要哪些数据?

python - CNN 用于词性标记 Python?

machine-learning - 用 sklearn 对目标进行 PCA?

python - scikit TfidfVectorizer.transform() 为同一文档返回不同的结果