🌠 『精品学习专栏导航帖』

  • 🐳最适合入门的100个深度学习实战项目🐳
  • 🐙【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码🐙
  • 🐶【机器学习入门项目10例目录】项目详解 + 数据集 + 完整源码🐶
  • 🦜【机器学习项目实战10例目录】项目详解 + 数据集 + 完整源码🦜
  • 🐌Java经典编程100例🐌
  • 🦋Python经典编程100例🦋
  • 🦄蓝桥杯历届真题题目+解析+代码+答案🦄
  • 🐯【2023王道数据结构目录】课后算法设计题C、C++代码实现完整版大全🐯

文章目录

  • 一、引言
  • 二、XGBoost算法
  • 1.xgboost算法原理
  • 2.构造目标函数
  • 3.泰勒级数近似目标函数
  • 4.将树结构引入目标函数
  • 4.1 表示第k棵树的预测值
  • 4.2 表示树的模型复杂度
  • 4.3 参数化目标函数
  • 5.贪心算法构建最优树

2021人工智能领域新星创作者,带你从入门到精通,该博客每天更新,逐渐完善机器学习各个知识体系的文章,帮助大家更高效学习。

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_人工智能


一、引言

XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,它可以称为机器学习树模型中的王牌选手,是各大数据科学比赛的大杀器。

之前我们讲过GBDT,它采用的是数值优化的思维, 用的最速下降法去求解Loss Function的最优解, 其中用CART决策树去拟合负梯度,而XGboost用的解析的思维, 对Loss Function展开到二阶近似, 求得解析解, 用解析解作为Gain来建立决策树, 使得Loss Function最优.

下面我们具体讲解下xgboost算法的详细流程。

二、XGBoost算法

1.xgboost算法原理

xgboost算法同样也是Boosting架构的一种算法实现,同样符合模型函数:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_人工智能_02
这里的K是指K棵树,就是K个基学习器,本文默认基学习器为树模型,其实现在XGBoost内部的基学习器可以使用linear学习器。

它和大部分机器学习模型结构差不多,也是定义了模型损失函数,然后进行优化,只不过是xgboost模型比较复杂,所以直接优化损失函数难度较大,所以才有了一系列的操作来进行简化。

xgboost算法主要有4个流程:

  1. 构造目标函数
  2. 将目标函数进行泰勒二阶展开
  3. 将目标函数参数化,将树结构引入目标函数
  4. 根据最优目标函数,构建最优树

2.构造目标函数

针对于该算法首先需要定义目标函数用来评估模型的好坏,在GBDT中我们的目标函数就是损失函数 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_03 ,而XGBoost中加入了正则项,用来控制基学习器树的结构,目标函数定义如下:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_04

我们构造目标函数就是为了用来评估模型的好坏,所以我们希望模型训练过程中这个目标函数的值越小越好。

由于XGBoost是Boosting架构的算法,所以同样遵循叠加式训练:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_05
也就是k个模型的预测值等于前k个模型的预测值+当前正在训练第k个模型的预测值

所以此时我们的目标函数可以写为:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_人工智能_06
这里解释一下,我们首先将算法模型y带入,然后获得了 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_07 ,然后将后面基学习器树的复杂度进行拆分,拆成前k-1棵树的复杂度加上当前模型树的复杂度,又因为我们当时正在训练第k棵树,所以针对于前k棵树都是常量,所以现在我们的目标函数又可以写成:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_08
其中的 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_人工智能_09

3.泰勒级数近似目标函数

根据上面我们就构造好了目标函数,但是为了将其进行简化,我们将其进行泰勒二阶展开

泰勒二阶展开式一般形式如下:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_10
此时我们定义:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_11
那么就对应:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_12
按照泰勒公式的一般形式将其带入得到:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_13
定义:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_人工智能_14
因为我们的 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_15【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_16 都是和前k-1个学习器相关,所以都为常数,那么简化后的目标函数就为:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_17
由于 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_18 为常数,与优化第k棵树无关,可以省略:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_19

4.将树结构引入目标函数

到了现在我们就获得了简化后的目标函数,但是你会发现函数中的 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_20【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_21

4.1 表示第k棵树的预测值

首先针对于 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_20

为了表示它,我们引入了3个变量,分别是:

1.【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_23:代表每个叶节点的值,就是预测值

2.【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_24

3.【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_25

为了很好描述这几个变量,我们用幅图描述一下:

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_26

针对于这幅图,我们可以看到存在两个叶子节点,分别为1、2,每个节点的值为2和7,所以用上面三个变量表示:

那么我们第k棵树的预测值就可以写成 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_人工智能_27

4.2 表示树的模型复杂度

上面的目标函数中我们添加了正则项用来防止模型过拟合,那么针对于树模型,有哪些参数可以定义模型的复杂度呢?

一般情况下,我们的树模型越深越茂密那么复杂度越高,或者叶子节点值越大模型复杂度越高

在xgboost算法的实现中,是采用下式来衡量模型复杂度的:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_28

  • T:代表叶子节点个数
  • 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_29
  • 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_30

4.3 参数化目标函数

解决了上面两个问题,接下来就是如何将刚才定义的变量带入目标函数,现在目标函数为:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_19

将其带入,目标函数为:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_人工智能_32
这个式子还可以进一步简化,我们观察上面我们还定义了一个 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_25 的变量还没有用到,现在就要使用,我们发现计算损失函数时是以样本索引来遍历的 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_xgboost_34

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_35

比如我们计算所有叶子节点1上样本的损失,按照上面定义的应该为:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_xgboost_36
但是现在可以使用下式:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_xgboost_37
我们的 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_38

所以此时目标函数就可以写为:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_39
其中 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_40 代表叶子节点数,这里的 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_人工智能_41【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_42 都为常数,所以我们用个符号代替:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_43
我们观察目标函数 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_44 为一个二次函数,针对于一般的二次函数 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_45 ,我们取得极值点在对称轴处,为 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_xgboost_46 ,所以此时我们目标函数的最优解为:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_xgboost_47
所以,当我们的树模型结构一定时,模型的目标函数最优为:
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_48
注意前提是树结构已知时,模型的最优目标函数值才为上面的式子,但是针对于一棵树,模型的结构可能有很多种,我们如何获取一棵最优的树呢?

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_人工智能_49

我们最容易想到,我们遍历所以可能的树结构,然后针对于不同棵树的最优obj,然后选取obj最小的一棵树,但是我们的树结构很复杂,这个复杂度是成指数的,显然不可能遍历所以可能结构的树,这就引出了贪心算法,去构建一颗最优的树。

5.贪心算法构建最优树

上面我们获得了给定一棵树模型,我们可以计算针对该棵树的最优目标函数值,但问题是我们现在正在生成第k棵树,我们不知道树的结构,然而又很显然不能遍历所以可能树的结构去计算obj,所以我们考虑使用贪心算法。

其实到了这里就和构造普通的cart决策树差不多了,都是选取不同的特征然后计算信息增益判断当前树的结构是否优秀,然而对于ID3中的决策树是使用了熵来进行评估不确定度的,CART中使用的是基尼系数的概念,我们这里不同的就是使用了上面定义的obj进行衡量,也就是判断一个特征是否是最优的切分特征,需要看切分后的obj是否小于切分前的obj。

我们选取每个特征,然后计算信息增益,这里信息增益使用 【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_50
【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_xgboost_51
下面举了例子如何计算信息增益:

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_52


【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_xgboost_53

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_54


【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_机器学习_55

所以我们的信息增益为:

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_56

其中:

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_57

我们是要获得最大信息增益,就需要遍历所以特征计算增益,选取增益大的进行切分构造树模型

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_xgboost_58

根据这个原理我们就可以构造一棵使目标函数最小的树模型,然后按照这个逻辑,一次构造K棵树,然后最终将所有的树加权就是我们最终的模型:

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_算法_59

写在最后

      一键三连”哦!!!

【机器学习】集成学习(Boosting)——XGBoost算法(理论+图解+公式推导)_boosting_60