本文介绍提升树模型与GBDT算法。
提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中性能最好的方法之一。
提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法,以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。提升树模型可以表示为决策树的加法模型:
其中, 表示决策树, 为决策树的参数, 为树的个数。
提升树模型可以表示为决策树的加法模型(如下式),其中 表示决策树, 为决策树的参数,M 为树的个数:
提升树算法采用前向分步算法。首先确定初始提升树 ,第 m 步的模型是:
其中, 为当前模型,通过经验风险极小化确定下一棵决策树的参数 :
由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。
已知一个训练集 , 为输入空间, 为输出空间。如果将输入空间划分为 J 个互不相交的区域 ,并且在每个区域上确定输出的常量 ,那么树可以表示为:
其中, 表示树的区域划分和各区域上的常数,J 是回归树的复杂度即叶结点个数。
回归问题提升树使用以下前向分步算法:
在前向分步算法的第 m 步,给定当前模型 ,需求解得第 m 棵树的参数 :
当采用平方误差损失函数时, ,
其损失变为: ,
这里 是当前模型拟合数据的残差(residual)。所以,对回归问题的提升树算法来说,只需要简单地拟合当前模型的残差,算法是相当简单的。
【回归问题的提升树算法】
输入:训练数据集 ;
输出:提升树 。
(1)初始化 ;
(2)对 :
a. 根据回归树的表达式,计算残差: ;
b. 拟合残差 学习一个回归树,得到 ;
c. 更新: ;
(3)得到回归问题提升树: 。
提升树利用加法模型与前向分步算法 实现学习的优化过程,当损失函数是平方损失和指数损失时,每一步优化是很简单的,但对一般损失函数而言,往往每一步优化并不那么容易。梯度提升(gradient boosting)算法利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值作为回归问题提升算法中的残差的近似值,拟合一个回归树。
GBDT优点:(1)可以灵活地处理各种类型的数据,包括连续和离散值;(2)相对于SVM,较少的调参可以达到较好的预测效果;(3)使用健壮的损失函数时,模型鲁棒性非常强,首异常值影响小。
GBDT缺点:弱学习器之间存在依赖关系,难以并行训练数据。
输入:训练数据集 ;损失函数 ;
输出:回归树 。
(1)初始化:
(2)对 :
a. 对 ,计算: ;
b. 对 拟合一个回归树,得到第 棵树的叶结点区域 ;
c. 对 ,计算: ;
d. 更新: ;
(3)得到回归树: 。
输入:训练数据集 ;损失函数:
;
输出:分类树 。
(1)初始化: ;
(2)对 :
a. 对 ,计算负梯度:
b. 对 拟合一个分类树,得到第 棵树的叶结点区域 ,J 为分类树的叶子结点的个数 ;
c. 对 ,计算各个叶子结点的最佳负梯度拟合值:
,
由于上式比较难,一般使用近似值代替: ;
d. 更新: ;
(3)得到分类树: 。
由于使用的是类别的预测概率值和真实概率值的差来拟合损失,所以最后还要将概率转换为类别:
最红输出比较类别概率大小,概率大的就预测为该类别。
输入:训练数据集 ;损失函数: ,其中 表示是否属于第 k 类别, 表示共有多少分类的类别;
输出:分类树 。
(1)初始化: ;
(2)对迭代轮数 ,
a. 对 ,对样本计算样本点属于每个类别 的概率:
b. 对类别 ,根据损失函数和第k类的概率,可计算出第 m 轮的第 i 个样本对应类别 的负梯度误差为:
这里的误差就是样本 i 对应类别 的真实概率 和 m-1 轮预测概率的差值。
c. 对概率伪残差 拟合一个分类树 ;
d. 对 ,计算各个叶子结点的最佳负梯度拟合值:
,
由于上式比较难,一般使用近似值代替: ;
d. 更新强学习器: ;
(3)得到分类树: 。
参数 | 参数类型 | 默认值 | 参数含义 | 详细说明 |
loss | {'deviance', 'exponential'} |
deviance | 损失函数 | 对分类:deviance:对数似然损失函数。Exponential:指数损失函数。一般使用默认值,对二元和多元分类各自都有比较好的优化。 对回归:均方差ls:数据点噪音不多时使用;绝对损失lad;Huber损失huber:抗噪音;分位数损失quantile:分段预测。 |
learning_rate | float | 0.1 | 每个弱学习器的权重缩减系数v(步长) | 0 |
n_estimators | int | 100 | 弱学习器的最大迭代次数 | n_estimators太小,容易欠拟合,太大则容易过拟合。 |
subsample | float | 1 | 子采样,取值为(0,1] | 不放回抽样,若值为1,则全部样本都使用,若小于1,则只有一部分样本会去做拟合。选择小于1的比例可减少方差,防止过拟合,但会增加样本拟合的偏差,推荐在[0.5,0.8]。 |
criterion | {'friedman_mse', 'mse','mae'} |
friedman_mse | 特征选择标准 | friedman_mse:使用Friedman改进得分的均方误差;mse:均方误差;mae:平均绝对误差; |
min_samples_split | int/float | 2 | 内部节点再划分所需最小样本数 | 限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 |
min_samples_leaf | int/float | 1 | 叶子节点最少样本数 | 限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 |
min_weight_fraction_leaf | float | 0 | 叶子节点最小的样本权重和 | 限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 |
max_depth | int | 3 | 决策树的最大深度 | 数据少或特征少的时候可以不限制。如果模型样本、特征多,可限制这个最大深度,具体的取值取决于数据的分布。 |
min_impurity_decrease | float | 0 | 节点划分最小不纯度 | 限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。 |
init | extimator or 'zero' | None | 初始化的时候的弱学习器 | None:用训练集样本来做样本集的初始化分类回归预测,否则用init提供的学习器做初始化回归预测。一般在有先验知识的情况下使用。 |
random_state | int/随机状态实例 | None | 随机性控制 | 若为RandomState实例,random_state就是随机数生成器;None:随机数生成器是np.random使用的RandomState实例。 |
max_features | int/float /{'auto','sqrt','log2'} |
None | 划分时考虑的最大特征数 | None:划分时考虑所有的特征数;log2:划分时最多考虑log2N个特征;sqrt或auto:划分时最多考虑N−−√N个特征。整数:考虑的特征绝对数。浮点数:考虑特征百分比,即考虑(百分比xN)取整后的特征数。 |
verbose | int | 0 | 详细输出 | 0:不输出任何结果;1:打印特定区域的树的输出结果;大于1:打印所有结果; |
max_leaf_nodes | int | None | 最大叶子节点数 | 限制最大叶子节点数,可以防止过拟合,None:不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。 |
warm_start | bool | False | 热启动 | True:重复使用之前的调用,再加入更多弱学习器 |
validation_fraction | float | 0.1 | 早期停止的训练集 | 预留的训练数据比例作为早期停止的验证集。仅当n_iter_no_change是整数时使用。 |
n_iter_no_change | int | None | 验证得分没有得到改善时提前终止训练 | 当验证得分没有得到改善时可以提前终止训练。None:不允许提前结束;整数:将 validation_fraction的大小作为验证,并在验证得分没有得到改善时终止训练。 |
tol | float | 1.00E-04 | 容忍提前停止 | 当n_iter_no_change 迭代的损失没有改善时,允许提前停止。 |
ccp_alpha | 非负的浮点型 | 0 | 用于最小代价复杂度修剪的复杂度参数 | 将会选择最大代价复杂度小于ccp_alpha的子树。默认不修剪。 |
参考:
[1]. 李航. 统计学习方法(第二版)
[2]. 周志华. 机器学习
[3]. 梯度提升树(GBDT)原理小结 - 博客园
[4]. 集成学习之梯度提升树(GBDT)算法 - 博客园
[5]. scikit-learn 梯度提升树(GBDT)调参小结 - 博客园