目录
1、LR
2、SVM
3、决策树和随机森林
4、GBDT
5、XGB
(1)原理:
逻辑回归是线性回归的推广,通过逻辑函数将预测映射到0-1的区间,预测值可视为某一类别的概率。
模型仍是线性的,当数据线性可分时表现良好,同时也适用惩罚方法进行正则化。
(2)优势:输出结果有很好的概率解释,算法可通过正则化避免过拟合。容易适用梯度下降来更新参数。
(3)局限性:面对多元或非线性决策边界时性能较差。
(1)算法原理:使用一个名为核函数的技巧,来将非线性问题变换为线性问题,其本质是计算两个观测数据的距离。支持向量机算法所寻找的是能够最大化样本间隔的决策边界,因此又被称为大间距分类器。
在实践中,支持向量机最大用处是用非线性核函数来对非线性决策边界进行建模。
(2)KKT条件的意义:https://zhuanlan.zhihu.com/p/38163970
(3)拉格朗日对偶问题:https://www.cnblogs.com/90zeng/p/Lagrange_duality.html
(4)损失函数:hinge Loss
(5)优点:支持向量机能对非线性决策边界建模,又有许多可选的核函数。在面对过拟合时,支持向量机有着极强的稳健性,尤其是在高维空间中。
缺点:支持向量机是内存密集型算法,选择正确的核函数就需要相当的j技巧,不太适用较大的数据集。在当前的业界应用中,随机森林的表现往往要优于支持向量机。
(6)核函数:
(7)为什么要转化成对偶形式
方便核函数的引入(转化后为支持向量内积计算,核函数可以在低纬中计算高维的内积),改变复杂度(求W变成求a(支持向量数量))
(8)SVM的超参:C和gamma,C正则系数,gamma决定支持向量的数量
(1)训练参数
criterion :分裂标准 分类---“gini”;回归---“mse” entropy:分裂节点时的评价指标是信息增益
max_depth:树的最大深度。如果为None,则深度不限,直到所有的叶子节点都是纯净的,即叶子节点中所有的样本点都属于一个类别。或者每个叶子节点样本数目小于min_sample_split
min_sample_split:分裂一个叶子节点所需要的最小样本数
min_sample_leaf:每个叶子节点包含的最小样本数
min_weight_fraction_leaf:叶子节点中样本的最小权重
max_feature:分类时考虑的最多特征数
random_state:随机数生成器的种子
max_leaf_nodes:最大叶子节点数量
min_impurity_split:树生长过程中过早停止的阈值。
presort:是否需要提前排序数据
(2)节点处的分割标准
DecisionTreeClassifier()----criterion:'gini' or 'entropy'(default =gini),前者是基尼系数,后者是信息熵(信息增益)
DecisionTreeRgrossor()----criterion:'mse' 均方误差
(3)随机森林:
(4)随机森林对比GBM
(1)算法原理
Boosting 是一族可将弱学习器提升为强学习器的算法,属于集成学习(ensemble learning)的范畴。Boosting 方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断要好。boosting的思想:
基于梯度提升算法的学习器叫做 GBM(Gradient Boosting Machine)。理论上,GBM 可以选择各种不同的学习算法作为基学习器。GBDT 实际上是 GBM 的一种情况。
梯度提升方法倾向于选择决策树作为基学习器,因为决策树可以认为是 if-then 规则的集合,易于理解,可解释性强,预测速度快。同时,决策树算法相比于其他的算法需要更少的特征工程,比如可以不用做特征标准化,可以很好的处理字段缺失的数据,也可以不用关心特征间是否相互依赖等。决策树能够自动组合多个特征。GBDT就是GB和DT的结合。
不过,单独使用决策树算法时,有容易过拟合缺点。所幸通过各种方法,抑制决策树的复杂性,降低单颗决策树的拟合能力,再通过梯度提升的方法集成多个决策树,最终能够很好的解决过拟合的问题。由此可见,梯度提升方法和决策树学习算法可以互相取长补短,是一对完美的搭档。
至于抑制单颗决策树的复杂度的方法有很多,比如限制树的最大深度、限制叶子节点的最少样本数量、限制节点分裂时的最少样本数量、吸收 bagging 的思想对训练样本采样(subsample),在学习单颗决策树时只使用一部分训练样本、借鉴随机森林的思路在学习单颗决策树时只采样一部分特征、在目标函数中添加正则项惩罚复杂的树结构等。
(2)损失函数
https://blog.csdn.net/qfikh/article/details/102884930
(3)树如何分裂
单颗决策树的学习过程可以大致描述为: 1. 枚举所有可能的树结构 q 2. 用等式(8) 为每个 q 计算其对应的分数 Obj,分数越小说明对应的树结构越好 3. 根据上一步的结果,找到最佳的树结构,用等式(7) 为树的每个叶子节点计算预测值
然而,可能的树结构数量是无穷的,所以实际上我们不可能枚举所有可能的树结构。通常情况下,我们采用贪心策略来生成决策树的每个节点。
1. 从深度为 0 的树开始,对每个叶节点枚举所有的可用特征 2. 针对每个特征,把属于该节点的训练样本根据该特征值升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的最大收益(采用最佳分裂点时的收益) 3. 选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,把该节点生长出左右两个新的叶节点,并为每个新节点关联对应的样本集 4. 回到第 1 步,递归执行到满足特定条件为止
(4)随机森林对比GBDT
相同点:
都是由多棵树组成,最终的结果都是由多棵树一起决定。
不同点:
组成随机森林的树可以分类树也可以是回归树,而GBDT只由回归树组成
组成随机森林的树可以并行生成,而GBDT是串行生成
随机森林的结果是多数表决表决的,而GBDT则是多棵树累加之和
随机森林对异常值不敏感,而GBDT对异常值比较敏感
随机森林是减少模型的方差,而GBDT是减少模型的偏差
随机森林不需要进行特征归一化,而GBDT则需要进行特征归一化
(5)决策树剪枝
(1)对比传统GBDT的优点
GBDT:
Xgboost:
(2)二阶泰勒展开项和正则项
(3)XGB如何输出分类树的结果
主要有四种节点分裂方法:
Greedy Algorithm 贪心算法
Approximate Algorithm 近似算法
Weighted Quantities Sketch 加权分位数草图法
Sparsity-aware Split Finding 稀疏感知法
贪心算法:决策树(CART)使用的是精确贪心算法,也就是将所有特征的所有取值排序(耗时耗内存巨大),然后比较每一个点的Gini,找出变化最大的节点。当特征是连续特征时,对连续值离散化,取两点的平均值为分割节点。可以看到,这里的排序算法需要花费大量的时间,因为要遍历整个样本所有特征,而且还要排序。
近似算法:首先根据特征分布的百分位数(percentiles)提出候选分裂点,将连续特征映射到由这些候选点分割的桶中,汇总统计信息并根据汇总的信息在提案中找到最佳解决方案。对于某个特征k,算法首先根据特征分布的分位数找到特征切割点的候选集合S,然后将特征k的值根据集合S划分到桶(bucket)中,接着对每个桶内的样本统计值G、H进行累加,最后在这些累计的统计量上寻找最佳分裂点。
(4)XGB如何调参:
主要参数有:
参数调优的一般步骤:
(5)LightGBM对比XGB的优点
1、 XGB采用level-wise的分裂策略,LGB采用leaf-wise的策略,XGB对每一层所有节点做无差别分裂,但是可能有些节点增益非常小,对结果影响不大,带来不必要的开销。Leaf-wise是在所有叶子节点中选取分裂收益最大的节点进行的,但是很容易出现过拟合问题,所以需要对最大深度做限制
2、 XGB使用近似算法,LGB使用基于立方图的决策算法,histogram算法在内存和计算代价上都有不小的优势。
内存上:
直方图算法的内存消耗为(#data* #features * 1Bytes)(因为对特征分桶后只需保存特征离散化之后的值) xgboost的exact算法内存消耗为:(2 * #data * #features* 4Bytes),因为xgboost既要保存原始feature的值,也要保存这个值的顺序索引,这些值需要32位的浮点数来保存。
计算上:
预排序算法在选择好分裂特征计算分裂收益时,需要遍历所有样本的特征值,时间为(#data), 直方图只需要遍历桶就行,时间为(#data)
3、 LGB可以使用直方图做差加速,一个节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算
4、 XGBoost无法直接输入类别型变量,因此需要事先对类别型变量进行编码(例如独热编码);LightGBM可以直接处理类别型变量。
5、 但实际上xgboost的近似直方图算法也类似于lightgbm这里的直方图算法,为什么xgboost的近似算法比lightgbm还是慢很多呢?
xgboost在每一层都动态构建直方图, 因为xgboost的直方图算法不是针对某个特定的feature,而是所有feature共享一个直方图(每个样本的权重是二阶导),所以每一层都要重新构建直方图,而lightgbm中对每个特征都有一个直方图,所以构建一次直方图就够了。
6、 LightGBM 与 XGboost 的并行策略
特征并行
LGB特征并行的前提是每个worker留有一份完整的数据集,但是每个worker仅在特征子集上进行最佳切分点的寻找;worker之间需要相互通信,通过比对损失来确定最佳切分点;然后将这个最佳切分点的位置进行全局广播,每个worker进行切分即可。
XGB的特征并行与LGB的最大不同在于XGB每个worker节点中仅有部分的列数据,也就是垂直切分,每个worker寻找局部最佳切分点,worker之间相互通信,然后在具有最佳切分点的worker上进行节点分裂,再由这个节点广播一下被切分到左右节点的样本索引号,其他worker才能开始分裂。
二者的区别就导致了LGB中worker间通信成本明显降低,只需通信一个特征分裂点即可,而XGB中要广播样本索引。
数据并行
当数据量很大,特征相对较少时,可采用数据并行策略。LGB中先对数据水平切分,每个worker上的数据先建立起局部的直方图,然后合并成全局的直方图,采用直方图相减的方式,先计算样本量少的节点的样本索引,然后直接相减得到另一子节点的样本索引,这个直方图算法使得worker间的通信成本降低一倍,因为只用通信以此样本量少的节点。XGB中的数据并行也是水平切分,然后单个worker建立局部直方图,再合并为全局,不同在于根据全局直方图进行各个worker上的节点分裂时会单独计算子节点的样本索引,因此效率贼慢,每个worker间的通信量也就变得很大。
投票并行(LGB)
当数据量和维度都很大时,选用投票并行,该方法是数据并行的一个改进。数据并行中的合并直方图的代价相对较大,尤其是当特征维度很大时。
大致思想是:每个worker首先会找到本地的一些优秀的特征,然后进行全局投票,根据投票结果,选择top的特征进行直方图的合并,再寻求全局的最优分割点。
(6)GBDT、XGB、LGB比较
参考:
【1】https://blog.csdn.net/jamexfx/article/details/93780308
【2】https://zhuanlan.zhihu.com/p/162001079
【3】https://zhuanlan.zhihu.com/p/143009353
【4】https://zhuanlan.zhihu.com/p/99069186