🌠 『精品学习专栏导航帖』
- 🐳最适合入门的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人工智能领域新星创作者,带你从入门到精通,该博客每天更新,逐渐完善机器学习各个知识体系的文章,帮助大家更高效学习。
一、引言
XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,它可以称为机器学习树模型中的王牌选手,是各大数据科学比赛的大杀器。
之前我们讲过GBDT,它采用的是数值优化的思维, 用的最速下降法去求解Loss Function的最优解, 其中用CART决策树去拟合负梯度,而XGboost用的解析的思维, 对Loss Function展开到二阶近似, 求得解析解, 用解析解作为Gain来建立决策树, 使得Loss Function最优.
下面我们具体讲解下xgboost算法的详细流程。
二、XGBoost算法
1.xgboost算法原理
xgboost算法同样也是Boosting架构的一种算法实现,同样符合模型函数:
这里的K是指K棵树,就是K个基学习器,本文默认基学习器为树模型,其实现在XGBoost内部的基学习器可以使用linear学习器。
它和大部分机器学习模型结构差不多,也是定义了模型损失函数,然后进行优化,只不过是xgboost模型比较复杂,所以直接优化损失函数难度较大,所以才有了一系列的操作来进行简化。
xgboost算法主要有4个流程:
- 构造目标函数
- 将目标函数进行泰勒二阶展开
- 将目标函数参数化,将树结构引入目标函数
- 根据最优目标函数,构建最优树
2.构造目标函数
针对于该算法首先需要定义目标函数用来评估模型的好坏,在GBDT中我们的目标函数就是损失函数 ,而XGBoost中加入了正则项,用来控制基学习器树的结构,目标函数定义如下:
我们构造目标函数就是为了用来评估模型的好坏,所以我们希望模型训练过程中这个目标函数的值越小越好。
由于XGBoost是Boosting架构的算法,所以同样遵循叠加式训练:
也就是k个模型的预测值等于前k个模型的预测值+当前正在训练第k个模型的预测值
所以此时我们的目标函数可以写为:
这里解释一下,我们首先将算法模型y带入,然后获得了 ,然后将后面基学习器树的复杂度进行拆分,拆成前k-1棵树的复杂度加上当前模型树的复杂度,又因为我们当时正在训练第k棵树,所以针对于前k棵树都是常量,所以现在我们的目标函数又可以写成:
其中的
3.泰勒级数近似目标函数
根据上面我们就构造好了目标函数,但是为了将其进行简化,我们将其进行泰勒二阶展开
泰勒二阶展开式一般形式如下:
此时我们定义:
那么就对应:
按照泰勒公式的一般形式将其带入得到:
定义:
因为我们的 和 都是和前k-1个学习器相关,所以都为常数,那么简化后的目标函数就为:
由于 为常数,与优化第k棵树无关,可以省略:
4.将树结构引入目标函数
到了现在我们就获得了简化后的目标函数,但是你会发现函数中的 和
4.1 表示第k棵树的预测值
首先针对于
为了表示它,我们引入了3个变量,分别是:
1.:代表每个叶节点的值,就是预测值
2.
3.
为了很好描述这几个变量,我们用幅图描述一下:
针对于这幅图,我们可以看到存在两个叶子节点,分别为1、2,每个节点的值为2和7,所以用上面三个变量表示:
那么我们第k棵树的预测值就可以写成
4.2 表示树的模型复杂度
上面的目标函数中我们添加了正则项用来防止模型过拟合,那么针对于树模型,有哪些参数可以定义模型的复杂度呢?
一般情况下,我们的树模型越深越茂密那么复杂度越高,或者叶子节点值越大模型复杂度越高
在xgboost算法的实现中,是采用下式来衡量模型复杂度的:
- T:代表叶子节点个数
4.3 参数化目标函数
解决了上面两个问题,接下来就是如何将刚才定义的变量带入目标函数,现在目标函数为:
将其带入,目标函数为:
这个式子还可以进一步简化,我们观察上面我们还定义了一个 的变量还没有用到,现在就要使用,我们发现计算损失函数时是以样本索引来遍历的
比如我们计算所有叶子节点1上样本的损失,按照上面定义的应该为:
但是现在可以使用下式:
我们的
所以此时目标函数就可以写为:
其中 代表叶子节点数,这里的 和 都为常数,所以我们用个符号代替:
我们观察目标函数 为一个二次函数,针对于一般的二次函数 ,我们取得极值点在对称轴处,为 ,所以此时我们目标函数的最优解为:
所以,当我们的树模型结构一定时,模型的目标函数最优为:
注意前提是树结构已知时,模型的最优目标函数值才为上面的式子,但是针对于一棵树,模型的结构可能有很多种,我们如何获取一棵最优的树呢?
我们最容易想到,我们遍历所以可能的树结构,然后针对于不同棵树的最优obj,然后选取obj最小的一棵树,但是我们的树结构很复杂,这个复杂度是成指数的,显然不可能遍历所以可能结构的树,这就引出了贪心算法,去构建一颗最优的树。
5.贪心算法构建最优树
上面我们获得了给定一棵树模型,我们可以计算针对该棵树的最优目标函数值,但问题是我们现在正在生成第k棵树,我们不知道树的结构,然而又很显然不能遍历所以可能树的结构去计算obj,所以我们考虑使用贪心算法。
其实到了这里就和构造普通的cart决策树差不多了,都是选取不同的特征然后计算信息增益判断当前树的结构是否优秀,然而对于ID3中的决策树是使用了熵来进行评估不确定度的,CART中使用的是基尼系数的概念,我们这里不同的就是使用了上面定义的obj进行衡量,也就是判断一个特征是否是最优的切分特征,需要看切分后的obj是否小于切分前的obj。
我们选取每个特征,然后计算信息增益,这里信息增益使用 。
下面举了例子如何计算信息增益:
所以我们的信息增益为:
其中:
我们是要获得最大信息增益,就需要遍历所以特征计算增益,选取增益大的进行切分构造树模型
根据这个原理我们就可以构造一棵使目标函数最小的树模型,然后按照这个逻辑,一次构造K棵树,然后最终将所有的树加权就是我们最终的模型:
写在最后
一键三连”哦!!!