为什么交叉验证的得分总是比正常拟合和得分更高?

时间:2019-04-24 20:41:49

标签: scikit-learn

我正在尝试了解sklearn交叉验证和评分的工作原理,并观察到一些奇怪的行为。

我实例化一个分类器,然后对其进行4倍交叉验证,得到4个分数,准确度在90%+-0.5%范围内。

然后我在所有训练数据上重新拟合模型,并在测试数据上对其评分。我还在此代码中对训练数据评分,以证明观点。

我将数据分为测试和训练集后运行这段代码。

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import make_scorer, balanced_accuracy_score

gbc = GradientBoostingClassifier()

scores = cross_val_score(gbc, X_train, y_train, cv=4, scoring=make_scorer(balanced_accuracy_score))

print('cv scores: ', scores)
print('cv scores mean: ', scores.mean())

gbc.fit(X_train, y_train)

print('test score on test: ', balanced_accuracy_score(gbc.predict(X_test), y_test))
print('test score on train: ', balanced_accuracy_score(gbc.predict(X_train), y_train))

打印:

cv scores:  [0.89523728 0.90348769 0.90412818 0.89991599]
cv scores mean:  0.900692282366262
test score on test:  0.8684604909814304
test score on train:  0.874880530883581

我希望test score on test的输出与交叉验证的分数处于同一范围内,并且我希望test score on train的输出显示出较差的过拟合,因此人为地比交叉验证的分数。

为什么我为什么这些分数始终比交叉验证的分数差3-4%?

1 个答案:

答案 0 :(得分:0)

交叉验证的工作方式如下:

enter image description here

因此,基本上每次迭代都会以一种新的方式拆分数据,并针对它进行测试。

  

我试图了解sklearn交叉验证和评分的工作原理,并观察到一些奇怪的行为。

您的情况可能有什么疑问? len(X)可能很重要。当您使用正常拟合方法且无交叉验证时,Imagen将分为700个训练集和300个测试集。只要在cv = 4的交叉验证中,这就是800个训练集和200个测试集。这样可以得出不同的结果。

这对您的解释意味着什么?您的数据集对拆分行为非常敏感。也许收集更多数据是个好主意,我强烈建议您使用交叉验证,否则您以后可能会得到不好的预测结果,尽管您认为自己有一个好的预测方法。