为什么交叉验证给出的分数始终高于正常拟合和评分?

use*_*401 5 scikit-learn

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

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

然后我在所有训练数据上重新拟合模型,并在测试数据上对其进行评分。我也在此代码中对训练数据进行评分,只是为了证明一点。

我在将数据拆分为测试集和训练集后运行此代码。

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))
Run Code Online (Sandbox Code Playgroud)

打印:

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
Run Code Online (Sandbox Code Playgroud)

我希望test score on test输出与交叉验证分数在同一范围内,并且我希望test score on train输出显示出严重的过度拟合,因此人为地比交叉验证分数高得多。

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

PV8*_*PV8 0

这就是交叉验证的工作原理:

在此输入图像描述

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

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

您对您的案例感兴趣的是什么?这len(X)可能很重要。Imagen 当您使用正常拟合方法而不进行交叉验证时,您将分成 700 个训练集和 300 个测试集。无论在 cv=4 的交叉验证中,这都将是 800 个训练集和 200 个测试集。这可能会产生不同的结果。

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