从DT到GBDT2022-01-06
算法架构

名词解释:
- DT:decision tree,决策树
- BDT:boosting decision tree,集成决策树
- GBDT:gradient boosting decision tree,梯度提升决策树
预备知识
信息量
对某个事件发生概率的度量。一般情况下,概率越低,则事件包含的信息量越大。衡量事件信息量的公式如下:
熵(Entropy)
熵是随机变量不确定性的度量。
设X是一个取值个数为n的离散随机变量,其概率分布为:
则随机变量X的熵定义为:
熵越大,随机变量取值的不确定性越大,反之越小。当随机变量的分布为均匀分布时,该随机变量的熵最大。下图为二分类时熵与概率的变化曲线,可以看出,当P(X=1)=0.5时,H(X)最大。

条件熵
表示在已知随机变量X的条件下随机变量Y的不确定性。
设随机变量(X,Y),其联合概率分布为:
给定随机变量X的条件下随机变量Y的条件熵为H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望:
信息增益
表示得知特征X的信息从而使得类Y的信息的不确定性减少的程度。
特征A对训练数据集D的信息增益,定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即
特征A的取值越多,越大,反之越小。
信息增益比
特征A对训练数据集D的信息增益比定义为其信息增益与训练数据集D关于特征A的值的熵之比,即:
其中,,是特征取值的个数 特征A的取值越多,越小,反之越大。
基尼指数
分类问题中,假设有K个类,样本点属于第k类的概率为,则概率分布的基尼指数定义为:
对于给定的样本集合D,其基尼指数为:
其中,是中属于第类的样本子集,是类的个数
如果样本集合D根据特征A是否取某一可能值a被分割成D1和D2两部分,即:
则在特征A是否取a的条件下,集合D的基尼指数定义为:
Gini(D)表示集合D的不确定性,Gini(D,A)表示将A=a分割后集合D的不确定性。
基尼指数越大,样本集合的不确定性(不纯度)越大,与熵类似。
下式表明基尼指数为熵的一阶泰勒近似值:
将在处进行一阶泰勒展开: 因此,随机变量的熵近似于其概率分布的基尼指数 自助法
自助法(bootstrapping)是一种数据采样方法,过程如下:
给定包含m个样本的数据集,采用有放回的方法,每次从中挑选一个样本放入,执行m次后,生成一个包含m个样本的数据集。根据计算,初始数据集D中约36.8%的样本未出现在数据集中,因此,可以将作为训练集,用作测试集。
将上述过程重复N次,便可以得到N个采样后的样本集。

Bias-Variance Trade-off
符号 | 含义 |
---|
| 测试样本 |
| 数据集 |
| 的真实标记 |
| 在数据集中的标记 |
| 基于数据集上学到的模型在上的预测输出 |
| 不同对的期望预测输出 |
| 数据集中标记的噪声,等于 |
符号图形化展示如下:

噪声用于刻画学习问题本身的难度。
方差用于刻画数据扰动对模型的影响,即不同训练数据集训练出的不同模型对同一个待预测的预测结果的离散程度。
偏差用于刻画学习算法本身的拟合能力。
偏差-方差分解说明,泛华性能由学习算法的能力、数据的充分性以及学习任务本身的难度共同决定。

决策树
概述
决策树是一种基本的分类与回归方法,它可以认为是一种if-then规则的集合。决策树由节点和有向边组成,内部节点代表特征,叶子节点代表类别。
下图为决策树的一个图例,判断用户是否有贷款意向:

决策树递归地选择特征并对整个特征空间进行划分,从而对样本进行分类,其过程如下所示:

从上图可以看出,决策树划分的方式有无数种,如何得到最优的决策树?即对训练数据有较好分类效果,同时对测试数据有较低的误差率。
根据特征选择依据的不同,决策树有三种生成算法,包括:ID3、C4.5、CART(Classification and Regression Tree)。
ID3
一、特征选择依据:选择信息增益最大的特征。
二、构建过程:
输入:训练数据集D,特征集A,阈值
输出:决策树T
主要过程:
1、计算A中各特征对D的信息增益,即G(D, A),选择信息增益最大的特征;
2、若的信息增益小于,则置T为单节点树,并将D中实例数最大的类作为该节点的类标记,返回T;
3、对的每一可能值,根据将D分割为非空子集,将中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T;
4、对第i个子节点,以为训练集,以为特征集,递归地调用步骤1~3,得到子树,返回。
三、优点
1、构建决策树的速度比较快,算法实现简单,生成的规则容易理解。
四、缺点
1、倾向选择取值较多的特征。
2、只能处理离散特征,不能处理连续特征。
3、无修剪过程。
C4.5
一、特征选择依据:选择信息增益比最大的特征。
二、构建过程
输入:训练数据集D,特征集A,阈值
输出:决策树T
主要过程:
1、计算特征A中各特征对D的信息增益比,即,选择信息增益比最大的特征;
2、若的信息增益比小于,置T为单节点树,并将D中实例数最大的类作为该节点的类标记,返回T;
3、对的每一可能值,根据将D分割为非空子集,将中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T;
4、对第i个子节点,以为训练集,以为特征集,递归地调用步骤1~3,得到子树,返回。
三、优点
1、能够处理缺失值
a、计算信息增益比时缺失:忽略;将此属性出现频率最高的值赋予该样本。
b、按该属性创建分支时缺失:忽略;将此属性出行频率最高的值赋予该样本;为缺失值创建一个分支。
c、预测时,待分类样本的属性缺失:到达该属性时结束,将该属性所对应子树中概率最大的类别作为预
测类别;将此属性出行频率最高的值赋予该样本,然后继续预测。
2、能够处理离散值和连续值(按属性值排序,按二分法枚举两两属性值之间的阈值点进行离散化)。
3、构造树有后有剪枝操作,防止过拟合。
四、缺点
1、倾向选择取值较少的特征。
2、针对连续值特征,计算效率低。
CART
一、特征选择依据:选择基尼指数最小的特征。
二、构建过程 - 回归树
输入:训练数据集D
输出:回归树f(x)
主要过程:
1、遍历特征,对特征遍历其切分点,按照下式,求解最优的
2、用选定的划分区域并决定相应的输出值:
为元素个数 3、继续对两个子区域调用步骤1~2,直到满足停止条件。
4、将输入空间划分为个区域,生成决策树:
三、构建过程 - 分类树
输入:训练数据集D,停止计算的条件
输出:CART决策树
主要过程:
1、对训练数据集D,对每个特征A,对A可能取的每个值a,根据对的测试为“是”或“否”,将D分成和两部分,计算时的。
2、对所有可能的特征及其取值,选择基尼指数最小的特征及其取值,作为最优特征及最优切分点。根据最优特征及最优切分点,从现节点生成两个子节点,将训练数据集依特征分配到两个子节点中去。
3、继续对两个子区域调用步骤1~2,直到满足停止条件。
4、生成CART决策树。
小结
算法 | 场景 | 树结构 | 特征选择 | 连续值 | 缺失值 | 剪枝 |
---|
ID3 | 分类 | 多叉树 | 信息增益 | 不支持 | 不支持 | 不支持 |
C4.5 | 分类 | 多叉树 | 信息增益比 | 支持 | 支持 | 支持 |
CART | 分类,回归 | 二叉树 | 基尼指数,MSE | 支持 | 支持 | 支持 |
集成学习
集成学习是通过训练若干个弱学习器,通过一定的组合策略,从而形成一个强学习器。按照基学习器之间是否存在依赖关系,可以分为两类:
- 基学习器之间不存在强依赖关系:基学习器可以并行生成,代表算法是bagging系列算法。
- 基学习器存在强依赖关系:基学习器需要串行生成,代表算法是boosting系列算法。
Bagging
Bagging(bootstrap aggregating)是并行式集成学习方法的代表。
以分类为例,假设训练集为X,利用自助法,可以生成N个样本集,针对每个样本集训练一个单独的分类器,最终分类结果由N个分类器投票得出:
算法流程如下:

假设N个模型预测的结果分别为,则组合后的预测结果为。设单模型预测结果的期望是,方差是。则bagging的期望预测为:
说明bagging模型预测的期望近似于单模型的期望,意味着bagging模型的bias与单模型的bias近似,所以bagging通常选择偏差低的强学习器。
bagging的抽样是有放回抽样,因此数据集之间会有重复的样本,模型的预测结果不独立。假设单模型之间具有一定相关性,相关系数为,则bagging模型的方差为:
所以,当N较大时,,bagging能降低整体预测结果的variance,而对bias优化有限。
Boosting
Adaboost
需要解决的两个问题:
分类
输入:训练数据集,其中;弱学习器算法。
输出:最终分类器。
算法步骤如下:
初始化训练数据的权值分布(该值影响分类误差率)
对
- 使用具有权值分布的训练数据集学习,得到基本分类器:
计算分类误差率
计算在训练数据集上的分类误差率:
计算弱分类器的系数:
更新训练数据集的权值分布
其中,是规范化因子:
由上式可知,规范化后使得成为一个概率分布。
构建弱分类器的线性组合
最终分类器
回归
输入:训练数据集,其中;弱学习器算法。
输出:最终分类器。
算法步骤如下:
初始化训练数据的权值分布(该值影响分类误差率)
对迭代次数
构建弱分类器的线性组合,得到最终的强学习器
BDT
BDT(boosting decision tree),提升决策树。
分类
将Adaboost分类算法中的基本分类器限定为二分类树模型即可。
回归
输入:训练数据集
输出:提升树,基模型为树模型
算法步骤:
定义模型
其中,参数表示树的划分及各区域上的输出值。为第棵回归树的叶子节点数(也可认为是树的复杂度)。
定义损失函数
损失函数使用MSE,因此,第轮的损失为:
其中,是当前模型拟合数据的残差 因此,对回归提升树来讲,只需拟合当前模型的残差即可。
对
计算残差:
生成第棵回归树
根据学习一个回归树,得到
更新模型
生成最终的回归问题提升树
GBDT
GBDT(gradient boosting decision tree),梯度提升决策树。
回归
以回归为例,解释GBDT原理。
解释一
对回归问题,给定输入,输出的预测值为:
根据boosting算法:
在给定已知模型的情况下,对新加入的模型,期望能使损失降低,即:
根据泰勒展开公式:
对一阶展开后可得:
其中, 由于为常数,为使得最小,则为:
根据向量点乘定义,当时,取得最小值,即损失取得最小值。因此:
在每轮迭代中,用于拟合,残差为:
解释二
从函数空间考虑,为了使得下降,根据梯度下降原理:
而根据加法模型:
为了使得下降,仅需使新加入的模型逼近即可:
二分类
对二分类问题,可以使用0和1表示预测类别。预测值的区间为,预测结果为:
其中,为二分类判断阈值 其中,,为每次迭代的树模型 模型初始化为:
所以,在第m轮,关于的的负梯度值(伪残差)为:
迭代,对
对
计算负梯度,
拟合回归树,生成第m棵回归树
对拟合一棵回归树,得到第m棵树的叶节点区域,,其中,为第m棵回归树叶子节点的个数。
对于个叶子节点区域,计算出最佳拟合值
由于上式没有闭式解,所以采用近似值代替,代替过程如下:
令,此时的使得最小,得: 更新强学习器
生成最终强学习器
结果预测
多分类
假设有K个类别,对类别进行one-hot处理后,样本集形式为,label中只有一个维度为1。
模型最终生成K棵集成决策树。
总结
集成方法 | 优点 | 缺点 | 示例 |
---|
bagging | 能处理过拟合; 能够降低variance; 学习器独立,可并行训练; | 噪声大时会过拟合; 可能会有很多相似的决策树; 小数据或低维数据效果一般; | 随机森林 |
boosting | 能够降低bias和variance; | 容易过拟合; 串行训练; | GBDT |
Bagging实现
随机森林
假设数据样本数为N,每个样本的属性个数为M,在每个决策树构造过程中,每个节点随机选择m个属性计算最佳分裂方式进行分裂。具体步骤如下:
- 有放回地随机选择N个样本,用这N个样本来训练一棵决策树。
- 每个样本有M个属性,在决策树中需要分裂节点时,从这M个属性中随机选取m个属性,一般来说m << M,然后从这m个属性中采用某种策略选择最佳属性作为当前节点的分裂属性。
- 每棵决策树的每个节点的分裂都按照步骤(2)进行,直到不能分裂为止。
- 重复建立K棵决策树,然后对预测结果进行一定组合,即可得随机森林模型。
Boosting-GBDT实现
XGBoost
模型概述
原理推导
输入:训练数据集,其中,
输出:提升决策树模型,由个基本树模型组成
其中,为决策树个数,为第棵决策树 决策树定义为:
其中,为输入向叶子节点编号的映射,即,为决策树叶子节点数目。
是叶子节点输出值向量,形式为。
决策树结构图如下所示:

其中,为经验风险为结构风险, 第 轮损失函数:
第 轮损失函数在处的二阶泰勒展开为:
其中,
第 轮目标函数的二阶泰勒展开移除常数项:
其中,为叶子节点数
定义叶结点 上的 样本的下标集合 ,则目标函数可表示为 按叶结点 累加的形式:
由于:
可令:
得到每个叶结点 的最优输出值为:
代入每个叶结点 的输出值,得到第 个决策树损失函数的最小值:
其中,为第轮决策树的叶节点数 假设和分别为分裂后左右结点的实例集,令,则分裂后损失减少量由下式得出:
使用 评估待分裂结点。
算法说明:枚举所有特征,对每个特征,枚举每个分裂点,根据 查找最优分裂点
输入:当前节点实例集,特征维度
输出:根据最大score分裂
算法步骤:
,
for to do
,
for in sorted(, by ) do
,
,
LightGBM
基于决策树某节点的数据集,特征 在分裂点 分裂后的方差收益为:
其中, 特征的最佳分裂点:
解释一:基于CART树寻找最优分裂点
为当前步骤要拟合的值,损失函数使用MSE,分裂后使得损失最小,即:
和分别为分裂后的左右子集和分别为左右子集的均值
解释二:参考XGBoost的信息增益
因为使用的是平方损失,那么样本的二阶导数为1,即 为1,故上式与 等价。
由于梯度较大的数据实例在信息增益的计算中起着更重要的作用,所以GOSS可以在较小的数据量下获得相 当准确的信息增益估计。
参考资料
- https://statisticallearning.org/biasvariance-tradeoff.html
- https://www.cs.cornell.edu/courses/cs4780/2018fa/lectures/lecturenote12.html
- https://bcheggeseth.github.io/CorrelatedData/index.html
- http://www.milefoot.com/math/stat/rv-sums.htm
- https://stats.stackexchange.com/questions/391740/variance-of-average-of-n-correlated-random-variables
- https://github.com/Freemanzxp/GBDT_Simple_Tutorial
- https://scikit-learn.org/stable/modules/ensemble.html
- https://scikit-learn.org/stable/modules/tree.html#tree-algorithms-id3-c4-5-c5-0-and-cart