如何使用GBM/GBDT/GBRT

数据客 2016-04-24

Gradient Boosted Regression Trees (GBRT,名称就不用翻译了吧,后面直接用简称)或Gradient Boosting, 是一种用于分类和回归的机器学习方法。


Scikit-learn及Gradient Boosting简介


Scikit-learn提供了包含有监督学习和无监督学习一系列机器学习技术,也包含了常见的模型选择,特征提取,特征选择的常见机器学习工作任务。


Scikit-learn中的gradient boosting提供了两个estimator:GradientBoostingClassifier和GradientBoostingRegressor,都可以从sklearn.ensemble里调用。


Estimators提供了一系列参数来控制拟合,GBRT里重要的参数如下:

  • 回归树的数量(n_estimators)

  • 每棵独立树的深度(max_depth)

  • 损失函数(loss)

  • 学习速率(learning_rate)


例如,如果你想得到一个模型,使用100棵树,每棵树深度为3,使用最小二乘法函数作为损失函数,代码如下:

est = GradientBoostingRegressor(n_estimators=100, max_depth=3, loss='ls')

Gradient Boosting实战


向GBRT添加的更多的树以及更深的深度,可以捕获更多的偏差,我们模型也更复杂。但和以往一样,机器学习模型的复杂度是以“过拟合”为代价的。



上图中蓝线是指训练集的预测偏差:可以看到开始阶段快速下降,之后随着添加更多的树而逐步降低。测试集预测偏差(红线)同样在开始阶段快速下降,但是之后速度降低很快达到了最小值(50棵树左右),之后甚至开始上升。这就是我们所指的“过拟合”:在一定阶段,模型能够非常好的拟合训练数据的特点(这个例子里是我们随机生成的噪音)但是对于新的未知数据其能力受到限制。图中在训练数据与测试数据的预测偏差中存在的巨大的差异,就是“过拟合”的一个信号。


Regularization


Gradient boosting很棒的一点,就是提供了一系列“把手”来控制过拟合。提供三个“把手”来控制“过拟合”:树结构(tree structure),收敛(shrinkage), 随机性(randomization)。


  • 树结构(tree structure)


单棵树的深度是模型复杂度的一方面。树的深度基本上控制了特征相互作用的成都。例如,如果想覆盖维度特征和精度特征之间的交叉关系特征,需要深度至少为2的树来覆盖。不幸的是,特征相互作用的程度是预先未知的,但通常设置的比较低较好–实战中,深度4-6常得到最佳结果。在scikit-learn中,可以通过max_depth参数来限制树的深度。


另一个控制树的深度的方法是在叶节点的样例数量上使用较低的边界:这样可以避免不均衡的划分,出现一个叶节点仅有一个数据点构成。在scikit-learn中可以使用min_samples_leaf参数来实现。


  • 收敛(Shrinkage)


GBRT调参的技术最重要的就是收敛:基本想法是进行通过收敛每棵树预测值进行缓慢学习,通过learning_rage来控制。较低的学习速率需要更高数量的n_estimators,以达到相同程度的训练集误差–用时间换准确度的。


  • 随机梯度推进(Stochastic Gradient Boosting)


与随机森林相似,在构建树的过程中引入随机性导致更高的准确率。Scikit-learn提供了两种方法引入随机性:a)在构建树之前对训练集进行随机取样(subsample);b)在找到最佳划分节点前对所有特征取样(max_features)。经验表明,如果有充足的特征(大于30个)后者效果更佳。值得强调的是两种选择都会降低运算时间。


超参数调优(Hyperparameter tuning)


我们已经介绍了一系列参数,在机器学习中参数优化工作非常单调,尤其是参数之间相互影响,比如learning_rate和n_estimators, learning_rate和subsample, max_depth和max_features)。


对于gradient boosting模型我们通常使用以下“秘方”来优化参数:


1.根据要解决的问题选择损失函数
2.n_estimators尽可能大(如3000)
3.通过grid search方法对max_depth, learning_rate, min_samples_leaf, 及max_features进行寻优
4.增加n_estimators,保持其它参数不变,再次对learning_rate调优



详细代码及讲解请“点击原文”



本站仅按申请收录文章,版权归原作者所有
如若侵权,请联系本站删除
觉得不错,分享给更多人看到