如何在没有交叉验证的情况下运行网格搜索?
Posted
技术标签:
【中文标题】如何在没有交叉验证的情况下运行网格搜索?【英文标题】:How to run gridsearch without cross validation? 【发布时间】:2021-10-13 14:54:17 【问题描述】:我正在尝试运行网格搜索,其中模型将在我的训练集上进行训练,并仅在预设的验证集上进行测试(根据手稿审阅者的要求)。
我已将我的数据分解为训练组、验证组和测试组,并将使用验证组进行训练和调整,并使用测试组测试最终模型。我认识到 GridSearchCV 是理想的,但我需要执行没有 CV 方面的网格搜索。
ex_parameters_to_be_tuned =
'learning_rate' : [0.1, 0.01, 0.001,0.0001],
'subsample' : [0.25, 0.50, 0.75, 1]
model = lgb.LGBMRegressor(objective = 'Regression', metric = 'rmse', boosting = 'gbdt')
#####Need to switch this to not CV and make it so it trains on "training data" and tests on "validation data"
grid = GridSearchCV(estimator = model, param_grid=ex_parameters_to_be_tuned, scoring = 'neg_root_mean_squared_error')
grid.fit(X_valid, y_valid)
print('best score:', grid.best_score_)
print('best param:', grid.best_params_)
我希望它是这样的
grid.fit(X_train, y_train)
grid.test(X_valid, y_valid)
如何在没有 CV 的情况下仅使用训练和验证数据进行网格搜索?
【问题讨论】:
你用谷歌搜索过你的问题吗? ***.com/questions/29503689/… 我做到了,但这似乎没有回答我的问题,即如何在我的训练数据集上使用我的拟合模型,然后在预先指定的验证数据集上对其进行测试。 这个似乎好一点:***.com/a/34625341/10475762。只需创建一个参数网格并循环。它不会是单行的,但应该可以完成这项工作。 这不是个坏主意吗..?由于您随后两次使用相同的数据。你这样做的动机是什么?审查的出版物是什么? 我们不会两次使用相同的数据。验证队列将仅用于超参数优化,然后将使用单独的测试队列来评估模型。本质上,这在概念上与使用带有 CV 的训练数据集进行超参数优化以及在单独的测试数据集上进行测试在概念上相同。如果您的理解不正确,请说明 【参考方案1】:我能想到的最简单的方法是将训练、验证(和测试)群组保存在同一个数据集中(例如,X
用于特征,y
用于标签)并指定相应的索引用于拟合和验证估计器的数据点。
例如,假设您的训练样本索引位于 train_indices
中,验证样本的索引位于 validation_indices
中。然后您可以将它们作为包装在列表中的元组传递给GridSearchCV
的cv
参数。
ex_parameters_to_be_tuned =
'learning_rate' : [0.1, 0.01, 0.001, 0.0001],
'subsample' : [0.25, 0.50, 0.75, 1]
model = lgb.LGBMRegressor(objective = 'Regression', metric = 'rmse', boosting = 'gbdt')
cv = [(train_indices, validation_indices)]
grid = GridSearchCV(estimator = model, param_grid=ex_parameters_to_be_tuned, cv=cv, scoring = 'neg_root_mean_squared_error')
grid.fit(X, y)
print('best score:', grid.best_score_)
print('best param:', grid.best_params_)
这将始终在相同样本上训练和验证估计器。
【讨论】:
以上是关于如何在没有交叉验证的情况下运行网格搜索?的主要内容,如果未能解决你的问题,请参考以下文章