交叉验证与网格搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交叉验证与网格搜索相关的知识,希望对你有一定的参考价值。

参考技术A 交叉验证与网格搜索是机器学习中的两个非常重要且基本的概念,但是这两个概念在刚入门的时候并不是非常容易理解与掌握,自己开始学习的时候,对这两个概念理解的并不到位,现在写一篇关于交叉验证与网格搜索的文章,将这两个基本的概念做一下梳理。

网格搜索(Grid Search)名字非常大气,但是用简答的话来说就是你手动的给出一个模型中你想要改动的所用的参数,程序自动的帮你使用穷举法来将所用的参数都运行一遍。决策树中我们常常将最大树深作为需要调节的参数;AdaBoost中将弱分类器的数量作为需要调节的参数。

为了确定搜索参数,也就是手动设定的调节的变量的值中,那个是最好的,这时就需要使用一个比较理想的评分方式(这个评分方式是根据实际情况来确定的可能是accuracy、f1-score、f-beta、pricise、recall等)

有了好的评分方式,但是只用一次的结果就能说明某组的参数组合比另外的参数组合好吗?这显然是不严谨的,上小学的时候老师就告诉我们要求平均��。所以就有了交叉验证这一概念。下面以K折交叉验证为例介绍这一概念。

————————————————

原文链接:https://blog.csdn.net/sinat_32547403/article/details/73008127

如何在没有交叉验证的情况下运行网格搜索?

【中文标题】如何在没有交叉验证的情况下运行网格搜索?【英文标题】: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 中。然后您可以将它们作为包装在列表中的元组传递给GridSearchCVcv 参数。

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_)

这将始终在相同样本上训练和验证估计器。

【讨论】:

以上是关于交叉验证与网格搜索的主要内容,如果未能解决你的问题,请参考以下文章

libsvm交叉验证与网格搜索(参数选择)

Scikit learn 中的交叉验证与网格搜索

我是不是需要同时执行网格搜索(使用交叉验证)和交叉验证方法?

机器学习交叉验证和网格搜索

交叉验证和网格搜索有啥区别?

机器学习交叉验证和网格搜索案例分析