我正在网格搜索设置中使用 K 折交叉验证来进行超参数调整。我有几个关于如何训练和评估模型的问题:
当我使用
GridSearchCV
时,模型会通过多个折叠(假设为 10 个)进行评估。对于每个超参数组合,模型在 ( K-1 ) 次折叠上进行训练,并在剩余的折叠上进行验证。当我在网格搜索后获得 best_grid
模型时,该模型是在哪些特定训练数据(即哪些折叠)上进行训练的?
当我调用
best_grid.predict(X_test)
时,该模型在哪个数据集上进行预测?网格搜索后是否在整个数据集上进行了训练,或者仍然基于交叉验证期间使用的折叠?
如果
best_grid
模型尚未在整个数据集上进行训练,我是否需要在进行预测之前再次显式地将其拟合到完整数据集?
我想获得 R² 训练分数,但我对使用以下代码时收到的分数感到困惑:
param_grid = {f'regressor__regressor__{param}': values for param, values in model_info['params'].items()}
grid_search = GridSearchCV(full_pipeline, param_grid, cv=stratified_kf.split(X, y_binned), scoring="r2", n_jobs=4, return_train_score=True)
grid_search.fit(X,y)
if grid_search.best_score_ > best_score:
best_score = grid_search.best_score_
best_model = model_name
best_grid = grid_search
mean_train_score = best_grid.cv_results_['mean_train_score'][best_grid.best_index_] #
print(mean_train_score) # THIS THING HERE
您拥有的代码返回训练集上的 R2 分数。它存在于
cv_results_
,如 mean_train_score
等
意识到
grid_search
对象会为您跟踪最佳分数和最佳参数,您不需要 if
块。
grid_search
对象是一个估计器,最终会与您提供的所有数据上的最佳参数(根据折叠网格搜索)进行拟合(在您的情况下是X
和
y
)。这是因为默认情况下,
refit=True
。因此,当您执行
predict
时,您将获得由网格搜索确定的最佳模型。 (此型号也可用作
grid_search.best_estimator_
。)如果您这样做
grid_search.predict(X_test)
那么您正在预测
X_test
。所以希望这些数据不是
X
的一部分。请记住在生产中使用之前将您的最佳模型重新调整为
绝对所有您的数据! (也就是说,结合 X
和
X_test
来拟合最佳模型。)