GridSearchCV 从最佳估计器中给出的分数不同于 refit 参数中指示的分数
GridSearchCV giving score from the best estimator different from the one indicated in refit parameter
我正在使用 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')
我将 refit 参数设置为 '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, preds),3)
metrics['mcc'] = round(matthews_corrcoef(test_labels, preds),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 分数。根据评分函数的文档,它说
Returns the score on the given data, if the estimator has been refit.
This uses the score defined by scoring where provided, and the
best_estimator_.score method otherwise.
我没有理解正确。我想如果我像我在 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()
.
这些方法的特征与标准 Estimator 的特征相同(拟合、预测、评分等)。
您可以使用底层模型,但它不一定会继承您对网格搜索对象本身所做的配置。
我正在使用 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')
我将 refit 参数设置为 '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, preds),3)
metrics['mcc'] = round(matthews_corrcoef(test_labels, preds),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 分数。根据评分函数的文档,它说
Returns the score on the given data, if the estimator has been refit.
This uses the score defined by scoring where provided, and the best_estimator_.score method otherwise.
我没有理解正确。我想如果我像我在 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()
.
这些方法的特征与标准 Estimator 的特征相同(拟合、预测、评分等)。
您可以使用底层模型,但它不一定会继承您对网格搜索对象本身所做的配置。