在进行 GridSearchCV 时,grid.score(…) 和 grid.best_score_ 获得的分数有什么区别?
请假设模型、特征、目标和参数网格已经就位。以下是我非常好奇的代码片段。
grid = GridSearchCV(X_train, y_train)
grid.fit(X_train, y_train)
scores = grid.score(estimator=my_model, param_grid=params, cv=3, return_train_score=True, scoring='neg_mean_squared_error')
best_score_1 = scores
best_score_2 = grid.best_score_
对于 best_score_1 和 best_score_2,有两种不同的输出。我试图了解这两者之间的区别,以及在给定的参数网格中,哪一个应该被认为是最佳分数。
以下是完整的函数。
def apply_grid (df, model, features, target, params, test=False):
'''
在重新分割数据集后执行 GridSearchCV,提供
训练集的 MSE 和测试集的 MSE 之间的比较,以检查
泛化性能,并可选择在测试集上部署找到的最佳参数。
Args:
df: DataFrame
model: 要使用的模型
features: 要考虑的特征
target: 标签
params: 用于优化的参数网格
test: 默认值为 False,如果为 True,则在测试集上进行预测
Returns:
模型的 MSE 分数和 cv_results_ 的切片,
以比较模型的泛化性能
'''
my_model = model()
# 将数据集分割成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df[features],
df[target], random_state=0)
# 重新分割训练数据集为 GridSearchCV 使用的 train2 和 valid,以保持测试集独立
X_train2, X_valid, y_train2, y_valid = train_test_split(train[features],
train[target] , random_state=0)
# 使用网格搜索从参数网格中找到最佳参数
grid = GridSearchCV(estimator=my_model, param_grid=params, cv=3,
return_train_score=True, scoring='neg_mean_squared_error')
grid.fit(X_train2, y_train2)
# 在验证集上评估
scores = grid.score(X_valid, y_valid)
scores = scores # 混淆
print('通过 GridSearchCV 获得的最佳 MSE: ', grid.best_score_) # 混淆
print('通过 GridSearchCV 获得的最佳 MSE: ', scores)
print('我对以上两个输出的不同感到困惑。为什么它们会不同?')
print('最佳参数: ',grid.best_params_)
print('-'*120)
print('mean_test_score 实际上是 mean_valid_score')
report = pd.DataFrame(grid.cv_results_)
# 如果 test 为 True,则在测试集上部署最佳参数
if test == True:
my_model = model(**grid.best_params_)
my_model.fit(X_train, y_train)
predictions = my_model.predict(X_test)
mse = mean_squared_error(y_test, predictions)
print('使用最佳参数的测试 MSE: ', mse)
print('-'*120)
return report[['mean_train_score', 'mean_test_score']]
回答:
更新
如 scikit-learn 文档 中所解释的,GridSearchCV 会尝试您传递的所有参数列表的所有可能组合,以找到最佳参数。
为了评估哪些是最佳参数,它会为每个参数组合计算 k 折交叉验证。在 k 折交叉验证 中,训练集被分为训练集和验证集(这是一个测试集)。例如,如果您选择 cv=5
,数据集将被分割成 5 个不重叠的折,每个折都被用作验证集,而其他所有折都被用作训练集。因此,GridSearchCV 在示例中会为每个参数组合计算 5 个折的平均验证分数(可以是准确率或其他指标)。然后,在 GridSearchCV 结束时,每个参数组合都会有一个平均验证分数,而具有最高平均验证分数的参数组合会被返回。因此,与最佳参数相关的平均验证分数被存储在 grid.best_score_
变量中。
另一方面,grid.score(X_valid, y_valid)
方法在给定数据上给出分数,如果估计器已被重新拟合 (refit=True)
。这意味着它不是 5 个折的平均准确率,而是取具有最佳参数的模型,并使用训练集进行训练。然后,在 X_valid
上计算预测,并与 y_valid
进行比较以获得分数。