我试图了解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%?
这就是交叉验证的工作原理:
因此,基本上每次迭代都会以新的方式分割数据,并针对它运行测试。
我试图了解 sklearn 交叉验证和评分的工作原理,并观察到一些奇怪的行为。
您对您的案例感兴趣的是什么?这len(X)可能很重要。Imagen 当您使用正常拟合方法而不进行交叉验证时,您将分成 700 个训练集和 300 个测试集。无论在 cv=4 的交叉验证中,这都将是 800 个训练集和 200 个测试集。这可能会产生不同的结果。
这对你的解释意味着什么?您的数据集对分裂行为非常敏感。也许收集更多数据可能是个好主意,我强烈建议您在这个原因中使用交叉验证,否则您以后可能会得到不好的预测结果,尽管您认为自己有一个很好的预测方法。
| 归档时间: |
|
| 查看次数: |
1783 次 |
| 最近记录: |