GridSearchCV 给出的最佳估计值与改装参数中指示的估计值不同

问题描述

我正在使用 GridSearchCV 进行超参数优化

scoring_functions = {'mcc': make_scorer(matthews_corrcoef),'accuracy': make_scorer(accuracy_score),'balanced_accuracy': make_scorer(balanced_accuracy_score)}

grid_search = GridSearchCV(pipeline,param_grid=grid,scoring=scoring_functions,n_jobs=-1,cv=splitter,refit='mcc')

我将改装参数设置为 'mcc',因此我希望 GridSearchCV 选择最佳模型来最大化该指标。然后我计算一些分数

preds = best_model.predict(test_df)
metrics['accuracy'] = round(accuracy_score(test_labels,preds),3)
metrics['balanced_accuracy'] = round(balanced_accuracy_score(test_labels,3)
metrics['mcc'] = round(matthews_corrcoef(test_labels,3)

我得到了这些结果

"accuracy": 0.891,"balanced_accuracy": 0.723,"mcc": 0.871

现在,如果我这样做是为了在相同的测试集上获得模型的分数(不是先计算预测),就像这样

best_model = grid_search.best_estimator_
score = best_model.score(test_df,test_labels)

我得到的分数是这个

"score": 0.891

如您所见,这是准确率,而不是 mcc 分数。根据评分函数的文档,它说

返回给定数据的分数(如果估算器已重新拟合)。

这使用由提供的评分定义的分数,以及 best_estimator_.score 方法否则。

我没有正确理解。我想,如果我像我在 GridSearchCV 中使用 refit 参数指定的那样重新拟合模型,结果应该是用于重新拟合模型的评分函数?我错过了什么吗?

解决方法

当您访问属性 best_estimator_ 时,您将转到底层基本模型,忽略您对 GridSearchCV 对象所做的所有设置:

best_model = grid_search.best_estimator_
score = best_model.score(test_df,test_labels)

您应该改用 grid_search.score(),并且通常与该对象进行交互。例如,在预测时,使用 grid_search.predict()

这些方法的签名与标准估算器的签名相同(拟合、预测、评分等)。

您可以使用底层模型,但它不一定继承您对网格搜索对象本身所做的配置。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...