Grid SearchCV(网格搜索)与RandomizedSearchCV (随机搜索)

本文详细介绍了GridSearchCV和RandomizedSearchCV这两种超参数调优方法在机器学习中的应用。从概念、工作原理到实际代码示例,包括随机森林、Xgboost和SVR的调参实例。文章讨论了这两种方法的优缺点,以及如何通过交叉验证改进调参过程。最后,提到了并行化超参数搜索和两种搜索方法的比较,强调了RandomizedSearchCV在大数据集上的效率优势。
摘要由CSDN通过智能技术生成

一、引言

在机器学习模型中,需要人工选择的参数称为超参数。比如随机森林中决策树的个数,人工神经网络模型中隐藏层层数和每层的节点个数,正则项中常数大小等等,他们都需要事先指定。超参数选择不恰当,就会出现欠拟合或者过拟合的问题。而在选择超参数的时候,有两个途径,一个是凭经验微调,另一个就是选择不同大小的参数,带入模型中,挑选表现最好的参数。

微调的一种方法是手工调制超参数,直到找到一个好的超参数组合,这么做的话会非常冗长,你也可能没有时间探索多种组合,所以可以使用Scikit-Learn的GridSearchCV来做这项搜索工作。

二、为什么叫网格搜索(GridSearchCV)

GridSearchCV的名字其实可以拆分为两部分,GridSearch和CV,即网格搜索和交叉验证。这两个名字都非常好理解。网格搜索,搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数,这其实是一个训练和比较的过程。

GridSearchCV可以保证在指定的参数范围内找到精度最高的参数,但是这也是网格搜索的缺陷所在,他要求遍历所有可能参数的组合,在面对大数据集和多参数的情况下,非常耗时。

三、什么是Grid Search网格搜索

Grid Search:一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找到最大值。这种方法的主要缺点是比较耗时!

所以网格搜索适用于三四个(或者更少)的超参数(当超参数的数量增长时,网格搜索的计算复杂度会呈现指数增长,这时候则使用随机搜索),用户列出一个较小的超参数值域,这些超参数至于的笛卡尔积(排列组合)为一组组超参数。网格搜索算法使用每组超参数训练模型并挑选验证集误差最小的超参数组合。

简单直白说:

指定不同的超参数列表进行暴力穷举搜索,并计算评估每个参数组合对模型性能的影响,从而获得超参数的最优组合,例如我们对rbf kernel SVM进行训练,超参数有C与gamma,这两个超参数有不同的list,并一一组合进行训练及评估,最终调用GridSearchCV的best_params_获得最好的超参数组合。就是参数排列组合,输入模型得出结果,然后得出效果最好的模型

 四、用代码具体讲解

4.1 以随机森林为例说明GridSearch网格搜索

下面代码,我们要搜索两种网格,一种是n_estimators,一种是max_features。GridSearch会挑选出最适合的超参数值。

from sklearn.model_selection import GridSearchCV
param_grid = [
        {'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]},
        {'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},
]
 
forest_reg = RandomForestRegressor()
grid_search = GridSearchCV(forest_reg, param_grid, cv=5,
                          scoring='neg_mean_squared_error')
 
grid_search.fit(housing_prepared, housing_labels)

sklearn 根据param_grid的值,首先会评估3×4=12种n_estimators和max_features的组合方式,接下来在会在bootstrap=False的情况下(默认该值为True),评估2×3=6种12种n_estimators和max_features的组合方式,所以最终会有12+6=18种不同的超参数组合方式,而每一种组合方式要在训练集上训练5次(因为cv=5), 所以一共要训练18×5=90 次,当训练结束后,你可以通过best_params_获得最好的组合方式。

grid_search.best_params_输出结果如下:

# grid_search.best_params_输出结果如下:

{‘max_features’: 8, ‘n_estimators’: 30}

得到最好的模型:

RandomForestRegressor(bootstrap=True, criterion=‘mse’, max_depth=None,
max_features=8, max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
n_estimators=30, n_jobs=1, oob_score=False, random_state=None,
verbose=0, warm_start=False)

小结:

如果GridSearchCV初始化时,refit=True(默认的初始化值),在交叉验证时,一旦发现最好的模型(estimator),将会在整个训练集上重新训练,这通常是一个好主意,因为使用更多的数据集会提升模型的性能。

以上面有两个参数的模型为例,参数a有3中可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历,搜索,所以叫grid search。

4.2 以Xgboost为例说明GridSearch网格搜索

下面以阿里IJCAI广告推荐数据集与XgboostClassifier分类器为例,用代码形式说明sklearn中GridSearchCV的使用方法。(此小例的代码是参考这里:请点击我

import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.grid_search import GridSearchCV
  
  
#导入训练数据
traindata = pd.read_csv("/traindata_4_3.txt",sep = ',')
traindata = traindata.set_index('instance_id')
trainlabel = traindata['is_trade']
del traindata['is_trade']
print(traindata.shape,trainlabel.shape)
  
  
#分类器使用 xgboost
clf1 = xgb.XGBClassifier()
  
#设定网格搜索的xgboost参数搜索范围,值搜索XGBoost的主要6个参数
param_dist = {
        'n_estimators':range(80,200,4),
        'max_depth':range(2,15,1),
        'learning_rate':np.linspace(0.01,2,20),
        'subsample':np.linspace(0.7,0.9,20),
        'colsample_bytree':np.linspace(0.5,0.98,10),
        'min_child_weight':range(1,9,1)
        }
 
 
#GridSearchCV参数说明,clf1设置训练的学习器
#param_dist字典类型,放入参数搜索范围
#scoring = 'neg_log_loss',精度评价方式设定为“neg_log_loss“
#n_iter=300,训练300次,数值越大,获得的参数精度越大,但是搜索时间越长
#n_jobs = -1,使用所有的CPU进行训练,默认为1,使用1个CPU
grid = GridSearchCV(clf1,param_dist,cv = 3,scoring = 'neg_log_loss',n_iter=300,n_jobs = -1)
  
#在训练集上训练
grid.fit(traindata.values,np.ravel(trainlabel.values))
#返回最优的训练器
best_estimator = grid.best_estimator_
print(best_estimator)   #输出最优训练器的精度

这里关于网格搜索的几个参数在说明一下,评分参数“scoring”&

  • 16
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是在XGBoost中使用随机搜索网格搜索对所有数据进行超参数调整的代码: ```python import xgboost as xgb from sklearn.model_selection import RandomizedSearchCV, GridSearchCV from scipy.stats import uniform # Load data X, y = ... # Define parameter grid for grid search param_grid = { 'max_depth': [3, 5, 7], 'learning_rate': [0.1, 0.01, 0.001], 'n_estimators': [100, 500, 1000], 'gamma': [0, 0.1, 0.01], 'subsample': [0.8, 0.9, 1], 'colsample_bytree': [0.8, 0.9, 1] } # Define parameter distribution for random search param_dist = { 'max_depth': [3, 5, 7], 'learning_rate': uniform(loc=0.001, scale=0.1), 'n_estimators': [100, 500, 1000], 'gamma': uniform(loc=0, scale=0.1), 'subsample': uniform(loc=0.8, scale=0.2), 'colsample_bytree': uniform(loc=0.8, scale=0.2) } # Define XGBoost model xgb_model = xgb.XGBRegressor() # Perform grid search grid_search = GridSearchCV(estimator=xgb_model, param_grid=param_grid, cv=5, n_jobs=-1) grid_search.fit(X, y) # Print best parameters and score print("Best parameters: ", grid_search.best_params_) print("Best score: ", grid_search.best_score_) # Perform random search random_search = RandomizedSearchCV(estimator=xgb_model, param_distributions=param_dist, cv=5, n_jobs=-1) random_search.fit(X, y) # Print best parameters and score print("Best parameters: ", random_search.best_params_) print("Best score: ", random_search.best_score_) ``` 首先,我们加载数据。然后,我们定义了一个参数网格和参数分布,用于网格搜索随机搜索。然后,我们定义了XGBoost模型,并使用GridSearchCVRandomizedSearchCV执行网格搜索随机搜索。最后,我们打印出最佳参数和分数。 在这个示例中,我们使用了几个常见的参数,但可以根据需要进行调整。请注意,这些搜索可能需要一段时间来运行,具体取决于数据集的大小和所选择的参数范围。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胡同1991

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值