集成(ensemble)学习通过构建并结合多个学习器来完成学习任务。为了使集成后的学习器获得更好的性能,个体学习器在保证一定的准确性(不用过高,但不能太低)的同时,还需具有一定的多样性。即个体学习器要“好而不同”。
根据个体学习器的生成方式,集成学习大致分为两大类。
- Bagging(Bootstrap aggregating 引导聚集)
- 个体学习器间不存在强依赖关系,可并行化地生成
- 用于减少方差
- Boosting
- 个体学习器间存在强依赖关系,必须串行化地生成。具体算法有AdaBoost、GBM、GBDT、XGBoost、LightGBM等
- 用于减少偏差
还有一种竞赛中常用的
- Stacking
- 异质(个体学习器类型不同)集成
- 用于提升预测结果
接下来重点介绍集成学习中的Boosting。 Boosting是一类可将弱学习器(学习的正确率略优于随机猜测的学习器)提升为强学习器的方法,其常采用加性模型,并利用前向分步算法极小化损失函数进行求解。下面分别介绍Boosting家族的几个典型算法。
前向分步算法
考虑加性模型(additive model)
其中为基函数,为基函数的参数,为基函数的系数。
在给定训练数据及损失函数的条件下,通过极小化损失函数来确定加性模型,即
以上优化问题通常采用前向分步算法来求解。具体地,从前向后,每一步只求解(学习)一个基函数及其系数, 即, 直至求解完所有的基函数及其系数。
具体算法步骤如下:
输入:训练数据集;损失函数;基函数集;
输出:加性模型
(1)初始化
(2)对下述操作迭代$m=1,2,\cdots,M$次
(a) 极小化损失函数
得到参数
(b) 更新
(3)得到最终的加性模型
AdaBoost
AdaBoost是前向分步算法的一种特例。其是由基本分类器组成的加性模型,损失函数为指数函数。其基本思想为:先从初始训练数据集中训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的样本在下一轮训练中受到更多的关注,然后基于重新调整后的样本分布进行下一个基学习器的训练。如此重复进行,直至基学习器的数目达到事先指定的值$M$,最终结合$M$个基学习器的输出,得到最终的结果。具体地
输入:训练数据集;迭代轮次$M$;
输出:加性模型
(1)初始化训练数据的权值分布
(2)对下述操作迭代$m=1,2,\cdots,M$次
(a)基于权值分布的训练数据集,学习一个基分类器
(b)计算在训练数据集上的误分率
(c)计算的系数
说明: 表示在最终分类器中的重要性。且随着的减小而增大,即误分类率越小的基分类器在最终的分类器中的权重越大。
(d)更新训练数据集的权值分布
说明: 被基分类器误分的样本的权值在下一轮更新时其权重增大,而被正确分类的样本在下一轮权值更新时将变小。即误分类样本在下一轮训练中起更大的作用。
(3)构建基分类器的线性组合
得到最终分类器
具体数值例子见李航的统计学习方法。
GBDT
GBDT中的基学习器只能是模型。其在迭代时,假设在轮迭代得到的强学习器为,损失函数为,在$t$轮迭代的目标是找到一个基学习器,让$t$轮的损失最小。即让$t$轮迭代得到的基学习器尽可能地拟合前$t-1$轮所得到的强学习器的偏差(残差)。
为了能在各种损失函数中统一的拟合损失,$Friedman$提出用损失函数的负梯度来近似各轮迭代中的损失值,从而方便各轮迭代中基学习器的确定。
基于上面的思路,现总结下GBDT的回归算法的过程。(分类算法的输出值是不连续的类别值,需一定的处理才能使用负梯度,具体参考梯度提升树(GBDT)原理小结中的分类算法)
输入: 训练集样本;最大迭代次数$T$;损失函数
输出: 强学习器
(1) 初始化基(弱)学习器
(2) 对下述操作迭代次
(a) 计算负梯度
说明: 表示第$t$轮中第$i$个样本预测误差(残差)的近似表示。
(b) 根据训练第$t$棵回归树(基学习器),其对应的叶节点区域为其中为回归树的叶节点的个数(编号/索引)。
(c) 对叶子区域的样本集,计算其最佳拟合值
则本轮决策树的拟合函数为
(d) 更新强学习器
(3) 得到最终的强学习器
XGBoost
XGBoost是GBDT的一种高效实现,相比GBDT,XGBoost主要从以下三个方面做了优化,有“竞赛大杀器”之称
-
算法本身的优化:在基学习器选择上,相比GBDT只支持CART模型,XGBoost可支持其他的模型。在损失函数上,除了本身的损失,还加上了正则化部分。在算法的优化方式上,GBDT的损失函数只对误差部分做负梯度(一阶泰勒)展开,而XGBoost损失函数对误差部分做二阶泰勒展开,精度更高。
-
运行效率的优化:基学习器的并行选择;特征值的排序分组,加速IO
-
健壮性的优化: 增加了缺失值及过拟合的处理
下面主要记录自己对算法本身优化的理解。且基学习器依然以CART进行推导建模。
符号说明
令表示第$i$个训练样本,表示第$i$个样本的真实值,表示第$i$个样本的预测值,且有,表示由$K$棵树组成的强学习器对第$i$个训练样本的预测值,为待确定的模型参数,表示样本特征到预测值的一种映射函数。
由上述符号说明,令目标函数:
其中表示训练损失,表示树的复杂度。
接下来通过优化()上述目标函数来确定每个基学习器$f$。又为加性模型,可利用前向分步算法进行目标函数的优化。
在第$t$轮的预测值可重写为
其中表示前$t-1$轮的预测值,为已知值,为第$t$轮待确定的模型参数。
进一步地,第$t$轮的目标函数为
利用泰勒公式,上式可近似为
其中
说明
令 , 可推出式(1)
在式$(1)$中,都为已知值,因此第$t$轮的目标函数可重写为
现在的问题是如何表示式$(2)$中的$f(x)$,即如何将树参数化。具体地,有如下定义
其中表示样本点到叶子编号的映射,它描述了树的结构(分割点及分割点的阈值),表示某个叶节点内所有样本的权重值(平均值),$T$表示叶节点的总数。对应的复杂度表示为
将及代入式有
令叶节点$j$中的所有样本集为,则式$(3)$按叶节点重新分组后的表达式为
说明 式$(4)$为相互独立的$T$个二次方函数。
为了后面表述方便,令,则式$(4)$可进一步简化为
由二次函数的性质可知,式$(5)$(最终的损失函数)在时,损失值最小:。
说明
函数 在处取得最值。
只给出了在第$t$轮迭代时,第$t$棵树各个叶节点的最优权重(平均值)对应的 损失函数。还需进一步确定其形状(结构)。构建过程与普通决策树的构建过程类似。具体地,每次分裂节点时,最大程度的减小分裂前损失函数的损失。即假设当前节点左右子树的一阶导二阶导的和分别为则最大化下式
整理上式可得
式$(6)$为树节点划分依据,相当于ID3中的信息增益。具体地,依此选取样本集中的某个特征及该特征的某个值,分别计算划分前()与划分后()节点对应的一阶导与二阶导的和,使得最大的某个特征的某个值即为当前节点的划分点。划分后的节点递归地进行上述操作,直到满足某个限制阀值后停止划分,最终得到$t$轮的基学习器。
至此,分析完了如何在一个轮次中获得基学习器的过程。
基于上述分析,现总结XGBoost的具体流程:
输入: 训练集样本;最大迭代次数$T$;损失函数;正则化系数
输出: 强学习器
(1) 初始化基学习器
(2) 对下述操作迭代次
(a) 针对每个样本$i$,计算第$t$轮损失函数$L$关于的一阶导数,二阶导数,然后可得所有样本的一阶导数和与二阶导数和
(b) 基于上述准则,进行样本点的划分,最终得到本轮的基学习器
(c) 更新本轮的强学习器
(3)得到最终的强学习器
不考虑深度学习,则XGBoost是算法竞赛中最热门的算法,它将GBDT的优化走向了一个极致。
LightGBM
微软在XGBoost基础上又出了LightGBM,在内存占用和运行速度上又做了不少优化,但是从算法本身来说,优化点则并没有XGBoost多。 如果在使用XGBoost遇到的内存占用或者运行速度问题,那么可以尝试LightGBM。
实战
基于XGBoost的信用借贷