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

文章目录

  • Xgboost简介
  • 原理介绍
    • 计算叶子阶段的权重
    • 构建第k棵树的结构
  • 常见面试问题
    • 如何实现并行?
    • 怎样防止过拟合
    • 学习率的作用?
    • 如何处理缺失值?
    • 不足
    • XGboost相对于GDBT的改进?
  • Python API: xgboost
    • xgboost.XGBClassifier().fit()和xgboost.train()的区别
    • xgb.train()中参数的解释
    • 官方文档

Xgboost简介

论文:https://arxiv.org/pdf/1603.02754.pdf

XGBoost的全称是eXtreme Gradient Boosting,是2014年3月陈天奇博士提出的,是基于CART树的一种boosting算法。

原理介绍

xgboost是集成了K棵树之后的集成模型,如下图所示。
大厂面试机器学习算法(4)XGBoost_第1张图片

  • 每个样本需要经过K棵决策树
  • 最终的结果是每棵树的结果(对应叶子节点分数)之和,如下图所示。
    大厂面试机器学习算法(4)XGBoost_第2张图片
    对应的有以下两个关键问题:
  • 针对每棵树,如何计算每个叶子的权重w(分数)?
  • 针对每棵树,如何构建整棵树的结构?

计算叶子阶段的权重

1. 定义目标函数
XGboost采用的是加法训练,首先优化第一棵树,之后再优化第二棵树,直至优化完k棵树。
在优化第t棵树时,前t-1课已定, y t = y t − 1 + f t ( x ) y^t = y^{t-1}+f_t(x) yt=yt1+ft(x)
n为样本数量,Obj为预测值与真实值之间的损失 l ( y , y ^ ) l(y,\hat{y}) l(y,y^)(如MSE)与惩罚项 Ω \Omega Ω 之和。
大厂面试机器学习算法(4)XGBoost_第3张图片
2. 二阶泰勒展开
XGboost使用二阶泰勒展开进行优化。泰勒公式为:
在这里插入图片描述
二次展开公式:
在这里插入图片描述
此处将 l ( y i , y ^ i t − 1 ) l(y_i,\hat{y}_i^{t-1}) l(yi,y^it1)看做 f ( x ) f(x) f(x) f t ( x ) f_t(x) ft(x)看做△x,得:
大厂面试机器学习算法(4)XGBoost_第4张图片
其中 l ( y i , y ^ i t − 1 ) l(y_i,\hat{y}_i^{t-1}) l(yi,y^it1)为常数项(前t-1棵树已经优化完了),所以可以去掉,对函数没有影响;
g i g_i gi h i h_i hi分别表示对x(即 y ^ t − 1 \hat{y}^{t-1} y^t1)的一阶、二阶导(函数中没有 f t ( x ) f_t(x) ft(x),也是常数)。
大厂面试机器学习算法(4)XGBoost_第5张图片
3. 惩罚项量化
树的复杂度由叶子结点个数T和各个叶子结点的w表示:
大厂面试机器学习算法(4)XGBoost_第6张图片
进一步将 f t ( x ) f_t(x) ft(x)替换为 w w w,其中 I j I_j Ij表示被分到第j个叶子结点下的样本的下标集合:
大厂面试机器学习算法(4)XGBoost_第7张图片
至此,我们完成了第t棵树的叶子结点的权重计算。那么我们如何构建这个数的结构呢?

构建第k棵树的结构

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

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

因为我们想要得到最小值,所以判断当前节点是否继续划分的标准是:划分后的score应比划分前的score要更小;确定划分点的标准为:选择(划分前score-划分后score)最大的切分点作为这一次的划分点。
I = I L ∪ I R I = I_L\cup I_R I=ILIR,则有:
在这里插入图片描述
2. 近似算法:分桶
用贪心算法来寻找最佳划分点,准确度非常不错,但是时间复杂度和空间复杂度都太高了,作者提出一种近似法分位法,先对数据进行分桶(Bucket),然后桶内的数据相加起来,作为一个代表来进行计算。
分桶有两种方式:

  1. 全局分桶(Global Bucket),可以一开始就对全部的数据进行分桶。后面进行划分的时候只需要使用分桶数据就可以了。
  2. 局部分桶(Local Bucket),每次需要对当前leaf node 进行划分的时候,对当前节点里面的数据进行分桶。然后再划分。当然这个时间复杂度也会变的比较高。

作者测试对几种不同的切分算法的AUC结果比较。可以看得出,当eps=0.05,也就是将数据分成20个Bucket的时候,AUC的分数跟精准的贪心算法一样。
大厂面试机器学习算法(4)XGBoost_第8张图片

常见面试问题

如何实现并行?

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

怎样防止过拟合

  1. 在损失函数中添加正则项。
  2. 添加类似梯度下降优化问题中的学习率 η \eta η,在累加时用得分乘以这个学习率。这可以收缩每棵树的权重,让每棵树的生长更加稳定。
  3. 对样本的特征随机抽样。每次生成树的时候,只用其中一部分抽样的特征。这样子也能搞比较好的降低过拟合的风险。而且有研究怎么特征抽样效果比样本抽样效果更好。

学习率的作用?

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

如何处理缺失值?

每次计算Gain的时候分别遍历将含有缺失值的结点分别加到左边或者右边,选择Gain最大的方向作为缺失值应该在的方向。
大厂面试机器学习算法(4)XGBoost_第10张图片

不足

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

XGboost相对于GDBT的改进?

  1. 传统的GBDT算法以CART作为基分类器,xgboost还可以支持线性分类器,相当于带L1和L2的逻辑斯谛回归或者线性回归。
  2. 传统的GBDT在优化的时候,使用的是一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶导数和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  3. xgboost在代价函数中加入了正则项,用于控制模型的复杂度。正则项里面包括树的叶子节点的个数、每个叶子节点上输出的score的L2模的平方和。( 从Bias-variance tradeoff 的角度来说,正则化降低了模型的variance,使得到的模型更加简单,防止过拟合,这是xgboost优于传统的GBDT的一个特征)
  4. 列抽样(column sampling),借鉴了随机森林的做法,支持列抽样可以降低过拟合,同时减少了计算量,这也是xgboost异于传统gbdt的一个特性,sklearn中已经实现行采样和列采样,同样xgboost也是可以实现的。

Python API: xgboost

xgboost.XGBClassifier().fit()和xgboost.train()的区别

Python xgboost库中有两种训练模型的方法。
import xgboost as xgb

  1. xgboost.XGBClassifier().fit()
xgm = xgb.XGBClassifier()
xgm.fit(X_train, y_train)   
y_pred = xgm.predict(X_test)  
  1. xgboost.train()
param = {'max_depth':2, 'eta':1, 'silent':1, 'objective':'binary:logistic' }
dtrain = xgb.DMatrix(X_train, y_train)
dtest = xgb.DMatrix(X_test)
bst = xgb.train(list(param), dtrain)
preds = bst.predict(dtest)

xgb.train()中参数的解释

参见这篇博客

官方文档

XGboost documentation

你可能感兴趣的:(数据分析与机器学习,算法,决策树,机器学习)