传统机器学习算法

目录

1、LR

2、SVM

3、决策树和随机森林

4、GBDT

5、XGB


1、LR

(1)原理:

逻辑回归是线性回归的推广,通过逻辑函数将预测映射到0-1的区间,预测值可视为某一类别的概率。
模型仍是线性的,当数据线性可分时表现良好,同时也适用惩罚方法进行正则化。

(2)优势:输出结果有很好的概率解释,算法可通过正则化避免过拟合。容易适用梯度下降来更新参数。

(3)局限性:面对多元或非线性决策边界时性能较差。

2、SVM

(1)算法原理:使用一个名为核函数的技巧,来将非线性问题变换为线性问题,其本质是计算两个观测数据的距离。支持向量机算法所寻找的是能够最大化样本间隔的决策边界,因此又被称为大间距分类器。

在实践中,支持向量机最大用处是用非线性核函数来对非线性决策边界进行建模。

(2)KKT条件的意义:https://zhuanlan.zhihu.com/p/38163970

(3)拉格朗日对偶问题:https://www.cnblogs.com/90zeng/p/Lagrange_duality.html

(4)损失函数:hinge Loss

传统机器学习算法_第1张图片

(5)优点:支持向量机能对非线性决策边界建模,又有许多可选的核函数。在面对过拟合时,支持向量机有着极强的稳健性,尤其是在高维空间中。
        缺点:支持向量机是内存密集型算法,选择正确的核函数就需要相当的j技巧,不太适用较大的数据集。在当前的业界应用中,随机森林的表现往往要优于支持向量机。

(6)核函数:

  • 有效性:核函数矩阵KK是对称半正定矩阵
  • 常见核函数:线性核函数,多项式核函数,高斯核函数,指数核函数
  • 区别:线性简单,可解释性强,只用于线性可分问题。多项式可解决非线性,参数太多。高斯只需要一个参数,计算慢,容易过拟合。
  • 高斯核比线性核有更好的精度,但实际应用中一般用线性核;
    因为如果训练的样本的量很大,训练得到的模型中支持向量的数量太多,在每次做预测时,高斯核需要计算待预测样本与每个支持向量的内积,然后做核函数变换,这个过程非常耗时,而线性核只需要计算X^{T} + b
  • 选择方式
    特征维数高选择线性核
    样本数量可观、特征少选择高斯核(非线性核)
    样本数量非常多选择线性核(避免造成庞大的计算量)

(7)为什么要转化成对偶形式
方便核函数的引入(转化后为支持向量内积计算,核函数可以在低纬中计算高维的内积),改变复杂度(求W变成求a(支持向量数量))

(8)SVM的超参:C和gamma,C正则系数,gamma决定支持向量的数量

3、决策树和随机森林

(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)随机森林:

  • 生成方式:随机生成的具有多棵决策树的分类器。输出结果由多棵树的输出结果加权或者取平均而成。
  • 随机性体现在:训练数据采用bootstrap方式,从数据集中取出一个样本数为N的训练集;在每个节点上,随机选择所有特征的一个子集
  • 优点:在很多数据集上表现良好;
    能够处理高纬度的数据,且不用做特征选择(特征子集是随机选择的);
    训练速度快,容易做成并行化方法(训练时,树与树之间相互独立);
    训练过程中,能检测到特征间的相互影响

(4)随机森林对比GBM

  • RF采用bagging技术做出预测;GBM采用boosting技术做出预测
  • bagging技术,数据集采用bootstrap随机采样的方法被划分为n个样本,对多棵树的结果进行加权或者取平均;boosting在第一轮预测之后,增加分类出错的样本权重,减小错误率高的基学习器(树)的权重,持续进行,一直到达停止标准。
  • RF采用减小方差提高模型精度,生成树之间没有相关性;GBM在提高精度的同时降低了偏差和方差,某一个基学习器是以上一个基学习器的结果为基础,基学习器之间具有相关性。

4、GBDT

(1)算法原理

Boosting 是一族可将弱学习器提升为强学习器的算法,属于集成学习(ensemble learning)的范畴。Boosting 方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断要好。boosting的思想:

  1. 增大训练集中,分错样本的权重,减小分对样本的权重
  2. 增大分错率低的学习器的权重,减小分错率高的学习器的权重。

基于梯度提升算法的学习器叫做 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)决策树剪枝

  • 预剪枝:提前结束决策树的增长:类目数量、方差 性能提升
  • 后剪枝:决策树生长完成之后再进行剪枝

5、XGB

(1)对比传统GBDT的优点

GBDT:

  • GBDT 它的非线性变换比较多,表达能力强,而且不需要做复杂的特征工程和特征变换。
  • GBDT 的缺点也很明显,Boost 是一个串行过程,不好并行化,而且计算复杂度高,同时不太适合高维稀疏特征;
  • 传统 GBDT 在优化时只用到一阶导数信息。

Xgboost:

  1. 显示的把树模型复杂度作为正则项加到优化目标中。
  2. 公式推导中用到了二阶导数,用了二阶泰勒展开。(GBDT 用牛顿法貌似也是二阶信息)
  3. 实现了分裂点寻找近似算法。
  4. 利用了特征的稀疏性。
  5. 数据事先排序并且以 block 形式存储,有利于并行计算。
  6. 基于分布式通信框架 rabit,可以运行在 MPI 和 yarn 上。(最新已经不基于 rabit 了)
  7. 实现做了面向体系结构的优化,针对 cache 和内存做了性能优化。

(2)二阶泰勒展开项和正则项

传统机器学习算法_第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如何调参:

主要参数有:

  • booster:使用哪个弱学习器训练,默认gbtree,可选gbtree,gblinear 或dart;
  • eta(learning_rate):learning_rate,在更新中使用步长收缩以防止过度拟合,默认= 0.3,范围:[0,1];典型值一般设置为:0.01-0.2
  • gamma(min_split_loss):默认= 0,分裂节点时,损失函数减小值只有大于等于gamma节点才分裂,gamma值越大,算法越保守,越不容易过拟合,但性能就不一定能保证,需要平衡。范围:[0,∞]
  • max_depth:默认= 6,一棵树的最大深度。增加此值将使模型更复杂,并且更可能过度拟合。范围:[0,∞]
  • min_child_weight:默认值= 1,如果新分裂的节点的样本权重和小于min_child_weight则停止分裂 。这个可以用来减少过拟合,但是也不能太高,会导致欠拟合。范围:[0,∞]
  • max_delta_step:默认= 0,允许每个叶子输出的最大增量步长。如果将该值设置为0,则表示没有约束。如果将其设置为正值,则可以帮助使更新步骤更加保守。通常不需要此参数,但是当类极度不平衡时,它可能有助于逻辑回归。将其设置为1-10的值可能有助于控制更新。范围:[0,∞]
  • subsample:默认值= 1,构建每棵树对样本的采样率,如果设置成0.5,XGBoost会随机选择一半的样本作为训练集。范围:(0,1]

参数调优的一般步骤:

  • 1.确定(较大)学习速率和提升参数调优的初始值
  • 2.max_depth 和 min_child_weight 参数调优
  • 3.gamma参数调优
  • 4.subsample 和 colsample_bytree 参数优
  • 5.正则化参数alpha调优
  • 6.降低学习速率和使用更多的决策树

(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比较

  • XGB比GBDT新增内容:
    1.损失函数:加入正则化项:L1叶子节点数,L2叶子节点输出Score
    2.导数:使用代价函数的二阶展开式来近似表达残差
    3.基分类器:XGB支持线性分类器做基分类器
    4.处理缺失值:寻找分割点时不考虑缺失值。分别计算缺失值在左右的增益。测试首出现缺失,默认在右。
    5.近似直方图算法:采用加权分位数法来搜索近似最优分裂点 6.Shrinkage(缩减):将学习到的模型*系数,削减已学模型的权重
    7.列采样:特征采样。
    8.并行计算:特征预排序,特征分裂增益计算(均在特征粒度上)
  • LGB比XGB新增内容(GBDT+GOSS+EFB):
    1.节点分裂准则:XGB一次分裂一层节点(浪费),LGB深度优先分裂(过拟合)
    2.决策树算法:基于histogram直方图分箱操作。减存加速
    3.直接支持类别特征,无需独热操作
    4.特征并行,数据并行
    5.GOSS:单边采样:保留大梯度样本,随机采样小梯度样本
    6EFB:归并很少出现的特征为同一类

参考:

【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

你可能感兴趣的:(传统机器学习算法)