【机器学习基础】集成模型

文章目录

    • 概述
    • 1. Boosting
    • 2. Bagging
      • 偏差和方差的区别
    • 3. Stacking
    • 4. Dropout训练
    • Random Forest
      • 1.原理
      • 2.优缺点
        • 拓展:【RF模型能够输出特征的重要性程度】
    • GBDT
      • 1. GBDT适用范围?
      • 2. GBDT和随机森林(RF)的区别?
      • 3. GBDT相较于决策树有什么优点?
      • 4. GBDT的gradient体现在哪里?
      • 5. GBDT的re-sample
    • Xgboost
      • 建树方式
      • 树分裂方式:exact
      • 树集成方式
      • 分布式
      • 稀疏数据
      • level_wise
    • LGBM
      • 树分裂方式
      • 建树方式:hist
      • 分布式
      • 类别特征
    • 常见问题
      • 1. Bagging vs Boosting
      • 2. Xgboost vs GBDT
      • 拓:Xgboost vs LGBM
      • 3. 为什么xgboost使用泰勒展开?
      • 4. Xgboost如何寻找最优特征?是有放回还是无放回?
      • 5. gbdt原理
      • 6. xgboost源码看过吗

概述

  • 个体学习器之间存在强依赖关系,必须串行生成的序列化方法*
  • 个体学习器之间不存在强依赖关系,可同时生成的并行化方法
    1.【机器学习基础】决策树及其ensemble方法(RF, LGBM, Xgboost, GBDT, 梯度提升boosting)

1. Boosting

降低偏差(bias)

2. Bagging

降低方差

偏差和方差的区别

偏差:预估值与真实值的偏离程度,是算法对数据的拟合能力。
方差:数据扰动,训练集变化时,模型的学习性能。
噪声:任何学习算法在泛化能力的下界,是学习问题本身的难度。

3. Stacking

将第一层的输出train再结合其他的特征集再做一层,就是stacking。例如gbt+lr

4. Dropout训练

Dropout 训练继承模型的方式 from 花书7.12
Dropout 训练的集成包括所有从基础网络除去非输出单元后形成的子网络。在 Dropout 的情况下,所有模型共享参数,其中每个模型继承父神经网络参数的不同子集。

Random Forest

1.原理

在Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择。过程分为四个部分:

  • 随机选择样本(bootstrap放回抽样)
  • 随机选择特征
  • 构建决策树
  • 随机森林投票(平均)

2.优缺点

(1)缺点:

  • 随机森林在分类的效果比回归好。因为RF并不能给出一个连续型的输出。而且预测的时候不能超出数据的范围,可能导致有噪声的数据出现过拟合。
  • 忽略属性之间可能存在的相关性
  • 无法控制模型内部的运行,只能在不同的参数和随机种子之间进行尝试
    (2)优点:
  • 高度并行,易于分布式实现
  • 随机森林可以解决分类和回归,方差和偏差都较低,泛化性能比较好
  • 对高维数据处理很好,并确定最重要的变量,因此被认为是一个不错的降维方法。
  • 存在分类不平衡时,可以提供平衡数据集误差的方法?
  • 由于是树模型,不需要归一化即可直接使用

拓展:【RF模型能够输出特征的重要性程度】

利用随机森林对特征重要性进行评估
本质:计算该特征在分支前后对树的平均gini提升占比所有特征的值。
步骤:

  1. 计算所有树中该特征节点分支前后的所有 gini 指数,包括分支前一个,分支后两个。
  2. 计算每棵树中gini指数的变化量 = gini前 - gini后一 - gini后二
  3. sum(每棵树的delta gini)/所有特征的delta gini

GBDT

1. GBDT适用范围?

  • GBDT 可以适用于回归问题(线性和非线性);
  • GBDT 也可用于二分类问题(设定阈值,大于为正,否则为负)和多分类问题。

2. GBDT和随机森林(RF)的区别?

相同点:) 都是多棵树
(2) 最终结构由多棵树共同决定
不同点:
(1) RF的组成可以是分类树、回归树;组成 GBDT 只能是回归树。
(2) RF的树可以并行生成(Bagging);GBDT 只能串行生成(Boosting)
(3) 对于最终的输出结果而言,RF使用多数投票或者简单平均;而 GBDT 则是将所有结果累加起来,或者加权累加起来;
(4) RF对异常值不敏感,GBDT 对异常值非常敏感;
(5) RF对训练集一视同仁权值一样,GBDT 是基于权值的弱分类器的集成;
(6) RF通过减小模型的方差提高性能,GBDT 通过减少模型偏差提高性能。

3. GBDT相较于决策树有什么优点?

泛化性能更好!GBDT 的最大好处在于,每一步的残差计算其实变相的增大了分错样本的权重,而已经分对的样本则都趋向于0。这样后面就更加专注于那些分错的样本。

4. GBDT的gradient体现在哪里?

可以理解为残差是全局最优的绝对方向,类似于求梯度。

5. GBDT的re-sample

GBDT 也可以在使用残差的同时引入 Bootstrap re-sampling,GBDT 多数实现版本中引入了这个选项,但是是否一定使用有不同的看法。
原因在于 re-sample 导致的随机性,使得模型不可复现,对于评估提出一定的挑战,比如很难确定性能的提升是由于 feature 的原因还是 sample 的随机因素。

Xgboost

不放回抽样
Xgboost是GBDT的一个变种,最大的区别是xgboost通过对目标函数做二阶泰勒展开,从而更新树的叶子的权重和树的权重,并根据loss function求出每一次分裂节点的损失减小的大小,根据分裂损失选择合适的属性进行分裂。
【源码参考:XGBoost解析系列–源码主流程】

建树方式

  • 和RF相同。在构建树的过程中,对每棵树随机选择一些属性作为分裂属性(build_single_tree的方法类似,即)
features = np.random.randint(0, col-1, col/2)
features = np.unique(features)
fea_list = features.tolist()
  • xgboost使用exact算法。

树分裂方式:exact

两种分裂算法:精确分裂exact,近似分裂approx。

  • 精确:把每个属性的每个取值作为阈值进行遍历切割,采用CART决策树。
  • 近似:对每个属性的所有取值进行分桶,按照各个桶之间的值作为划分阈值。(spark RF里面使用等频分桶) (spark里面使用sort实现)
//找到切分点(splits)及箱子信息(Bins)
//对于连续型特征,利用切分点抽样统计简化计算
//对于离散型特征,如果是无序的,则最多有个 splits=2^(numBins-1)-1 划分
//如果是有序的,则最多有 splits=numBins-1 个划分

xgboost的特点
提出了一种特殊的分桶策略,一般的分桶策略是每个样本的权重都是相同的,但是xgboost使每个样本的权重为损失函数在该样本点的二阶导。
(泰勒展开不应该是损失函数关于模型的展开吗?为什么会有在该样本点的二阶导这种说法? 因为模型是对所有样本点都通用的,把该样本输入到二阶导公式中就可以得到了)。

所有建树算法:‘auto’, ‘approx’, ‘exact’, ‘hist’, ‘gpu_exact’, ‘gpu_hist’等,默认设置为’auto’。使用’auto’自适应到具体的算法,对于数据量小于222222使用’exact’精确方法,否则会重置’approx’近视方法。计算批次量大小max_row_perbatch=min(用户设置max_row_perbatch, safe_max_row),进行批次处理,其中safe_max_row=216216

树集成方式

  • xgboost对每棵树的叶子节点个数和权重做了惩罚,避免过拟合。具体是:
    参数 * 叶子个数N + 参数 * sum(叶子权重 * 叶子上的样本数)

分布式

RF的并行化是树与树之间的并行化。
xgboost和boosting方法一样,在树的计算上是串行的,但是在构建树的过程中,也就是在分裂节点的时候支持并行化。
比如同时计算多个取值作为分裂特征及其值,然后选择收益最大的特征及其取值对节点分裂。
一般的feature parallel就是对数据做垂直分割(partiion data vertically,就是对属性分割),然后将分割后的数据分散到各个workder上,各个workers计算其拥有的数据的best splits point, 之后再汇总得到全局最优分割点。

【源码讲解】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BgQpzIKv-1621158296838)(evernotecid://F168D203-45D2-4FD0-BB36-6F63414FB4C7/appyinxiangcom/21940830/ENResource/p232)]
三个函数:

  • AddBudget:将每个不为0的值放到多个线程中,一个线程中统计该线程中不同值出现的次数。类似于map
  • InitStorage:统计多个线程中值的个数。类似于reduce
  • Push:进行排序。类似于shift
    稀疏矩阵的存储方式:外层一维数组,内层是每个feature不为0的值和不为0的值的偏移量。理解就是,假如有N个不为0的值,一个N✖️2的矩阵,第一行是值,第二行是位置(到0的偏移量)。

稀疏数据

xgboost在计算分裂收益的时候只利用了没有missing值的样本。但是在确定了树的结构的时候!xgboost分别假设该样本属于左子树和右子树,比较两者的分裂增益,选择增益较大的那一边作为该样本的分裂方向。

level_wise

对每一个叶节点进行增益的计算。

LGBM

树分裂方式

xgboost:level-wise. LGBM:leaf-wise.
xgboost对每一层所有节点进行无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,开销太大了。
leaf-wise是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归,但很容易过拟合,陷入比较高的深度当中,所以要对最大深度做限制,避免过拟合。

建树方式:hist

histogram算法在内存和计算代价上都有不小优势。

  • 内存上优势:直方图算对特征分桶后只需保存特征离散化之后的值,而xgboost的exact算法既要保存原始feature的值,也要保存这个值的顺序索引。
  • 计算上的优势,预排序算法需要遍历所有样本的特征值,,而直方图算法只需要遍历桶就行了。

为什么xgboost的近似直方图比LGBM的直方图算法慢?
一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算。
xgboost在每一层都动态构建直方图, 因为xgboost的直方图算法不是针对某个特定的feature,而是所有feature共享一个直方图(每个样本的权重是二阶导),所以每一层都要重新构建直方图,而lightgbm中对每个特征都有一个直方图,所以构建一次直方图就够了。

分布式

  • 特征计算增益
  • 数据集的直方图汇总的时候
    常用方式是各个worker做自己的直方图,然后汇总各个worker的直方图得到全局的直方图。LGBM是不汇总所有的直方图,只汇总不同worker的不同feature的直方图。

类别特征

在对离散特征分裂时,分裂时的增益算的是“是否属于某个类别的”增益。

常见问题

1. Bagging vs Boosting

1.最主要的区别是取样方式不同。Bagging的训练集的选择是随机均匀的,Boosting的训练集的选择与前面的学习结果有关,所以Boosting的分类精度要优于Bagging。
2.模型的集成方式上,Bagging的各个预测函数没有权重,Boosting有。
3.运行方式上,Bagging可以并行生成各个预测函数,Boosting只能顺序生成。所以针对NN,Bagging可以节省大量时间开销。
【Bagging是降低方差,Boosting是偏差】
理解:
Bagging是多个模型并行集成,并且样本可放回抽样。
Boosting是每一次都在修订前面模型的结果,也就是说在降低错误率,降低偏差。

2. Xgboost vs GBDT

1.xgboost使用了泰勒展开
2.xgboost使用了多线程
3.xgboost在代价函数中加入了正则项,用于控制模型的复杂度。

拓:Xgboost vs LGBM

4.LGBM基本原理与Xgboost一样,但是速度更快:

  • 分裂方式不同:xgboost是level-wise,GBDT是leaf-wise(xgboost对每一层所有节点进行无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,开销太大了)(GBDT更容易过拟合,需要控制最大深度)
  • 建树方式不同:Xgboost是exact,LGBM是hist(建树方式的原理说明;直方图可以直接相减计算)
  • 并发不同(两个并发的原理)
  • LGBM可以接受类别feature,类似于one-hot编码

3. 为什么xgboost使用泰勒展开?

使用泰勒展开是为了能够【自定义loss function】。
实际上,使用最小二乘法的损失函数进行直接推导和泰勒展开的推导结果相同。两者虽然结果相同,但是OLS的计算量太大了。在实际的代码过程中,任何损失函数只要二阶可导都可以【复用】泰勒展开,例如基于分类的对数损失函数。这样的话,【代码可以在分类和回归进行复用】。

4. Xgboost如何寻找最优特征?是有放回还是无放回?

Xgboost在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性。
无放回抽样。Xgboost是梯度优化模型,如果一个样本连续重复抽出,则梯度来回踏步,不利于收敛。

5. gbdt原理

提升树是:计算每个样本的残差,对残差进行拟合得到回归树。
GBDT(梯度提升树):使用loss function的偏导代替残差进行拟合。

6. xgboost源码看过吗

讲多线程计算的三个函数:
map -> reduce -> shift

你可能感兴趣的:(机器学习,面试)