我正在尝试了解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%?
答案 0 :(得分:0)