2.AdaBoost算法(Adaptive Boosting,自适应增强)
4.2.2.2图着色(Graph Coloring Problem)问题
1.集成学习
1.1 思想
集成学习通过构建并结合多个学习器来完成学习任务。
1.1.1类比
三个臭皮匠顶个诸葛亮。
1.1.2 补充概念
在集成学习中,学习器相当于模型,又分为强学习器和弱学习器,弱分类器又叫基分类器。
强学习器:可以认为它是一种准确率很高但相对复杂的模型,比如一些神经网络构建出来的模型,它耗费时间精力多,对算力要求高,花费代价高;
弱学习器:可以认为它是一种比较简单的模型,预测效果不太好,如逻辑回归等简单的模型。
1.2优点
集成学习通过将多个学习器进行结合,常常可以获得比单一学习器更加显著的优越性能。
1.3集成模型需要考虑的问题
改变训练数据的权值或者概率分布,如何改变?
个体学习器就是弱学习器,多个弱学习器学到的东西必须是有所差异的,它们各自的强项不一样
1.4集成模型分类
当训练和组合有不一样的办法时,就得到两种类别:
Boosting:个体学习器间存在强依赖关系、必须串行生成的序列化方法。
Bagging:个体学习器间不存在强依赖关系,可同时生成的并行化方法。
1.4.1Bagging家族
随机森林
1.4.2Boosting家族
Boosting是一族可将弱学习器提升为强学习器的算法.这族算法的工作机制:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。
几个问题:
1.如何计算学习误差率?损失函数/目标函数怎么定义?
2.如何得到基学习器权重系数?
3.如何更新样本权重w?
4.使用何种结合策略?
2.AdaBoost算法(Adaptive Boosting,自适应增强)
Boosting族算法中最著名的是AdaBoost,解决的是二分类问题。
2.1模型
加法模型,表达式:
其中
是由
的分类误差率决定的.
2.2基本思路
1.每一轮中,分别记录好那些被当前弱分类器正确分类和错误分类的样本,在下一轮训练时,提高错误分类样本的权值,同时降低正确分类样本的权重,用以训练新的弱分类器。这样一来,那些没有被正确分类的数据,由于其权值加大,会受到后一轮的更大关注。
经过第一轮学习后,分类器成功将分类器成功将这两个样本的权重降低,提高第一个样本的权值,即下面表格:
D2:
样本 | |||
所占比例 | 2/3 | 1/6 | 1/6 |
可以理解成,初始样本中的错误分类的样本数量怎多了,即
2.加权多数表决。加大分类误差率小的分类器的权值,使其在表决中起较大的作用;减少分类误差率打的弱分类器的权值 ,使其在表决中起小的作用。
现在叙述AdaBoost算法。假设给定一个二类分类的训练数据集
2.3算法流程
1.给定一个二类分类的训练数据集
2.定义基分类器(弱分类器)
3.具体算法流程
(2)训练当前基分类器
(3)计算当前在训练集上的分类误差率,
(4)计算当前分类器的权值,
例子:
2.4Adaboost的算法解释
AdaBoost 算法还有另一个解释,即可以认为AdaBoost 算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二类分类学习方法。
2.4.1考虑加法模型
2.4.2损失函数
回归问题:MSE均方误差
分类问题:指数函数、交叉熵损失
2.4.3前向分步算法原理(优化方法)
2.4.4前向分布算法与AdaBoost
3.GBDT梯度提升树
3.1提升树
3.2梯度提升树GBDT
面临得问题:不同的损失函数,对应的凸优化问题是不一样的,希望能够找到一个通用的方式
提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不那么容易。针对这一问题,Freidman提出了梯度提升(Gradient boosting)算法。这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值
作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
4.XGBOOST
XGBoost是大规模并行 boosting tree的工具,它是目前最快最好的开源 boosting tree 工具包,比常见的工具包快10 倍以上。Xgboost 和 GBDT 两者都是boosting 方法,除了工程实现、解决问题上的一些差异外,最大的不同就是目标函数的定义。故本文将从数学原理和工程实现上进行介绍,并在最后介绍下 Xgboost 的优点。
3.1目标函数
3.1目标函数的建立
3.1.2最优化目标函数
因为损失函数可能为不连续的函数,不直接使用梯度下降法,类似于GBDT算法使用泰勒公式进行计算。
进行泰勒的二次展开,
3.2构建树的方法
在决策树的生长过程中,一个非常关键的问题是如何找到叶子的节点的最优切分点,Xgboost 支持两种分裂节点的方法——贪心算法和近似算法。
为什么不选择穷举法?
将每一种树的结构都列举出来都计算obj分数,选择最大的obj分数的树作为训练的树。
这样造成的花销特别的大,对于每一个特征和相应的特征值(划分节点)都要计算,
3.2.1精确贪心算法
类似于信息增益和基尼系数,提出了相应的Gain。
Exact Greedy Algorithm for Split Finding 用于拆分查找的精确贪婪算法算法 |
每一次尝试去对已有的叶子加入一个分割。通过增益来判断,这个分割是不是最好的。对于一个ju体的分割方案,增益计算如下:第一项是“左子树的分数”,第二项是“右子树的分数”,第三项是“分裂之前的分数”,是加入新叶子节点引入的复杂度代价。
对于每次树的扩展划分,需要枚举所有特征的所有取值。Gain越大越好。
决策树中,ID3通过“信息增益”来控制树的分支,c4.5通过“信息增益率”来控制树的分支,CART回归树通过“平方误差和”来控制树的分支,CART分类树通过“基尼系数”来控制树的分支,GBDT的基学习器采用的就是CART回归树,而XGB中的每棵树(基学习器)都是采用上文中给出的Gain来控制树的分支。
3.2.2近似算法
3.2.2.1加权分位法
贪婪算法可以的到最优解,但当数据量太大时则无法读入内存进行计算,近似算法主要针对贪婪算法这一缺点给出了近似最优解。
对于每个特征,只考察分位点可以减少计算复杂度。
该算法会首先根据特征分布的分位数提出候选划分点,然后将连续型特征映射到由这些候选点划分的桶中,然后聚合统计信息找到所有区间的最佳分裂点。
事实上, XGBoost 不是简单地按照样本个数进行分位,而是以二阶导数值 作为样本的权重进行划分,如下:
对目标函数进行整理:
从上式可以看出, 为平方损失函数中样本的权重,分位点造成的损失越大,权重就越大。
因为精确贪心算法需要遍历所有特征和取值,当数据量非常大的时候,无法将所有数据加载进内存时,精确贪心算法会非常耗时,XGBoost的作者引进了近似算法Approximate Algorithm。
根据每个特征$K$的特征值的分布情况,选择个候选点将特征K的特征值划分到这个桶(buckets)里面,对每个桶内每个样本的累加。
划分好候选切分点之后,按照精确贪心算法描述的算法步骤进行选择最优切分特征与最优切分点,不同的是切分点被上述候选切分点所代替,但原理和操作过程是一样的。
候选切分点的生成方式之一是:分位数。下面是个实例。
实际上,XGBoost不是简单地按照样本个数进行分位,而是以二阶导数值 $h_i$ 作为样本的权重进行划分。为了处理带权重的候选切分点的选取,作者提出了Weighted Quantile Sketch算法。加权分位数略图算法提出了一种数据结构,这种数据结构支持merge和prune操作。
详细内容如下:
事实上, XGBoost 不是简单地按照样本个数进行分位,而是以二阶导数值 作为样本的权重进行划分,如下:
对目标函数进行整理:
从上式可以看出, 为平方损失函数中样本的权重,分位点造成的损失越大,权重就越大
3.2.2.2策略
在提出候选切分点时有两种策略:
Global:学习每棵树前就提出候选切分点,并在每次分裂时都采用这种分割;
Local:每次分裂前将重新提出候选切分点。
直观上来看,Local 策略需要更多的计算步骤,而 Global 策略因为节点没有划分所以需要更多的候选点。
可以看到Global策略在候选点数多时(eps小)可以和Local 策略在候选点少时(eps 大)具有相似的精度。此外我们还发现,在 eps 取值合理的情况下,分位数策略可以获得与贪婪算法相同的精度。(加权分位数方法中没有参数max_bin,需要调节来控制分桶数目)
3.2.2.3稀疏感知算法
对缺失值进行处理,将缺失值的样本看成一个整体,不再是穷举/贪心,从而提高了运行效率。
对于看作整体的缺失值,只需要计算划分节点时,放到左边和右边的Gain,哪边大就放到哪一侧。
3.2.2.4Shrinkage(缩减率)
shrinkage(缩减或者学习速率),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);在Xgboost中加入了步长,
步长通常取0.1,这有助于防止过拟合,降低每一个基学习器的权重,将效果压缩,削弱每棵树的影响,让后面的基学习器有更大的学习空间;
3.3工程计算
3.3.1核外块计算
当数据量过大时无法将数据全部加载到内存中,只能先将无法加载到内存中的数据暂存到硬盘中,直到需要时再进行加载计算,而这种操作必然涉及到因内存与硬盘速度不同而造成的资源浪费和性能瓶颈。为了解决这个问题,XGBoost 独立一个线程专门用于从硬盘读入数据,以实现处理数据和读入数据同时进行。此外,XGBoost 还用了两种方法来降低硬盘读写的开销:
块压缩:对 Block 进行按列压缩(快压缩),并在读取时进行解压(快拆分);
块拆分:将每个块存储到不同的磁盘中,从多个磁盘读取可以增加吞吐量。
3.3.2分块并行
通过一个多线程的方式来优化,将贪心算法的第一个循环,对于每一个特征同时进行计算Gain。
我们知道,决策树的学习最耗时的一个步骤就是在每次寻找最佳分裂点是都需要对特征的值进行排序。而 XGBoost 在训练之前对根据特征对数据进行了排序,然后按列(方便之后的并行运算)保存到块结构中,并在每个块结构中都采用了稀疏矩阵存储格式(Compressed Sparse Columns Format,CSC)进行存储,后面的训练过程中会重复地使用块结构,可以大大减小计算量。
每一个块结构包括一个或多个已经排序好的特征;
缺失特征值将不进行排序;
每个特征会存储指向样本梯度统计值的索引,方便计算一阶导和二阶导数值;
将排序提前处理好,按块,存储在磁盘中,相当于牺牲空间换取时间的行为。
并行体现就是从上倒下扫描。
3.3.3缓存优化(操作系统知识)
问题:Block数据结构导致缓存命中率低。
Cpu读取的数据是离散的,不是连续的。块结构的设计可以减少节点分裂时的计算量,但特征值通过索引访问样本梯度统计值的设计会导致访问操作的内存空间不连续,这样会造成缓存命中率低,从而影响到算法的效率。
为了解决缓存命中率低的问题,XGBoost 提出了缓存访问优化算法:为每个线程分配一个连续的缓存区,将需要的梯度信息存放在缓冲区中,这样就是实现了非连续空间到连续空间的转换,提高了算法效率。
此外适当调整块大小,也可以有助于缓存优化。
3.4总结
优点:
1.精度更高:GBDT 只用到一阶泰勒展开,而 XGBoost 对损失函数进行了二阶泰勒展开。XGBoost 引入二阶导一方面是为了增加精度,另一方面也是为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数;
灵活性更强:GBDT 以 CART 作为基分类器,XGBoost 不仅支持 CART 还支持线性分类器,(使用线性分类器的 XGBoost 相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题))。此外,XGBoost 工具支持自定义损失函数,只需函数支持一阶和二阶求导;
2.正则化:XGBoost 在目标函数中加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、叶子节点权重的 L2 范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合;
3.Shrinkage(缩减):相当于学习速率。XGBoost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间;
4.列抽样:XGBoost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算;
5.缺失值处理:XGBoost 采用的稀疏感知算法极大的加快了节点分裂的速度;
可以并行化操作:块结构可以很好的支持并行计算。
缺点:
1.虽然利用预排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂过程中仍需要遍历数据集;
2.预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。
3.5具体案例
参考xgboost原理分析以及实践_SCUT_Sam-CSDN博客_xgboost流程图
4.LightGBM
4.1LightGBM原理简介
LGBM充分借鉴了XGB提出的一系列提升精度的优化策略,同时在此基础之上进一步提出了一系列的数据压缩和决策树建模流程的优化策略。其中数据压缩方法能够让实际训练的数据量在大幅压缩的同时仍然保持较为完整的信息,而决策树建模流程方面的优化,则是在XGB提出的直方图优化算法基础上进行了大幅优化,不仅能够加速决策树建模速度,同时也能非常好的处理经过压缩后的数据,从而最终大幅提升每棵树的训练效率。
总的来说,LGBM算法可以看成是迭代过程几乎全盘借鉴XGB、而在数据压缩方法和决策树训练方法上有大量创新的算法,下面也将按照这两部分进行讲解。
LightGBM中提出了互斥特征捆绑和基于梯度的单边采样,其他的过程与方法借鉴XGB。
可以用如下一个简单公式来说明LightGBM和XGBoost的关系:
LightGBM = XGBoost + Histogram + GOSS + EFB。
4.2 LightGBM的数据压缩策略
LightGBM建模过程总共会进行三方面的数据压缩:
1.连续变量分箱(直方图)——降低分裂点的数量
2.互斥特征捆绑(Exclusive Feature Bundling, EFB)——降低特征数量
3.基于梯度的单边采样(Gradient-based One-Side Sampling, GOSS)——降低样本数量
通过这3个算法的引入,LightGBM生成一片叶子需要的复杂度大大降低了,从而极大节约了计算时间。 同时Histogram算法还将特征由浮点数转换成0~255位的整数进行存储,从而极大节约了内存存储。
4.2.1连续变量分箱
LightGBM 使用的是直方图算法(histogram algorithm),占用的内存更低,数据分割的复杂度更低。直方图思想是:
1.将连续的浮点特征离散成 k个离散值,并构造宽度为 k的Histogram。
2.遍历训练数据,统计每个离散值在直方图中的累计统计量。
3.在进行特征选择时,只需要根据直方图的离散值,遍历寻找最优的分割点。
至此,就将连续变量转化为了离散变量,从而在寻找最优切分点时减少循环迭代的次数。
4.2.2互斥特征捆绑(EFB)
两个特征存在一种这样的关系——任何一条样本都不会同时在特征x1和x2上取值非0,在EFB原理的定义中,这种关系的特征又被称作互斥特征。而互斥特征其实是可以合成一个特征的,这个合成的过程并不会有任何的信息损失,而合成的过程又被称作特征捆绑。这也就是所谓的互斥特征捆绑算法。
4.2.2.1冲突比例(Conflict_rate)
首先是关于“互斥”关系的定义,EFB并不是只压缩完全互斥的特征,而是非常灵活的定义了一个冲突比例(又称非互斥比例),这个比例用于表示两个特征中冲突(即非互斥、同时取非零值)的取值占比,来衡量两个特征互斥程度。当然,冲突比例越大说明互斥程度越低。
4.2.2.2图着色(Graph Coloring Problem)问题
通过最大冲突比例的概念引入,相当于是放宽的互斥的条件,或者说给是否互斥添加了一个可以量化计算的阈值。
4.2.3基于梯度的单边采样(GOSS)
GBDT 算法的梯度大小可以反应样本的权重,梯度越小说明模型拟合的越好,单边梯度抽样算法(Gradient-based One-Side Sampling, GOSS)利用这一信息对样本进行抽样,减少了大量梯度小的样本,在接下来的计算锅中只需关注梯度高的样本,极大的减少了计算量。
GOSS 算法保留了梯度大的样本,并对梯度小的样本进行随机抽样,为了不改变样本的数据分布,在计算增益时为梯度小的样本引入一个常数进行平衡。具体算法如下所示:
4.3LightGBM决策树建模优化方法
在决策树训练环节,总的来说LGBM采用的决策树建模优化方法有两个
1.直方图优化算法
2.leaf wise tree growth的叶子节点优先的决策树生长策略
4.3.1直方图(Histogram)优化算法
Histogram优化算法与其说是一种算法,不如是一种决策树生长分裂过程中数据集(及其关键信息)的表示方法——即通过Histogram来表示数据集(及其关键信息)在决策树生长过程中的分裂即计算过程。这种表示方法能够大幅减少数据集内存占用、提升计算速度,并且方便进行直方图差分计算。
一个叶子节点的 Histogram 可以直接由父节点的 Histogram 和兄弟节点的 Histogram 做差得到。一般情况下,构造 Histogram需要遍历该叶子上的所有数据,通过该方法,只需要遍历Histogram 的k个桶速度提升了一倍。
4.3.2Leaf wise tree growth
在具体生长的过程中,LGBM中的决策树也是同样会比较不同切分点带来的增益,然后选择增益最大的切分点进行分裂,这个过程和其他所有决策树都一样。而所谓的Leaf wise tree growth(叶节点优先)生长策略,则是对比另一种生长策略:Level-wise tree growth(层次优先的生长策略),前者是一次生长一个节点,可以长成不同子树深浅不一的决策树:
而Level-wise tree growth则是一次生长一层,最后决策树将是左右子树深度:
优点:
(1)降低误差,得到更好的精度
缺点:
- 容易过拟合,所以在 Leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
- 相比层次优先的生长策略,叶节点优先的生长策略会耗费更多的计算量。
4.4工程实现
4.4.1特征并行
传统的特征并行算法在于对数据进行垂直划分,然后使用不同机器找到不同特征的最优分裂点,基于通信整合得到最佳划分点,然后基于通信告知其他机器划分结果。
传统的特征并行方法有个很大的缺点:需要告知每台机器最终划分结果,增加了额外的复杂度(因为对数据进行垂直划分,每台机器所含数据不同,划分结果需要通过通信告知)。
LightGBM 则不进行数据垂直划分,每台机器都有训练集完整数据,在得到最佳划分方案后可在本地执行划分而减少了不必要的通信。
4.4.2数据并行
4.5LightBGM代码实现
使用电信诈骗数据集8个特征,1个Fraud,使用不同的机器学习方法进行训练,通过交叉验证确定模型的稳定性和最佳的模型参数,并给出每一种模型的准确率。
表8.3.2-1 | |
Model | Mean Accuracy |
LightGBM | 0.9987 |
XGBoost | 0.9931 |
Random Forest | 0.9939 |
GBDT | 0.9937 |
SVM | 0.9889 |
Decision Tree | 0.9878 |
4.5.2SHAP图
SHAP图 |
4.5.3股票预测
4.5.4训练时间
10万条训练样本和100万条训练样本训练时间: