赞
踩
ID3、C4.5、CART分类树算法总结: 感觉背这些无意义。
ID3:缺点:
CART 在 C4.5 的基础上进行了很多提升:
Ref: 最常见核心的决策树算法—ID3、C4.5、CART(非常详细)
1. 简述决策树原理?
决策树是一种自上而下,对样本数据进行树形分类的过程,由节点和有向边组成。节点分为内部节点和叶节点,其中每个内部节点表示一个特征或属性,叶节点表示类别。从顶部节点开始,所有样本聚在一起,经过根节点的划分,样本被分到不同的子节点中,再根据子节点的特征进一步划分,直至所有样本都被归到某个类别。
2. 为什么要对决策树进行减枝?如何进行减枝?
剪枝是决策树解决过拟合问题的方法。在决策树学习过程中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,于是可能将训练样本学得太好,以至于把训练集自身的一些特点当作所有数据共有的一般特点而导致测试集预测效果不好,出现了过拟合现象。因此,可以通过剪枝来去掉一些分支来降低过拟合的风险。
决策树剪枝的基本策略有“预剪枝”和“后剪枝”。预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
预剪枝使得决策树的很多分支都没有"展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。但另一方面,有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降?但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于"贪心"本质禁止这些分支展开,给预剪枝决策树带来了欠拟含的风险。
后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树 。但后剪枝过程是在生成完全决策树之后进行的 并且要白底向上对树中的所有非叶结点进行逐 考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
stacking的例子如GBDT+LR
决策树最重要的6个参数包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。已红色标出: (1)选择决策树分裂的标准,(2) 构建多少颗决策树,(3) 每棵树用多少特征,(4) ok,开始构建,先来看第一个节点,是否需要分裂 即:是否满足节点划分所需最小样本数(5)当前节点是否达到树的最大深度, (6) 划分之后的节点是否小于min_sample_leaf 叶子节点最少样本数。
Ref:https://blog.csdn.net/qfikh/article/details/103913834
GBDT回归算法中每棵树都是预测y真实值或者y的残差,采用平方损失函数,所以划分节点时采用平方损失和最小作为划分依据。
GBDT分类算法是一个基于梯度提升的集成学习算法,它本身并不直接使用逻辑回归,但可以使用类似逻辑回归的对数似然损失函数来指导每一轮迭代中弱学习器的拟合过程,从而获得更好的分类性能。
GBDT二分类采用类似逻辑回归的对数损失函数,将决策树输出累加得到概率值F(x),通过对数损失函数将yi 与F(xi) 联系起来,用来表示损失函数。实际的效果感觉很像GBDT的最终输出在经过一个sigmoid函数。(GBDT+LR 是)
==
将单个样本的对数损失函数 进行二阶泰勒展开,求得每棵树叶子节点C的权重取值
记忆宝典:GBDT 和RF区别,首先想到的就是 bagging/boosting 然后联想到 3-3组合
相同点: 都是由多棵树组成,最终的结果都是由多棵树一起决定。
不同点:
泛化误差可以分为偏差(bias)和方差(variance);偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了相同的样本时模型预测值的离散程度。
当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小;但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大,所以模型过于复杂的时候会导致过拟合。
对于RF来说由于并行训练很多不同的分类器,然后求均值作为最后预测值。所以保证了方差,那么对于每个基分类器来说,目标就是如何降低这个偏差,所以我们会采用深度很深甚至不剪枝的决策树。
而对于GBDT来说用残差更新样本迭代训练多个弱学习器,然后进行加权累加作为最后预测值,可以保证偏差,所以对于每个基分类器来说,目标就是如何降低这个方差,所以会采用更简单的分类器 即深度很浅的决策树。
Ref:https://blog.csdn.net/xwl198937/article/details/79749048
Ref: 深入理解GBDT回归算法_Microstrong0305的博客-CSDN博客
深入理解GBDT二分类算法_Microstrong0305的博客-CSDN博客
Ref:深入理解XGBoost
本文是在原文基础上进行修补。
(1)目标函数:
(2) 第一项泰勒展开:
(3) 第二项-定义树的复杂度:
(4) 最终的目标函数:
(5) 目标函数的最值:
在 取到最小值:
(6) 分裂增益计算
XGBoost可以同时用于分类和回归任务。对于分类任务,XGBoost使用对数损失函数,对于回归任务,XGBoost使用平方损失函数。
XGBoost 二分类问题:就是在XGBoost回归模型外面套了一个逻辑回归。
在得到多个弱cart树模型后,输入一个原始数据,经过n个树打分,残差相加,得到的数值要经过logictic function映射成概率值,也就是该样本被划分为正样本的概率。
XGBoost多分类问题:就是在XGBoost回归模型外面套了一个Softmax。
(5.1)首先针对每列特征将数据升序排列,保存为block结构
(5.2)然后列采样,随机选出K列特征作为划分特征;
(5.3)再然后 采用贪心算法/近似算法(实际使用的)/加权分位数缩略图的方法找到划分点
(5.4)其中对于缺失值采用稀疏感知算法处理,分别枚举特征缺省的样本归为左右分支后的增益,选择增益最大的枚举项即为最优缺省方向。
(5.5)加快模型训练的方法:(1)列快并行学习:通过按特征进行分块并排序,在块里面保存排序后的特征值及对应样本的引用,以便于获取样本的一阶、二阶导数值。(2)缓存访问:为每个线程分配一个连续的缓存区,将需要的梯度信息存放在缓冲区中,这样就实现了非连续空间到连续空间的转换,提高了算法效率。(3)核外 块计算:将数据集分成多个块存放在硬盘中,使用一个独立的线程专门从硬盘读取数据,加载到内存中,这样算法在内存中处理数据就可以和从硬盘读取数据同时进行。
首先从模型选择角度,然后模型原理推倒角度,再之后就是树的生长过程
记忆宝典:选用的弱分类器、弱分类器之间的关系(都加上学习率)、ok然后 目标函数由两部分组成:损失函数的二阶泰勒展开 + 正则化项,然后开始列采样 获得数据,缺失值处理,进行工程实现(列块并行,缓存访问、核外块计算);单棵树训练完后累加到总模型中(学习率),总模型采用early stopping 来停止训练。
缺点:预排序和近似算法的时间复杂度和空间复杂度 较大
优点:
(1)灵活性更强: GBDT 以 CART 作为弱分类器,XGBoost 不仅支持 CART 还支持线性分类器,使用线性分类器的 XGBoost 相当于带 L1和 L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。此外,XGBoost 工具支持自定义损失函数,只需函数支持一阶和二阶求导;
(2)Shrinkage(缩减): XGBoost和GBDT的每棵树都乘以学习速率。XGBoost 在进行完一次迭代后,,主要是为了削弱每棵树的影响,让后面有更大的学习空间。传统GBDT的实现也有学习速率;
(3)精度更高: GBDT 只用到一阶泰勒展开,而 XGBoost 对损失函数进行了二阶泰勒展开。XGBoost 引入二阶导一方面是为了增加精度,另一方面也是为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数;
(4)正则化:XGBoost 在目标函数中加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、叶子节点权重的L2范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合,这也是XGBoost优于传统GBDT的一个特性。
(5)列抽样: XGBoost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算。这也是XGBoost异于传统GBDT的一个特性;
(6)XGBoost工具支持并行: boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t−1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
(7)可并行的近似算法: 树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以XGBoost还提出了一种可并行的近似算法,用于高效地生成候选的分割点。
(8)缺失值处理: 对于特征的值有缺失的样本,XGBoost 采用的稀疏感知算法可以自动学习出它的分裂方向;
缺点:
(1)预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。
(2)虽然利用预排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂时计算分裂增益 仍需要遍历数据集,对每个样本的梯度求和;
(3)对 cache 优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对 cache 进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的 cache miss。
XGBoost相比GBDT做的改进:
过拟合现象:训练集上损失不断减小,测试集上损失逐渐增大。
欠拟合现象:训练误差和测试误差值均较高,随着训练时间及模型复杂度的增加而下降。
Dropout 仅在神经网络中用到,树模型中没有用到。
XGBoost 中的 subsample
参数用于控制每轮训练中随机选择的样本的比例
背诵技巧:nssle:目标函数正则化N -> 子/列采样S -> 学习率L --> Early Stopping E。
背诵技巧:
深入理解LightGBM_Microstrong0305的博客-CSDN博客
常用的机器学习算法,例如神经网络等算法,都可以以 mini-batch 的方式训练,训练数据的大小不会受到内存限制。而 GBDT 在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的 GBDT 算法是不能满足其需求的。
LightGBM 提出的主要原因就是为了解决 GBDT 在海量数据遇到的问题,让 GBDT 可以更好更快地用于工业实践。
Xgboost 原理:目前已有的 GBDT 工具基本都是基于预排序的方法(pre-sorted)的决策树算法(如 xgboost)。这种构建决策树的算法基本思想是:
这样的预排序算法的优点是:能精确地找到分割点。缺点也很明显:
(1)预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。
(2)时间复杂度高:虽然利用预排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂时计算分裂增益 仍需要遍历数据集,对每个样本的梯度求和;
(3)对 cache 优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对 cache 进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的 cache miss。
记忆宝典: light光线直(直方图)着并行射下来(并行优化;光线是一条条的分类的(直接支持类别特征处理);深度优先遍历的leaf wise生长策略 效率、精度更高且能防止过拟合:
直方图算法的基本思想是将训练样本的每一维特征离散化成k个整数,构造一个宽度为k的直方图,遍历数据时将离散化后的值作为索引在直方图中累积统计量(一般是1阶梯度之和、样本数量(2阶梯度为1)),当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
直方图算法优缺点:
O(#data*#feature)
优化到O(k*#features)
。最后,精度下降但提高模型的泛化能力:Histogram 算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,但是因为决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合。即单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。
LightGBM 另一个优化是 Histogram(直方图)做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM 可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。
LightGBM 还具有支持高效并行的优点。LightGBM 原生支持并行学习,目前支持特征并行和数据并行的两种。
Level-wise 过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上 Level-wise 是一种低效的算法,因为它不加区分的对待同一层的叶子,很多叶子的分裂增益较低,没必要进行搜索和分裂,带来了很多没必要的开销。
Leaf-wise 则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同 Level-wise 相比,在分裂次数相同的情况下,Leaf-wise 可以降低更多的误差,得到更好的精度。Leaf-wise 的缺点是可能会长出比较深的决策树,产生过拟合。因此 LightGBM 在 Leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
大多数机器学习工具都无法直接支持类别特征,一般需要把无序类别特征进行onehot encoding,有序类别特征进行label encoding,降低了空间和时间的效率。基于这个考虑,LightGBM 优化了对类别特征的支持,在决策树算法上增加了类别特征的决策规则,可以直接输入类别特征,不需要额外的编码。在 Expo 数据集上的实验,相比0/1 展开的方法,训练速度可以加速 8 倍,并且精度一致。据我们所知,LightGBM 是第一个直接支持类别特征的 GBDT 工具。
优点:
这部分主要总结下 LightGBM 相对于 XGBoost 的优点,从内存和速度两方面进行介绍。
缺点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。