如果年少的我不懦弱

C语言 struct()结构体定义和使用方法 代码详解 知识点全面

  返回  

大厂面试机器学习算法(4)XGBoost

2021/8/20 13:25:34 浏览:

文章目录

  • Xgboost简介
  • 整体介绍
  • 计算叶子阶段的权重
  • 构建第k棵树的结构
  • 常见面试问题
    • 如何实现并行?
    • 学习率的作用?
    • 如何处理缺失值?

Xgboost简介

XGBoost的全称是eXtreme Gradient Boosting,它是经过优化的分布式梯度提升库,旨在高效、灵活且可移植。XGBoost是大规模并行boosting tree的工具,它是目前最快最好的开源 boosting tree工具包,比常见的工具包快10倍以上。

整体介绍

xgboost是集成了K棵树之后的集成模型,如下图所示。
在这里插入图片描述

  • 每个样本需要经过K棵决策树
  • 最终的结果是每棵树的结果(对应叶子节点分数)之和,如下图所示。

在这里插入图片描述

对应的有以下两个关键问题:

  • 针对每棵树,如何计算每个叶子的权重w/分数?
  • 针对每棵树,如何构建整棵树的结构?

计算叶子阶段的权重

  • 权重在目标函数中的作用:对于每棵树,只有叶子结点具有权重,对权重求取第二范式可用于计算模型复杂度。
  • 权重在最终分类时的作用:最终求得的 ω \omega ω 乘以叶子结点的预测值即为被分到该叶子结点的样本预测为正例(或负例)的概率,再将该概率与阈值(如0.5)作比较,得到最终的分类结果。

以下是以计算第t棵树节点的权重举例。
在这里插入图片描述
在这里插入图片描述

l(y, y’)是我们的损失函数:例如MSE
在这里插入图片描述

进一步如何量化?

  • 树的复杂度
  • 以及各个叶子结点的w
    树的复杂度
    在这里插入图片描述
    在这里插入图片描述

至此,我们完成了第t棵树的叶子结点的权重计算。那么我们如何构建这个数的结构呢?

构建第k棵树的结构

构建树有多种算法,这里我们以贪心算法为例,说明构建树的过程。
算法流程

  1. 对每个节点枚举所有的可用特征;
  2. 针对每个特征,把属于该节点的训练样本根据该特征值进行升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的分裂收益;
  3. 选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,在该节点上分裂出左右两个新的叶节点,并为每个新节点关联对应的样本集;
  4. 回到第1步,递归执行直到满足特定条件为止;
    在这里插入图片描述

常见面试问题

如何实现并行?

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

学习率的作用?

Shrinkage(缩减):相当于学习速率。XGBoost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。传统GBDT的实现也有学习速率;

如何处理缺失值?

每次计算Gain的时候分别遍历将含有缺失值的结点分别加到左边或者右边,选择Gain最大的方向作为缺失值应该在的方向。
在这里插入图片描述

不足:
xgboost本质上还是一个基于现有特征的分类器,并不能实现特征交叉的功能,需要手动手工的对特征进行交叉发现新的有效特征。

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号