- 作者:韩信子@ShowMeAI
- 教程地址:www.showmeai.tech/tutorials/3…
- 本文地址:www.showmeai.tech/article-det…
- 声明:版权所有,转载请联系平台与作者并注明出处
引言
XGBoost是eXtreme Gradient Boosting的缩写称呼,它是一个非常强大的Boosting算法工具包,优秀的性能(效果与速度)让其在很长一段时间内霸屏数据科学比赛解决方案榜首,现在很多大厂的机器学习方案依旧会首选这个模型。
XGBoost在并行计算效率、缺失值处理、控制过拟合、预测泛化能力上都变现非常优秀。本文我们给大家详细展开介绍XGBoost,包含「算法原理」和「工程实现」两个方面。
关于XGBoost的工程应用实践,欢迎大家参考ShowMeAI的另外一篇实战文章 XGBoost工具库建模应用详解。
(本篇XGBoost部分内容涉及到机器学习基础知识、决策树/回归树/GBDT算法,没有先序知识储备的宝宝可以查看ShowMeAI的文章 图解机器学习 | 机器学习基础知识 、决策树模型详解 、回归树模型详解)及图解机器学习 | GBDT模型详解)。
1.算法原理可视化解读
关于XGBoost的原理,其作者陈天奇本人有一个非常详尽的Slides做了系统性的介绍,我们在这里借助于这个资料给大家做展开讲解。
1)监督学习中的一些重要概念
在开始介绍Boosted Tree之前,我们先来回顾一下机器学习中的一些重要的概念。
(1)监督学习核心要素
符号(Notations):表示训练集中的第个样本。
模型(Model):对于已知的如何预测?
线性模型(Linear Model)
(包括线性回归和逻辑回归),预测值根据不同的任务有不同的解释:
-
线性回归(Linear Regression):表示预测的分数。
-
逻辑回归(Logistic Regression):预测了实例为正的概率。
-
其他:例如在排名任务中可以是排名分数。
参数(Parameters):需要从数据中学习的东西。
- 线性模型(Linear Model):。
目标函数(Objective function)
-
代表训练损失函数(Training Loss),表示模型多好的拟合了训练数据。
-
为正则化项(Regularization)衡量了模型的复杂程度。
训练数据损失函数(Training Loss)
-
平方损失(Square Loss):
-
逻辑损失(Logistic Loss):
正则化项(Regularization):描述了模型的复杂程度。
-
L1 Norm(lasso):
-
L2 Norm:
(2)监督学习进阶知识
Ridge回归:
- Ridge是线性模型(Linear Model),用的是平方损失(Square Loss),正则化项是L2 Norm。
Lasso:
- Lasso是线性模型(Linear Model),用的是平方损失(Square Loss),正则化项是L1 Norm。
逻辑回归(Logistic Regression):
- 逻辑回归是线性模型(Linear Model),用的是逻辑损失(Logistic Loss),正则化项是L2 Norm。
(3)目标函数及偏差方差权衡
回顾一下目标函数,为什么目标函数需要两部分组成呢?
-
优化训练损失函数(Training Loss)有助于建立预测模型,很好地拟合训练数据至少能让你更接近潜在的训练数据的分布。
-
优化正则化项(Regularization)有助于建立简单的模型:模型越简单,未来预测的方差越小,预测越稳定。
2)回归树(Regression Tree)和集成(Ensemble)
(1)回归树(Regression Tree)
回归树,也就是分类回归树(Classification and Regression Tree)(详情请查看ShowMeAI文章回归树模型详解)
- 决策规则和决策树一样
- 每个叶子结点有一个值
(2)回归树集成(Regression Tree Ensemble)
从上图的左图可以看出,共有5个训练样本。
从上图的中图可以看出,每个叶子节点都有预测值:第一个叶子结点的预测值是2,第二个叶子结点的预测值是0.1,第三个叶子结点的预测值是-1。
- 小男孩被分到第一个叶子结点中,所以小男孩的预测值是2;
- 小女儿被分到第二个叶子结点,她的预测值是0.1;
- 剩余的三个人(样本)被分到第三个叶子结点中,他们的值都是-1。
最终的预测值就是样本在每颗树中所在的叶子结点的预测值的和。
(3)树集成方法
树集成的方法使用非常广泛,像GBM、随机森林等(详见ShowMeAI文章 图解机器学习 | GBDT模型详解 和 图解机器学习 | 随机森林分类模型详解)。多达半数的数据挖掘竞赛通过使用各种各样的树集成方法而获胜。
- 不受输入量纲的影响,因此不需要对特性进行细致的标准化。
- 学习特征之间的高阶交互(高阶交叉特征)。
- 可以扩展,用于不同的行业。
(4)Boosted Tree的模型和参数
模型:假设我们有K棵树:。其中,F为包含所有回归树的函数空间。
- 回归树是一个将属性映射到分数的函数。
参数:包括每棵树的结构和叶子结点中的分数。或者使用函数当作参数:。
- 这里我们不学习的权重,我们在Boosted Tree中学习函数(树)。
(5)在单变量上学习Boosted Tree
单变量也就是单个特征,通过了解如何在单变量上学习Boosted Tree,我们可以对Boosted Tree的学习模式有个简单的概念。
举例:假设回归树只有一个输入变量t(时间),希望预测小哥在t时刻有多喜欢浪漫音乐。
从上左图可以看到,这位小哥在单身的时候,对浪漫音乐的喜欢程度很低;但是当他遇到了女朋友,随着体内荷尔蒙的分布增加,他对浪漫音乐的喜欢程度增加了;但是有一天分手了,他对浪漫音乐的喜欢程度又变低了。当然,我们也可以发现,上右图的回归树很容易能表达上左图。
为了构建上右图的树,我们需要学习两个东西:
- 1、分裂的点;
- 2、每个分段上的高。
单变量回归树的目标(阶跃函数)
- 训练损失:函数如何拟合点?
- 正则化:如何定义函数的复杂度?(分裂点的个数和每段高度的L2 Norm?)
- 图(1)是小哥在每个时间上对浪漫音乐的喜欢程度的散点图;
- 图(2)可以看到有太多的分割,模型的复杂度很高,所以模型的很高;
- 图(3)可以看到模型的拟合程度很差,所以很高;
- 图(4)是最好的,无论是拟合程度和复杂程度都非常合适;
(6)一般情形的Boosted Tree
首先回顾上面我们对Boosted Tree的定义:
模型:假设我们有K棵树:
目标函数:
-
是成本函数
-
是正则化项,代表树的复杂程度,树越复杂正则化项的值越高(正则化项如何定义我们会在后面详细说)。
当我们讨论树的时候,通常是启发式的:
- 通过信息增益来做分裂
- 修剪树木
- 最大深度
- 平滑叶值
大多数启发式算法都能很好地映射到目标函数,采用形式(目标)视图让我们知道我们正在学习什么:
- 信息增益 → 训练损失
- 修剪 → 对节点的正则化
- 最大深度 – 函数空间上的约束
- 平滑叶片值 – L2正则化对叶片的权重
回归树集成定义了如何得到预测值,它不仅仅可以做回归,同样还可以做分类和排序。具体做什么任务依赖于「目标函数」的定义:
- 使用平方误差:可以得到用于回归问题的gradient boosted machine。
- 使用对数损失:可以得到LogitBoost用于分类。
3)Gradient Boosting(如何学习)
在这一节中我们将正式学习Gradient Boosting。这里,xgboost的处理大家可以对比GBDT模型(可参考ShowMeAI文章 图解机器学习 | GBDT模型详解)来理解核心差异。
(1)解决方案
目标函数:
在做GBDT的时候,我们没有办法使用SGD,因为它们是树,而非数值向量——也就是说从原来我们熟悉的参数空间变成了函数空间。
- 参数空间:学习模型中的权重。
- 函数空间:学习函数,包括函数的结构和其中的权重。
解决方案:初始化一个预测值,每次迭代添加一个新函数():