GBDT梯度提升算法调参

xiaoxiao2021-02-28  103

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会忽略4max_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还是在提高的,但计算时间是个问题。

转载请注明原文地址: https://www.6miu.com/read-60178.html

最新回复(0)