GBDT 简述
梯度提升树:使用损失函数的负梯度在当前模型的值求解更为一般的提升树模型,这种基于负梯度求解提升树前向分布迭代过程叫做梯度提升树
GBDT 可以适用于回归问题(线性和非线性)其实多用于回归;
GBDT 也可用于二分类问题(设定阈值,大于为正,否则为负)和多分类问题
GBDT使用的决策树就是CART回归树,无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树自始至终都是CART回归树。
损失函数:
GBDT中的损失函数因GBDT具体执行的预测任务而存在区别,同时也因标签的分布而存在区别。
对于梯度提升分类树,loss有以下几种:
分类器中的loss:字符穿型,可输入”deviance“,”exponential“,默认值=”deviance“
其中,”deviance“直译为偏差,特指逻辑回归的损失函数——交叉熵损失,而”exponential“则指AdaBoost中使用的指数损失函数。
对于任意样本i而言,y_i为真是标签,Y_i为预测标签,H(x_i)为预测结果,p(x_i)为基于预测结果和sigmoid/softmax函数计算的概率值。
- 二分类交叉熵损失——L=-(y_ilogp(x_i)+(1-y_i)log(1-p(x_i)))
注:log中输入的一定是概率值。对于逻辑回顾来说,概率就是算法的输出,因此我们可以认为逻辑回归中p=H(x),但对于GBDT来说,p(x_i)=Sigmoid(H(x_i))
- 多分类交叉损失,总共有K个类别——L=-\sum_{K=1}^{K} y^*_k(logP^k(x))
其中,P^k(x)是概率值,对于多分类GBDT来说,p^k(x)=Softmax(H^k(x))。y^*是由真实标签转化后的向量。
- 二分类指数损失——L=e^{-yH(x)}
- 多分类损失函数,总共有K个类别:
注:指数函数与交叉熵损失函数中的y^*不是同样的量
GBDT算法步骤:
1、确定超参数:学习率、迭代次数、树的深度;
2、对每一个特征,根据其值,确定划分点;
3、划分点划分后的两个子数据集(因为是二叉的);
4、按照该划分点进行预测的结果,与真实标签之间的残差,进而计算残差平方和;
5、将两个子集的残差平方和相加,得到该划分点的残差平方和;
6、重复步骤2-5,确定每一个特征下所有划分点的残差平方和,并从中选择最小的残差平方和对应的特征的划分点,作为本次的划分点;
7、如果未达到设定的树的深度,对步骤6划分后的子集应用步骤2-6进行划分;
8、树的深度达到设定值后,完成一棵树桩;
9、根据该树桩预测的结果与真实标签之间的残差,作为下一次迭代的标签;
10、重复2-9进行迭代,直到达到设定迭代次数; 11、最终学习器为学习率与各个基学习器线性之和。初始基学习器可以不应用学习率。
参数空间
影响力 | 参数 |
几乎总是具有巨大影响力 | n_estimators(整体学习能力)learning_rate(整体学习速率)max_features(随机性) |
大部分具有影响力 | init(初始化)subsamples(随机性)loss(整体学习能力) |
可能有大影响力 | max_depth(粗剪枝)min_samples_decrease(精剪枝)min_samples_split(精剪枝)max_leaf_nodes(精剪枝)criterion(分枝敏感度) |
当数据量足够大,几乎无影响 | random_stateccp_alpha(结构风险) |
GradientBoostingClassifier(ccp_alpha=0.0, criterion='friedman_mse', init=None, learning_rate=0.1, loss='deviance', max_depth=3, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, n_iter_no_change=None, presort='deprecated', random_state=None, subsample=1.0, tol=0.0001, validation_fraction=0.1, verbose=0, warm_start=False)
n_estimators
:控制弱学习器的数量
max_depth
:设置树深度,深度越大可能过拟合
max_leaf_nodes
:最大叶子节点数
learning_rate
:更新过程中用到的收缩步长,(0, 1]
max_features
:划分时考虑的最大特征数,如果特征数非常多,我们可以灵活使用其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。该参数的参数如下:
- int:个数
- float:占所有特征的百分比
- auto:所有特征数的开方
- sqrt:所有特征数的开方
- log2:所有特征数的log2值
- None:等于所有特征数
min_samples_split
:内部节点再划分所需最小样本数,这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。
min_samples_leaf
:叶子节点最少样本数,这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
min_weight_fraction_leaf
:叶子节点最小的样本权重和,该值限制了叶子节点所有样本权重和的最小值,若小于这个值,则会和兄弟节点一起被剪枝。
min_impurity_split
:节点划分最小不纯度,使用 min_impurity_decrease 替代。
min_impurity_decrease
: 浮动,默认值= 0.0,如果节点的不纯度下降大于了这个阈值,则该节点将被分裂。
subsample
:采样比例,取值为(0, 1],注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做 GBDT 的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低,一般在 [0.5, 0.8] 之间。
init
:这个参数影响模型的初步输出。计量或“零”,默认=None,一个估计器对象,用于计算初始预测。 init必须提供fit和predict_proba。如果为“零”,则初始原始预测设置为零。默认情况下,使用 DummyEstimator预测类优先级。如果有其他模型的输出结果可以使用其他模型的输出结果作为GBDT初始值
调参过程
1.先对提升框架内的,迭代次数和学习率做调整,选一个较小的学习率,对迭代次数网格化调餐。
2.接下来对决策树调参,先一起调整max_depth和min_samples_split,根据输出的最优值将max_depth定下俩,后续再调整最小划分样本数。
3.再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参。看二者的最优值是否在边界上,如果在边界上,就进一步改变参数范围再网格化调餐。
4.再对max_features和subsample进行网格化。
5.最后可以通过,减小学习率,增大迭代次数,增加泛化能力,防止过拟合。保持两者的乘积基本不变,但步长设定过小,会导致拟合效果反而变差,应适当减小学习率。
GBDT相较于ADBoost做出的改变
- 弱评估器
对于Adaboost或随机森林算法,当集成算法执行的是回归任务时,弱评估器是回归器,当集成算法执行分类任务时,弱评估器是分类器;
对于GBDT而言,无论执行回归/分类/排序任务,GBDT的弱评估器都是回归树。GBDT通过sigmoid或softmax函数输出具体的分类结果。
- 损失函数
L(x, y)
在GBDT中,损失函数范围不再局限于固定或单一的某个损失函数,而是从数学原理上推广到任意可微的函数。
- 拟合残差
GBDT依然自适应调整弱评估器的构建,但却不像AdaBoost一样通过调整数据分布来间接影响后续弱评估器。
GBDT通过修改后续弱评估器的拟合目标来直接影响后续弱评估器的结构。
在AdaBoost当中,每次建立弱评估器之前需要修改样本权重,且用于建立弱评估器的是样本X以及对应的y;
在GBDT中,我们不修改样本权重,但每次用于建立弱评估器的是样本X以及当下集成输出H(x_i)与真是实签y的差异(y-H(x_i)),这个差异成为残差,因此GBDT不修改样本权重,而是通过拟合残差来影响后续弱评估器结构。
- 抽样思想
GBDT加入了随机森林的抽样思想,在每次建树之前,允许对样本和特征进行抽样来增大弱评估器之间的独立性(也因此可以有袋外数据)。
Boosting算法不会大规模依赖于类似Bagging的方式来降低方差,但由于Boosting算法的输出结果是弱评估器结果的加权求和,因此Boosting原则上也可以获得由”平均“带来的小方差红利。
GBDT结合了Bagging和Boosting算法的思想:既降低偏差又降低方差
偏差与方差
Bias(偏差)
模型在样本上的输出与真实值之间的误差,即模型本身的精准度,反应出算法的拟合能力。
Variance(方差)
模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性,反应出预测的波动情况。
1、低偏差 低方差
表示模型既准确又稳定,效果最好,但是现实中这种情形很少遇见。
2、低偏差 高方差
表示模型准确但是稳定性差,对验证数据&测试数据的拟合能力差,即是模型的泛化能力差,产生了 过拟合(Overfitting)。
3、高偏差 低方差
表示模型的准确度差,对数据的拟合能力弱,产生了 欠拟合(Underfitting)。
4、高偏差 高方差
表示模型既不准确又不稳定。
RF与GBDT之间的区别与联系
1)相同点:
- 都是由多棵树组成
- 最终的结果都由多棵树共同决定。
2)不同点:
- 组成随机森林的树可以分类树也可以是回归树,而GBDT只由回归树组成
- 组成随机森林的树可以并行生成(Bagging);GBDT 只能串行生成(Boosting);这两种模型都用到了Bootstrap的思想。
- 随机森林的结果是多数表决表决的,而GBDT则是多棵树加权累加之和
- 随机森林对异常值不敏感,而GBDT对异常值比较敏感
- 随机森林是减少模型的方差,而GBDT是减少模型的偏差
- 随机森林不需要进行特征归一化。而GBDT则需要进行特征归一化
- 随机森林对训练集一视同仁权值一样,GBDT是基于权值的弱分类器的集成
- 随机森林使用的是有放回抽样,GBDT是不放回抽样
梯度提升和梯度下降的区别和联系是什么?
两者都是在每一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新。
只不过在梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参数的更新。
而在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。
优点
- 预测阶段的计算速度快,树与树之间可并行化计算。
- 在分布稠密的数据集上,泛化能力和表达能力都很好,这使得GBDT在Kaggle的众多竞赛中,经常名列榜首。
- 采用决策树作为弱分类器使得GBDT模型具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系。
局限性
- GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络。
- GBDT在处理文本分类特征问题上,相对其他模型的优势不如它在处理数值特征时明显。
- 训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度。