Sklearn GridSearchCV得分与手动计算balanced_accuracy不一致问题
问题:GridSearchCV与手动计算的balanced_accuracy得分差异疑问
我使用Sklearn的GridSearchCV对随机森林模型进行超参数调优,训练数据变量为X_train、Y_train,代码如下:
param_grid = { 'n_estimators': [500], 'max_features': ['sqrt', None], 'max_depth': [ 6 ], 'max_leaf_nodes': [8], 'min_impurity_decrease':[0,0.02], 'min_samples_split':[2] } grid_search= GridSearchCV(RandomForestClassifier( criterion='gini', min_weight_fraction_leaf=0.0, bootstrap=True, n_jobs=-1, random_state=1, verbose=0, warm_start=False, class_weight='balanced', ccp_alpha=0.0, max_samples=None), param_grid=param_grid,verbose=50,cv=2,n_jobs=-1,scoring='balanced_accuracy') grid_search.fit(X_train, Y_train)
训练过程中看到的得分范围在0.4-0.6,示例如下:
[CV 2/2; 1/4] END max_depth=6, max_features=sqrt, max_leaf_nodes=8, min_impurity_decrease=0, min_samples_split=2, n_estimators=500;, score=0.552 total time= 15.4s
但通过balanced_accuracy_score手动计算训练集的得分:
from sklearn.metrics import balanced_accuracy_score print('training accuracy', balanced_accuracy_score(grid_search.predict(X_train), Y_train,adjusted=False))
得到的结果约为0.96,与GridSearchCV显示的得分差异极大。我已在GridSearchCV中设置scoring='balanced_accuracy',请问为何会出现这种情况?GridSearchCV中的得分具体代表什么?
解答
1. GridSearchCV中得分的具体含义
GridSearchCV的score是交叉验证过程中验证折叠的balanced_accuracy,具体逻辑:
- 当设置
cv=2时,X_train会被拆分成2个互斥的子集(折叠)。 - 对每组超参数,模型会先用其中1个折叠的数据训练,再用另1个折叠的数据做验证,计算得到的
balanced_accuracy就是你看到的日志里的score。 - 最终的最佳得分是所有折叠验证得分的平均值(多折叠场景下)。
2. 得分差异的核心原因
你手动计算的是整个训练集上的模型表现:
grid_search.fit()结束后,最终的最佳模型是用全部X_train数据重新训练出来的,所以用它预测X_train时,得分会很高(0.96),这是模型在训练数据上的拟合效果。- 而GridSearchCV日志里的得分是未参与训练的验证折叠数据上的泛化效果,得分低说明你的模型存在严重过拟合:在训练数据上表现优异,但对未见过的数据预测能力很差。
3. 验证建议
- 查看交叉验证的详细得分:
# 查看所有超参数组合的平均验证得分 print(grid_search.cv_results_['mean_test_score']) # 查看得分的标准差 print(grid_search.cv_results_['std_test_score']) - 用最佳模型测试测试集数据,计算测试集的
balanced_accuracy,这个结果会更接近GridSearchCV的验证得分,而非训练集的0.96。
内容的提问来源于stack exchange,提问作者Ben Bitdiddle
相关产品推荐
相关产品推荐

