GBDT梯度提升算法调参
标签(空格分隔): GBDT,sklearn实践
最近在学习调参,并在网上搜到一篇很好的教学帖子[链接](https://www.analyticsvidhya.com/blog/2016/02/complete-guide-parameter-tuning-gradient-boosting-gbm-python/),按照其指导,数据集采用经典的波士顿房价预测。
一、相关参数
GBDT算法参数主要分为三个类别:
*1.Tree-Specific Parameters: These affect each individual tree in the model.
树相关参数,决定每棵树的结构
2.Boosting Parameters: These affect the boosting operation in the model.
提升相关参数,影响提升操作
3.Miscellaneous Parameters: Other parameters for overall functioning.
其他参数*
(a) 树相关参数
- min_samples_split
最小划分样本数目,控制过拟合,但值太高容易欠拟合,交叉验证调整 - min_samples_leaf
节点最小样本数目,不平衡分类问题需要设置较低的值,防止最小类别落入最大类别区域内 - min_weight_fraction_leaf
同2相同,只不过换成样本值的百分比,2或3只设置一个就行 - max_depth
树的最大深度,控制过拟合,通过交叉验证调参 - max_leaf_nodes
最大叶子数目,二叉树与4中树的深度相关(2的n次方),如果这个值设置了,GBDT会忽略4 - max_features
划分节点考虑的最大特征数目,优先选总数目的平方根,但也要检查是否达到总数目30%-40%的范围内
太高容易导致过拟合
(b)boosting相关参数
- learning_rate
学习率控制树估计值变化的幅度,较小的值泛化的更好(老师推荐最好小于0.1), 但需要计算更多的树,计算代价较大 - n_estimators
树的数目,交叉验证调参 - subsample
每棵树考虑样本的数目,值稍微小于1就可以降低方差,模型会更稳健,一般来说0.8就可以,不过也可以调整的更好
(c)其他参数
损失函数、random-status等,详见sklearn库
二、创建基准模型
基准模型参数:
Model Report
MSE: 12.7987
R2: 0.8463
CV score: Mean - 0.8786209 | Std - 0.04793263 | Min - 0.7895223 | Max - 0.9306157
二、参数调整的通用方法
学习率和树的数目是需要权衡的参数,一般来说学习率较低时还都不错,我们只需要训练足够多的树。但是对于特定学习率,树的数目很高时,可能导致过拟合,如果调低学习率增加树,又会引起计算时间的增长。
因此可采用如下调整方式:
a.选择相对较高的学习率, 一般默认0.1即可,不过有时根据问题不同可能选择0.05-0.2
b.选择对应该学习率的最优的树数目,一般在40-70之间(这个范围值值得商榷,可能作者是针对其采用的数据集给的)。要考虑运行效率,因为后面还要测试其他参数
c.调整生成树对应参数
d.调低学习率,增加树的数目,来得到更稳健的模型。
### 1.初始值设置
调参之前,通常可以采用如下初始值:
min_samples_split=3, 通常选择样本总数目的0.5%-1%
min_samples_leaf=5, 通常靠直觉
max_depth=5, 应该选择5-8,本数据集样本较少,所以选择较小值
max_features=’sqrt’,上面说了
subsample=0.8,通常选择该初始值
###2.选择学习率0.1时最优树数目
采用以上初始值,从20-200范围内用函数GridSearchCV搜索最优树数目,得到如下结果:
{‘n_estimators’: 190} 0.885812087298
但这里’n_estimators’: 190,是我们取的极值,所以有必要提高,看最优值是否依赖该参数:
取20-350:
{‘n_estimators’: 280} 0.869479486516
如果得到的树数目过少,可以适当降低学习率,比如0.05,再gridsearch下
如果很高的话,就要考虑调高学习率,否则计算时间较长。在实践中应权衡这两个参数值
这里考虑提高学习率为0.15,此时n_estimators=150
###3.调整树参数
接下来,调整树参数,可以采用如下顺序:
调整max_depth and num_samples_split
调整min_samples_leaf
调整max_features
调参顺序是我们在实践中要认真考虑的,应首先调对结果影响最大的参数,比如max_depth and num_samples_split。
(1)max_depth and num_samples_split
max_depth取3-12,steps=2
min_samples_split取2-10,steps=2
得到如下结果:
{‘min_samples_split’: 2, ‘max_depth’: 5}
R2=0.86399602134
(2)min_samples_leaf
min_samples_leaf取2-10,结果如下:
{‘min_samples_leaf’: 2} R2=0.865916149014
代到测试集,验证下:
Model Report
MSE: 10.0156
R2: 0.8974
CV score: Mean - 0.8659161 | Std - 0.08520274 | Min - 0.6988263 | Max - 0.9350607
相对于基准,已经提高了几个百分点。
(3)max_features
max_features取3-13, step=1
{‘max_features’: 3} 0.876187111194
与‘sqrt’结果相同,所以初始值就是最好的
4.调整boosting参数
学习率、树的数目已经挑过了,剩下的就是subsample,取0.6,0.7,0.75,0.8,0.85,0.9
{‘subsample’: 0.8} 0.876187111194
初始值也是最好的
5.调低学习率,增加树的数目,来得到更稳健的模型
按照比例调整:
(0.1, 100):
Model Report
MSE: 11.7713
R2: 0.8794
CV score: Mean - 0.8678649 | Std - 0.07578604 | Min - 0.7182905 | Max - 0.925774
(0.075, 300):
Model Report
MSE: 11.0081
R2: 0.8873
CV score: Mean - 0.8742316 | Std - 0.07110451 | Min - 0.7368456 | Max - 0.9341335
(0.05, 450):
Model Report
MSE: 10.3068
R2: 0.8944
CV score: Mean - 0.8709068 | Std - 0.07850116 | Min - 0.7154469 | Max - 0.9263954
(0.005, 4500):
Model Report
MSE: 9.9805
R2: 0.8978
CV score: Mean - 0.8743913 | Std - 0.07625798 | Min - 0.72629 | Max - 0.9346266
(0.0025, 9000):
Model Report
MSE: 9.9531
R2: 0.8981
CV score: Mean - 0.8746416 | Std - 0.07570489 | Min - 0.727559 | Max - 0.9314996
由此可以看到,随着学习率降低,树数目增加,测试集MSE,R2还是在提高的,但计算时间是个问题。