面试题目小结1(RF GBDT Xgb)

RF与GBDT的区别

  1. 相同点:

  • 都是基于树模型的集成学习方法
  • 最终的结果都是由多颗树一起决定

  2. 不同点:

  • RF的基学习器可以是分类树也可以是回归树,GBDT只由回归树组成
  • RF可以并行生成,GBDT只能串行
  • RF的结果为多数表决或者平均值,GBDT则是多颗树累加之和
  • RF对异常值不太敏感(数据的数据、特征的随机),GBDT对异常值敏感
  • RF减少的是方差、GBDT减少的是偏差
  • RF不需要进行数据预处理(特征归一化),GBDT需要特征归一化(GBDT通过拟合残差来训练,因此需要归一化处理,这里有梯度下降为什么需要对特征归一化的解释

 

Xgb使用二阶导的好处:

  • 可以适配不同的损失函数:Xgb树分类的准则是通过对损失函数求解得出的,且这个标准只和损失函数的一阶导和二阶导有关,那么不管用什么损失函数,只需要处理好其一、二阶导数就好。
  • 二阶导的引导可以加速收敛。

 

分类树和回归树的区别

  • 分类树使用信息增益或者增益比率来划分节点;最终的结果采取投票的形式决定
  • 回归树使用最小化均方误差划分节点;每个节点样本的均值作为测试样本的回归预测值

 

GBDT、Xgb的区别

  GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。

  Xgb是GBDT算法的一种很好的工程实现,并且在算法上做了一些优化,主要有以下几个优化:首先在损失函数部分,加了显示的正则化项,限制了CART叶子节点的个数、对叶子节点的权重有一个约束;再就是二阶泰勒展开去拟合损失函数,让梯度收敛更快更准确(梯度收敛更快更准确。这一点在优化算法里的牛顿法里已经证实了,而且还能增加Xgb的适用性);其次Xgb支持对数据进行采样,不仅能有效降低过拟合的风险还能降低计算的成本;再就是树结构调整方面,它不需要遍历所有可能的分裂点了,采用了一种近似估计分裂点的算法;最后是Xgb能够自动处理缺失值(把缺失值放到两边,看放到那边增益大),能够分块并行、缓存优化

  (1) 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的。

  (2) 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。为什么xgboost要用泰勒展开,优势在哪里?xgboost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。

  (3) Xgboost在代价函数里加入了正则项,用于控制模型的复杂度,降低了过拟合的可能性。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和

  (4) Xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。这部分详见这里

 

RF与Xgb特征重要计算方式:

  1.RF

    RF主要有基于基尼指数以及基于袋外数据两种方式,详见这里

  2. Xgb

    Xgb主要有三种计算方法:

      a. importance_type=weight(默认值),特征重要性使用特征在所有树中作为划分属性的次数

      b. importance_type=gain,特征重要性使用特征在作为划分属性时loss平均的降低量

      c. importance_type=cover,特征重要性使用特征在作为划分属性时对样本的覆盖度

 

针对GBDT的一些提问:

  1) 怎样设置单棵树的停止生长条件?

    a. 设置分裂节点的最小样本数

    b. 限制树的深度

    c. 设置最多叶子节点个数

    d. 给loss设置约束条件

  2)如何评估特征的权重大小?

    a. 计算每个特征在训练集下的信息增益,最后计算每个特征信息增益与所有特征信息增益的之和的比例。

    b. 借鉴投票机制。用相同的gbdt参数对每个特征训练出一个模型,然后在该模型下计算每个特征正确分类的个数,最后计算每个特征正确分类的个数与所有正确分类个数之和的比例为权重值。

  3)当增加样本数量时,训练时长是线性增加的吗?

    不是。损失函数的极小值与样本数量并不是线性相关的。

  4)当增加树的数量的时候,训练时长是否线性增加

    不是。每棵树生成的时间是不一样的。

  5)当增加一颗树叶子节点树木的时候,训练时长是否线性增加

    否,叶子节点数和每棵树的生成的时间复杂度不成正比。

  6)每个节点上都保存什么信息?

    中间节点保存某个特征的分裂值,叶结点保存预测是某个类别的概率。

  7)如何防止过拟合?

    a. 增加样本数量,减少噪声

    b. 减少特征,选取重要特征

    c. 对样本进行采样。

    d. 对特征进行采样。但采样有个很严重的问题,就是不可复现,也就是每次的训练结果不一样,不知道是调了参数导致效果好,还是采样导致效果好,还是其他的?

    e. 在迭代中,动态调整学习率。(早停)

    f. 对回归树进行剪枝。

    g. 减少回归树的个数, 尤其那些作用不大的回归树(在验证集上进行测试)。

  8)gbdt中哪些部分可以并行?

    a. 梯度计算

    b. 选取最优分裂点的时候

    c. 梯度更新

    d. 预测最终结果,累加所有树的预测结果的时候

  9)  树生长成畸形树,会带来哪些危害,如何预防?

    在生成树的过程中,加入一些树不平衡的约束条件。例如对 样本集中分到某个节点,而另一个节点的样本很少的情况进行惩罚。

posted @ 2020-04-21 18:24  猪突猛进!!!  阅读(1127)  评论(0编辑  收藏  举报