在 scikit-learn 包中提供了两种采样搜索候选的通用方法:对于给定的值, GridSearchCV 考虑了所有参数组合;而 RandomizedSearchCV 可以从具有指定分布的参数空间中抽取给定数量的候选。
GridSearchCV()
提供的网格搜索从通过 param_grid
参数确定的网格参数值中全面生成候选。比如下面代码的’n_estimators’的取值[700,650],指的是从这两个当中选一个,而不是范围搜索。
其返回值是一个类,我们可以通过调用其中的方法best_score_
获得其中最好的一个评估其的得分,通过使用best_params_
获得最优估计器的所采用的参数。
需要注意的是GridSearchCV()中的参数scoring,默认的是评估器的评分标准,在实际应用中应该自行进行选择。具体的scoring常用方法可见Metrics and scoring
网格搜索方法确实比较耗时,并不适用于大量超参数的调试。
params_grid = {'n_estimators':[700,650],#最优为700
'max_depth':[9,8],#增大该值,模型复杂,容易过拟合,最优为9
'min_child_weight':[1,2],#越大算法越保守,最优为1
'subsample':[0.5,0.8,1],#防止过拟合(0,1],最优为1
'colsample_bytree':[0.9,1],#默认为1,最优为0.9
'gamma':[0.02,0.05,0.01],#越大算法越保守,最优为0,05
'reg_alpha':[0.04,0.03,0.05],#L1 正则项,越大越保守,默认为0
'reg_lambda':[2,1],#L2 正则项,越大越保守,默认为1,最优为1
'learning_rate':[0.07,0.06]}#最优为0.07
# 网格搜索
crossed_xgb = GridSearchCV(model_xgb, params_grid, cv = 5)
start = time()
crossed_xgb.fit(X_train, y_train)
print(70*'=')
print('GridSearch takes : %.4f seconds.' %(time()-start))
print('XGB best score is :' , crossed_xgb.best_score_)
print('XGB best parameters are:', crossed_xgb.best_params_)
print('\n')
尽管使用参数设置的网格法是目前最广泛使用的参数优化方法, 其他搜索方法也具有更有利的性能。 RandomizedSearchCV 实现了对参数的随机搜索, 其中每个设置都是从可能的参数值的分布中进行取样。 这对于穷举搜索有两个主要优势:
可以选择独立于参数个数和可能值的预算
添加不影响性能的参数不会降低效率
随机搜索相比于网格搜索耗时更短,且能够在给定范围内进行搜索。
# 随机搜索最优参数
params_rand = {'n_estimators':range(600,1000,20),#最优为700
'max_depth':range(6,15,1),#增大该值,模型复杂,容易过拟合,最优为9
'min_child_weight':range(1,4,1),#越大算法越保守,最优为1
'subsample':np.linspace(0.4,1,5),#防止过拟合(0,1],最优为1
'colsample_bytree':np.linspace(0.6,1,5),#默认为1,最优为0.9
'gamma':np.linspace(0.03,0.06,5),#越大算法越保守,最优为0,05
'reg_alpha':np.linspace(0.02,0.07,5),#L1 正则项,越大越保守,默认为0
'learning_rate':np.linspace(0.02,0.12,10)}#最优为0.07
randomed_xgb = RandomizedSearchCV(model_xgb, params_rand, cv=5, n_iter = 300)
start = time()
randomed_xgb.fit(X_train,y_train)
print(70*'=')
print('RandomizedSearch takes : %.4f seconds.' %(time()-start))
print('XGB best score is :' , randomed_xgb.best_score_)
print('XGB best parameters are:', randomed_xgb.best_params_)
print('\n')
Python机器学习笔记 Grid SearchCV(网格搜索)
GridSearchCV 与 RandomizedSearchCV 调参
XGboost进行回归预测
XGBoost调参步骤该方法是对参数逐个调整,但是单个参数的最优应该并不能够代表组合参数的最优。
======================================================================
GridSearch takes : 800.2113 seconds.
XGB best score is : 0.845074453713116
XGB best parameters are: {'colsample_bytree': 0.9, 'gamma': 0.05, 'learning_rate': 0.07, 'max_depth': 9, 'min_child_weight': 1, 'n_estimators': 650, 'reg_alpha': 0.04, 'reg_lambda': 2, 'subsample': 1}
======================================================================
RandomizedSearch takes : 449.9927 seconds.
XGB best score is : 0.8436833585020892
XGB best parameters are: {'subsample': 1.0, 'reg_alpha': 0.0325, 'n_estimators': 820, 'min_child_weight': 1, 'max_depth': 12, 'learning_rate': 0.05333333333333333, 'gamma': 0.0375, 'colsample_bytree': 0.8}
EV MAE MSE R2
Train 0.993424 0.344370 0.192480 0.993424
Test 0.939638 1.133629 2.242079 0.932443