GBDT调参指南

GBDT分类器和回归器的大部分参数都是相同的,除了损失函数的选项有些不一样,所以下面咱们统一说明各个参数的意义以及在什么情境下作什么调整方法。html

1、GBDT的boosting框架参数node

1.n_estimators:表明弱学习器的最大个数,即最多训练多少棵树。这个值过大致使过拟合,太小致使欠拟合.默认值为100.bash

2.learning_rate:每一个弱学习器都有一个权重参数,默认值0.1,取值范围0-1。 learning_rate和n_estimators同时决定着模型的拟合效果,所以要同时调整,建议从一个小一点的学习率开始。网络

fn(x)=fn-1(x)+l_r*T(n,x)
#即本轮的学习器等于本轮之前的学习器加上学习率乘以本轮获得的弱学习器
复制代码

3.subsample:子采样比例,默认1.0,是不放回的采样,与随机森林的有放回采样不同。若是为1.0,表示每轮采用所有数据生成决策树,容易过拟合,方差容易比较大。可是若是太小,容易形成高误差,因此这个值须要这种,建议0.5-0.8之间。框架

4.init:初始学习器的值,在有必定先验知识的状况下能够本身设定,。可是通常不用。dom

5.loss:损失函数的选择,对于分类和回归是有区别的。ide

分类:可选项有{'deviance','exponential'},"deviance"对数似然损失函数和'exponential'指数损失函数,默认对数似然损失函数,对于二分类以及多分类问题采用对数似然损失函数比较好,这种损失函数用的也比较多。而指数损失函数,让咱们想到的是Adaboost,即改变本轮错误训练的数据在下一轮训练中的权值,使错误分类的样本获得更多重视。函数

回归:可选项有{'ls', 'lad', 'huber', 'quantile'},ls是均方,lad是绝对偏差,学习

huber是抗噪音损失函数,公式为:spa

当残差大于delta,应当采用L1(对较大的异常值不那么敏感)来最小化,而残差小于超参数,则用L2来最小化。本质上,Huber损失是绝对偏差,只是在偏差很小时,就变为平方偏差。它对数据中的异常点没有平方偏差损失那么敏感。它在0也可微分。使用MAE训练神经网络最大的一个问题就是不变的大梯度,这可能致使在使用梯度降低快要结束时,错过了最小点。而对于MSE,梯度会随着损失的减少而减少,使结果更加精确。在这种状况下,Huber损失就很是有用。它会因为梯度的减少而落在最小值附近。比起MSE,它对异常点更加鲁棒。所以,Huber损失结合了MSE和MAE的优势。可是,Huber损失的问题是咱们可能须要不断调整超参数delta。

quantile分箱偏差,须要对训练数据进行分段预测时。

6.alpha:只有loss='huber' 或者 loss='quantile'时,须要指定分位数的值,默认0.9,若是噪音较多,能够提升这个值。

2、弱学习器参数:生成决策树时候的参数

1.max_features:划分时考虑的特征数量。当特征数量并很少,小于50,能够None,即默认使用所有特征。也能够是以下几个。

2.max_depth:每棵子树的深度,默认为3.若是数据量和特征都很少,能够无论这个参数。可是当较大时,建议限制深度,10-100之间。

3.min_samples_split:子树继续划分的条件,默认为2.当一个节点内的样本数量少于该值时,该节点再也不拆分,看成叶节点。当数据量小不用管,数据量大能够增大该值。

4.min_samples_leaf:叶子节点最少的样本数,默认1.若是叶节点的样本数少于该值,会和兄弟节点一块儿被剪纸,至关于不须要对上层的样本再作细分,由于叶节点中只有一个样本,分支意义不大。当数量级大,能够增大这个值。因而可知gbdt生成的树不是彻底二叉树,是有可能出现左右子树高度不一样的状况的。

5.min_weight_fraction_leaf:限制了叶子节点全部样本权重和的最小值。若是小于这个值,则会和兄弟节点一块儿被剪枝。默认是0,即不考虑。若是咱们有较多样本有缺失值,或者分类树样本的分布类别误差很大,就会引入样本权重,这时咱们就要注意这个值了。

6.max_leaf_nodes:最大叶子节点数量,默认为None,在限制的叶节点数以内生成最优决策树,能够防止过拟合。当数量级较大,能够限制这个数。

7.min_impurity_split:最小基尼不纯度,若是某个节点的基尼不纯度小于该值,则再也不划分,视为叶节点,默认1e-7,通常不修改。

3、调参过程

1.先对提高框架内的,迭代次数和学习率作调整,选一个较小的学习率,对迭代次数网格化调餐。

param_test1 = {'n_estimators':range(20,101,10)}
gsearch1 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, min_samples_split=300,
                                  min_samples_leaf=20,max_depth=8,max_features='sqrt', subsample=0.8,random_state=10), 
                       param_grid = param_test1, scoring='roc_auc',iid=False,cv=5)
gsearch1.fit(X,y)
gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_
复制代码

2.接下来对决策树调餐,先一块儿调整max_depth和min_samples_split,根据输出的最优值将max_depth定下俩,后续再调整最小划分样本数。

param_test2 = {'max_depth':range(3,14,2), 'min_samples_split':range(100,801,200)}
gsearch2 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60, min_samples_leaf=20, 
      max_features='sqrt', subsample=0.8, random_state=10), 
   param_grid = param_test2, scoring='roc_auc',iid=False, cv=5)
gsearch2.fit(X,y)
gsearch2.grid_scores_, gsearch2.best_params_, gsearch2.best_score_
复制代码

3.再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一块儿调参。看两者的最优值是否在边界上,若是在边界上,就进一步改变参数范围再网格化调餐。

param_test3 = {'min_samples_split':range(800,1900,200), 'min_samples_leaf':range(60,101,10)}
gsearch3 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60,max_depth=7,
                                     max_features='sqrt', subsample=0.8, random_state=10), 
                       param_grid = param_test3, scoring='roc_auc',iid=False, cv=5)
gsearch3.fit(X,y)
gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_
复制代码

4.再对max_features和subsample进行网格化。

5.最后能够经过,减少学习率,增大迭代次数,增长泛化能力,防止过拟合。保持二者的乘积基本不变,但步长设定太小,会致使拟合效果反而变差,应适当减少学习率。

【参考文章】

1.baijiahao.baidu.com/s?id=160385…

2.www.cnblogs.com/nxf-rabbit7…

3.www.cnblogs.com/DjangoBlog/…

相关文章
相关标签/搜索