1、背景目的
在机器学习模型中,需要人工选择的参数称为超参数。比如随机森林中决策树的个数,人工神经网络模型中隐藏层层数和每层的节点个数,正则项中常数大小等等,他们都需要事先指定。超参数选择不恰当,就会出现欠拟合或者过拟合的问题。而在选择超参数的时候,有两个途径,一个是凭经验微调,另一个就是选择不同大小的参数,带入模型中,挑选表现最好的参数。
微调的一种方法是手工调制超参数,直到找到一个好的超参数组合,这么做的话会非常沉长,你也可能没有时间探索多种组合,所以可以使用Scikit-Learn的GridSearchCV来做这项搜索工作
2、定义
GridSearchCV的名字其实可以拆分为两部分,GridSearch和CV,即网格搜索和交叉验证。这两个名字都非常好理解。网格搜索,搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数,这其实是一个训练和比较的过程。
GridSearchCV可以保证在指定的参数范围内找到精度最高的参数,但是这也是网格搜索的缺陷所在,他要求遍历所有可能参数的组合,在面对大数据集和多参数的情况下,非常耗时
什么是GridSearch
Grid Search:一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找到最大值。这
种方法的主要缺点是比较耗时!
所以网格搜索适用于三四个(或者更少)的超参数(当超参数的数量增长时,网格搜索的计算复杂度会呈现指数增长,这时候则使用随机搜索),用户列出一个较小的超参数值域,这些超参数至于的笛卡尔积(排列组合)为一组组超参数。网格搜索算法使用每组超参数训练模型并挑选验证集误差最小的的超参数组合
3、举例
以随机森林为例说明GridSearch网格搜索
from sklearn.model_selection import GridSearchCV
from sklearn import RandomForestRegressor
param_grid = [
{'n_estimators': [3,10, 30],
'max_features':[2,3,4]},
{'bootstrap': [False],
'n_estimators': [3, 10],
'max_features': [2,4,6,8]},
]
forest_reg = RandomForestRegressor()
grid_search=GridSearchCV(forest_reg, param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(housing_prepared, housing_labels)
grid_search.best_params_
# 输出结果如下:
# {'max_features': 8, 'n_estimators': 30}
# 得到最好的模型
# grid_search.best_estimator_
- sklearn根据param_grid的值
- 首先会评估3×4=12种n_estimators和max_features的组合方式
- 接下来在会在bootstrap=False的情况下(默认该值为True),评估2x3=6种n_estimators和max_features的组合方式
- 最终会有12+6=18种不同的超参数组合方式
- 而每一种组合方式要在训练集上训练5次,所以一共要训练188x5=90次
- 当训练结束后,你可以通过best_params_获得最好的组合方式
# 随机森林
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、RandomizedSearchCV--(随机搜索)
我们在搜索超参数的时候,如果超参数个数较少(三四个或者更少),那么我们可以采用网格搜索,一种穷尽式的搜索方法。但是当超参数个数比较多的时候,我们仍然采用网格搜索,那么搜索所需时间将会指数级上升
- RandomizedSearchCV使用方法和类GridSearchCV很相似,但他不是尝试所有可能的组合,而是通过选择每一个超参数的一个随机值的特定数量的随机组合,这个方法有两个优点
- 如果你让随机搜索运行,比如1000次,它会探索每个超参数的1000个不不同的值(而不是像网格搜索那样,只搜索每个超参数的几个值)
- 你可以方便的通过设定搜索次数,控制超参数搜索的计算量
RandomizedSearchCV的使用方法其实是和GridSearchCV一致的,但它以随机在参数空间中采样的方式代替了GridSearchCV对于于参数的网格搜索,在对于有连续变量的参数时,RandomizedSearchCV会将其当做一个分布进行采样进行这是网格搜索做不到的,它的搜索能力取决于设定的n_iter参数
5、函数参数说明
sklearn.model_selection.GridSearchCV(estimator,
param_grid,
scoring=None,
fit_params=None,
n_jobs=None,
iid='warn',
refit=True,
CV='warn',
verbose=0,
pre_dispatch=2*n_jobs,
error_score='raise-deprecating',
return_train_score='warn')
- estimator:选择使用的分类器,并且传入除需要确定最佳的参数之外的的其他参数。
- 每一个分类器都需要一个scoring参数,或者score方法:
- 如estimator = RandomForestClassifier(min_sample_split=100,1min_samples_leaf = 20,max_depth = 8,max_features = 'sqrt' , raandom_state=10
- param_grid:需要最优化的参数的取值,值为字典或者列表,例如:paaram_grid = param_test1, param_test1 = {'n_estimators' : range(10,71,110}}
- scoring - None:模型评价标准,默认为None,这时需要使用score函数;或者如scoring='roc_auc',根据所选模型不同,评价准则不同,字符串(函数名),或是可调用对
- 象,需要其函数签名,形如:scorer(estimator,X,y);如果是None,则使用estimator的误差估计函数
- fit_paras = None
- n_jobs=1:n_jobs:并行数,int:个数,-1:跟CPU核数一致,1:默认值
- iid=True:iid:默认为True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。
- refit=True:默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可能的训练集与开发集进行,作为最终月用于性能评估的最佳模型参数。即在搜索参数结束
- 后,用最佳参数结果再次fit一遍全部数据集
- cv=None:交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器
- verbose = 0 scoring = None
- verbose:日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出
- pre_dispatch='2*njobs':指定总共发的并行任务数,当njobs大于1时候,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_ddispatch参数,则可以预先划分总
- 共的job数量,使数据最多被复制pre_dispatch次
进行预测常用方法和属性
- grid.fit():运行网格搜索
- grid_scores:给出不同参数情况下的评价结果
- best_params:描述了已取得最佳结果的参数的组合
- best_score_:提供优化过程期间观察到的最好的评分
- cv_results :具体用法模型不同参数下交叉验证的结果
GridSearchCV属性说明
- cv_results:具体用法模型不同参数下交叉验证的结果
- ·具有键作为列标题和值作为列的dict,可以导入到DataFrame中。注意,"params"键用于存储所有参数候选项的参数设置列表
- best_estimator : estimator
- 通过搜索选择的估计器,即在左侧数据上给出最高分数(或指定的的最小损失)的估计器。如果refit=False,则不可用。
- best_score_:float best_estimator的分数
- best_parmas_:dict在保存数据上给出最佳结果的参数设置
- best_index:int对应于最佳候选参数设置的索引(cv_ressults_数组)
- search.cv_results_['params'][search.best_index_j中的dict给出了量最佳模型的参数设置,给出了最高的平均分数(search.best_score_)
- scorer : function
- Scorer function used on the held out data to choose thee best parameters for the model