GridSearchCV 与 RandomizedSearchCV 调参

  好久没写博客了,原因是最近比较忙,一下报了两个比赛,今天终于最后一个比赛的初赛都结束了,抽点小空赶紧总结一下,先汇报下成绩吧。IJCAI2018 阿里妈妈广告算法大赛,初赛第六。FASHIONAI属性识别大赛初赛25 。复赛加油,争取取得更好的成绩。

   昨天和前天都加班调参了,但是由于是新手,所以遇到很多困难,刚好看到一片博客,关于调参的,所以这里我就引过来,以备后面查阅和使用的方便,如果有侵权,请联系我。

   当使用一些大规模集成的算法时,参数的问题就出来了,比如说 XGBoost的参数大概在20个左右,GBDT的参数个数也在同一个级别,这种时候,会调参和不会调参在同样的数据集上效果可能就是两码事了。这里借着做阿里天池大赛的机会和大家分享一些使用sklearn里封装好的函数 GridSearchCV 与 RandomizedSearchCV 进行调参的方法和技巧,分类器就以常用的XGBoostClassifier为例 

这里主要介绍一下这两个函数的应用

网格搜索:GridSearchCV

随机搜索:RandomizedSearchCV

GridSearchCV

    GridSearchCV的名字其实可以拆分为两部分,GridSearch和CV,即网格搜索和交叉验证。 
这两个概念都比较好理解,网格搜索,搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数,这其实是一个循环和比较的过程。 
GridSearchCV可以保证在指定的参数范围内找到精度最高的参数,但是这也是网格搜索的缺陷所在,它要求遍历所有可能参数的组合,在面对大数据集和多参数的情况下,非常耗时。这也是我通常不会使用GridSearchCV的原因,一般会采用后一种RandomizedSearchCV随机参数搜索的方法。

交叉验证的概念也很简单

· 将训练数据集划分为K份,K一般为10
· 依次取其中一份为验证集,其余为训练集训练分类器,测试分类器在验证集上的精度 
· 取K次实验的平均精度为该分类器的平均精度

           网格搜索就是利用交叉验证的形式比较每一个参数下训练器的精度的,但是交叉验证也要求大量的计算资源,加重了网格搜索的搜索时间

接下来以阿里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)
#输出最优训练器的精度
print(grid.best_score_)
这里关于网格搜索的几个参数再说明一下,评分参数“scoring“,需要根据实际的评价标准设定,阿里的IJCAI的标准是’neg_log_loss’,所以这里设定的是’neg_log_loss’,sklearn中备选的评价标准有一下:

在一些情况下,sklearn中没有现成的评价函数,sklearn是允许我们自己的定义的,但需要注意格式,接下来给个例子

import numpy as np
from sklearn.metrics 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=False)
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
from sklearn.grid_search import RandomizedSearchCV


#导入训练数据
traindata = pd.read_csv("/traindata.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)
        }

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

不过建议还是使用随机的搜索。










  • 40
    点赞
  • 199
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
### 回答1: GridSearchCV是一种用于调参的方法,可以用于随机森林模型的调参。通过GridSearchCV,可以对随机森林模型的各个参数进行网格搜索,找到最优的参数组合,从而提高模型的性能和准确度。常见的随机森林参数包括n_estimators、max_depth、min_samples_split、min_samples_leaf等。在使用GridSearchCV进行调参时,需要指定参数的取值范围,以及评价指标等。 ### 回答2: 随机森林是一种基于决策树的集成式学习算法。在使用随机森林进行建模的时候,对于超参数的调整就显得尤为重要,因为正确地调整超参数可以显著提高模型的性能。而在调参的过程中,通常会使用GridSearchCV交叉验证来优化超参数。 首先,需要准备出一些可能会影响随机森林性能的参数,这些参数包括n_estimators(决策树个数),max_depth(最大深度),min_samples_split(节点分裂最少样本数),min_samples_leaf(叶子节点最少样本数)和max_features(最大特征数)等。 接下来,可以使用GridSearchCV函数进行调参,步骤如下: 1. 定义一个随机森林模型:rfc = RandomForestClassifier()。 2. 定义一个参数范围:param_grid = {'n_estimators': [50, 100, 150], 'max_depth': [10, 20, 30], 'min_samples_split': [2, 3, 4], 'min_samples_leaf': [1, 2], 'max_features': ['sqrt', 'log2']}。 3. 初始化GridSearchCV对象:grid_search = GridSearchCV(estimator=rfc, param_grid=param_grid, cv=5)。 4. 对模型进行训练:grid_search.fit(X_train, y_train)。 5. 查看最佳参数:grid_search.best_params_。 6. 查看最佳模型得分:grid_search.best_score_。 调参过程中需要注意以下几点: 1. 参数范围不要设置过宽,否则会造成计算量大和过拟合的问题,一般不超过3个参数,每个参数不要超过3个值。 2. 选择合适的交叉验证方式,一般选取5折或10折交叉验证。 3. 通过GridSearchCV得到的最佳参数并不一定是最优参数,需要进一步调整和优化。 通过以上步骤,就可以较为便捷地进行随机森林的调参。在实际应用中,如果发现模型的预测性能不尽如人意,可以再次使用类似的方法对模型进行进一步的优化。 ### 回答3: 随机森林是一种强大的机器学习算法,可用于分类和回归问题。对于一个随机森林模型,有一些超参数可以调整,包括n_estimators、max_features、max_depth等等。为了找到最佳的超参数组合,我们可以使用GridSearchCV函数。 GridSearchCV基本上是一种通过交叉验证来搜索最佳参数组合的方法。在随机森林中,我们可以定义一个参数网格,包含我们想要调整每个超参数的值。然后,我们运行GridSearchCV函数,定义模型和网格,将其拟合到我们的数据集中。 在引入GridSearchCV之前,我们需要对数据进行处理。 首先,我们需要将数据拆分为训练集和测试集。 训练集用于训练模型,并且测试集用于评估模型的性能。其次,我们需要对数据进行缩放和标准化。当我们使用随机森林时,我们不必将每个特征都缩放到相同的范围内,因为随机森林不受特征缩放的影响。 有了这些预处理,我们可以引入GridSearchCV。我们可以定义一个随机森林分类器,并为每个重要的超参数定义一个值集合,然后使用GridSearchCV来尝试这些不同的超参数组合。 通过使用GridSearchCV来查找最佳超参数组合,我们可以显著提高我们模型的准确性和精度。这是一个快速且有效的方法,可以帮助我们优化我们的模型以便更好地适应我们的数据集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

juezhanangle

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值