GBDT
概述
GBDT 是梯度提升树(Gradient Boosting Decison Tree)的简称,GBDT 也是集成学习 Boosting 家族的成员,但是却和传统的 Adaboost 有很大的不同。回顾下 Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT 也是迭代,使用了前向分布算法,同时迭代思路和 Adaboost 也有所不同。
GBDT 通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。
弱分类器一般会选择为 CART(也就是分类回归树)。由于上述高偏差和简单的要求,每个分类回归树的深度不会很深。最终的总分类器是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。
让损失函数沿着梯度方向的下降就是 GBDT 的核心了。利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值去拟合一个回归树。GBDT 每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。
算法如下(截图来自《The Elements of Statistical Learning》):
算法步骤解释:初始化,估计使损失函数极小化的常数值,它是只有一个根节点的树,即 ganma 是一个常数值。
迭代
a. 计算损失函数的负梯度在当前模型的值,将它作为残差的估计
b. 估计回归树叶节点区域,以拟合残差的近似值
c. 利用线性搜索估计叶节点区域的值,使损失函数极小化
d. 更新回归树
得到输出的最终模型 f(x)
下面我们具体来说 CART (是一种二叉树) 如何生成。CART 生成的过程其实就是一个选择特征的过程。假设我们目前总共有 M 个特征。第一步我们需要从中选择出一个特征 j,做为二叉树的第一个节点。然后对特征 j 的值选择一个切分点 m。一个 样本的特征 j 的值 如果小于 m,则分为一类,如果大于 m,则分为另外一类。如此便构建了 CART 树的一个节点。其他节点的生成过程和这个是一样的。
参数说明(sklearn)n_estimators:控制弱学习器的数量
max_depth:设置树深度,深度越大可能过拟合
max_leaf_nodes:最大叶子节点数
learning_rate:更新过程中用到的收缩步长,(0, 1]
max_features:划分时考虑的最大特征数,如果特征数非常多,我们可以灵活使用其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
min_samples_split:内部节点再划分所需最小样本数,这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。
min_samples_leaf:叶子节点最少样本数,这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
min_weight_fraction_leaf:叶子节点最小的样本权重和,这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。
min_impurity_split:节点划分最小不纯度,使用 min_impurity_decrease 替代。
min_impurity_decrease:如果节点的纯度下降大于了这个阈值,则进行分裂。
subsample:采样比例,取值为(0, 1],注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做 GBDT 的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低,一般在 [0.5, 0.8] 之间。
回归树基学习器的大小定义了可以被梯度提升模型捕捉到的变量(即特征)相互作用(即多个特征共同对预测产生影响)的程度。 通常一棵深度为 h 的树能捕获到秩为 h 的相互作用。这里有两种控制单棵回归树大小的方法。
如果你指定 max_depth = h ,那么将会产生一个深度为 h 的完全二叉树。这棵树将会有(至多) 2h 个叶子节点和 2h - 1 个切分节点。
另外,你能通过参数 max_leaf_nodes 指定叶子节点的数量来控制树的大小。在这种情况下,树将会使用最优优先搜索来生成,这种搜索方式是通过每次选取对不纯度提升最大的节点来展开。一棵 max_leaf_nodes = k 的树拥有 k - 1 个切分节点,因此可以模拟秩最高达到 max_leaf_nodes - 1 的相互作用(即 max_leaf_nodes - 1 个特征共同决定预测值)。
常见问题
随机森林(random forest)和 GBDT 都是属于集成学习(ensemble learning)的范畴,有什么不同?
集成学习下有两个重要的策略 Bagging 和 Boosting,Bagging算法是这样,每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来,简单的多数投票一般就可以,其代表算法是随机森林。Boosting 的算法是这样,它通过迭代地训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关。其代表算法是 AdaBoost,GBDT。
为什么随机森林的树深度往往大于 GBDT 的树深度?
其实就机器学习算法来说,其泛化误差可以分解为两部分,偏差(bias)和方差(variance)。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。
如下图所示,当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小。但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大