GridSearchCV与RandomizedSearchCV调参
好久没写博客了,原因是最近⽐较忙,⼀下报了两个⽐赛,今天终于最后⼀个⽐赛的初赛都结束了,抽点⼩空赶紧总结⼀下,先汇报下成绩吧。IJCAI2018 阿⾥妈妈⼴告算法⼤赛,初赛第六。FASHIONAI属性识别⼤赛初赛25 。复赛加油,争取取得更好的成绩。
昨天和前天都加班调参了,但是由于是新⼿,所以遇到很多困难,刚好看到⼀⽚博客,关于调参的,所以这⾥我就引过来,以备后⾯查阅和使⽤的⽅便,如果有侵权,请联系我。
当使⽤⼀些⼤规模集成的算法时,参数的问题就出来了,⽐如说 XGBoost的参数⼤概在20个左右,GBDT的参数个数也在同⼀个级别,这种时候,会调参和不会调参在同样的数据集上效果可能就是两码事了。这⾥借着做阿⾥天池⼤赛的机会和⼤家分享⼀些使⽤sklearn⾥封装好的函数 GridSearchCV 与 RandomizedSearchCV 进⾏调参的⽅法和技巧,分类器就以常⽤的XGBoostClassifier为例
这⾥主要介绍⼀下这两个函数的应⽤
⽹格搜索:
随机搜索:
GridSearchCV
GridSearchCV的名字其实可以拆分为两部分,GridSearch和CV,即⽹格搜索和交叉验证。
这两个概念都⽐较好理解,⽹格搜索,搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利⽤调整的参数训练学习器,从所有的参数中找到在验证集上精度最⾼的参数,这其实是⼀个循环和⽐较的过程。
GridSearchCV可以保证在指定的参数范围内找到精度最⾼的参数,但是这也是⽹格搜索的缺陷所在,它要求遍历所有可能参数的组合,在⾯对⼤数据集和多参数的情况下,⾮常耗时。这也是我通常不会使⽤GridSearchCV的原因,⼀般会采⽤后⼀种RandomizedSearchCV随机参数搜索的⽅法。
2023年高考
交叉验证的概念也很简单
· 将训练数据集划分为K份,K⼀般为10
· 依次取其中⼀份为验证集,其余为训练集训练分类器,测试分类器在验证集上的精度
· 取K次实验的平均精度为该分类器的平均精度
⽹格搜索就是利⽤交叉验证的形式⽐较每⼀个参数下训练器的精度的,但是交叉验证也要求⼤量的计算资源,加重了⽹格搜索的搜索时间
接下来以阿⾥IJCAI⼴告推荐数据集与XGBoostClassifier分类器为例,⽤代码的形式说明sklearn中GridSearchCV的使⽤⽅法
import numpy as np
import pandas as pd
import xgboost as xgb
学习面包id_arch import GridSearchCV
#导⼊训练数据
traindata = pd.read_csv("/traindata_",p = ',')
traindata = traindata.t_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)
#输出最优训练器的精度
print(grid.best_score_)
这⾥关于⽹格搜索的⼏个参数再说明⼀下,评分参数“scoring“,需要根据实际的评价标准设定,阿⾥的IJCAI的标准是’neg_log_loss’,所以这⾥设定的是’neg_log_loss’,sklearn中备选的评价标准有⼀下:
在⼀些情况下,sklearn中没有现成的评价函数,sklearn是允许我们⾃⼰的定义的,但需要注意格式,接下来给个例⼦
import numpy as np
ics import make_scorer
def logloss(act, pred):
epsilon = 1e-15
pred = sp.maximum(epsilon, pred)
pred = sp.minimum(1-epsilon, pred)
ll = sum(act*sp.log(pred) + sp.subtract(1, act)*sp.log(sp.subtract(1, pred)))
ll = ll * -1.0/len(act)
return ll
#这⾥的greater_is_better参数决定了⾃定义的评价指标是越⼤越好还是越⼩越好
loss = make_scorer(logloss, greater_is_better=Fal)
score = make_scorer(logloss, greater_is_better=True)
定义好以后,再将其代⼊GridSearchCV函数就好
这⾥再贴⼀下常⽤的集成学习算法⽐较重要的需要调参的参数,供⼤家参考
RandomizedSearchCV
RandomizedSearchCV的使⽤⽅法其实是和GridSearchCV⼀致的,但它以随机在参数空间中采样的⽅式代替了GridSearchCV对于参数的⽹格搜索,在对于有连续变量的参数时,RandomizedSearchCV会将其当作⼀个分布进⾏采样这是⽹格搜索做不到的,它的搜索能⼒取决于设定的n_iter参数,同样的给出代码
import numpy as np
import pandas as pd
import xgboost as xgb
id_arch import RandomizedSearchCV
#导⼊训练数据
traindata = pd.read_csv("/",p = ',')
traindata = traindata.t_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)
}
#RandomizedSearchCV参数说明,clf1设置训练的学习器
#param_dist字典类型,放⼊参数搜索范围
#scoring = 'neg_log_loss',精度评价⽅式设定为“neg_log_loss“
#n_iter=300,训练300次,数值越⼤,获得的参数精度越⼤,但是搜索时间越长
#n_jobs = -1,使⽤所有的CPU进⾏训练,默认为1,使⽤1个CPU
grid = RandomizedSearchCV(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)
#输出最优训练器的精度
print(grid.best_score_)
不过建议还是使⽤随机的搜索。