图解机器学习 | XGBoost模型详解

引言

XGBoost是eXtreme Gradient Boosting的缩写称呼,它是一个非常强大的Boosting算法工具包,优秀的性能(效果与速度)让其在很长一段时间内霸屏数据科学比赛解决方案榜首,现在很多大厂的机器学习方案依旧会首选这个模型。

XGBoost在并行计算效率、缺失值处理、控制过拟合、预测泛化能力上都变现非常优秀。本文我们给大家详细展开介绍XGBoost,包含「算法原理」和「工程实现」两个方面。

关于XGBoost的工程应用实践,欢迎大家参考ShowMeAI的另外一篇实战文章 XGBoost工具库建模应用详解

(本篇XGBoost部分内容涉及到机器学习基础知识、决策树/回归树/GBDT算法,没有先序知识储备的宝宝可以查看ShowMeAI的文章 图解机器学习 | 机器学习基础知识决策树模型详解回归树模型详解)及图解机器学习 | GBDT模型详解)。

1.算法原理可视化解读

关于XGBoost的原理,其作者陈天奇本人有一个非常详尽的Slides做了系统性的介绍,我们在这里借助于这个资料给大家做展开讲解。

1)监督学习中的一些重要概念

在开始介绍Boosted Tree之前,我们先来回顾一下机器学习中的一些重要的概念。

(1)监督学习核心要素

符号(Notations):xiRdx_i \in R^d表示训练集中的第ii个样本。

模型(Model):对于已知的xix_i如何预测y^i\hat{y}_i

线性模型(Linear Model)
y^i=Σjwjxij\hat{y}_{i}=\Sigma_{j} w_{j} x_{ij}(包括线性回归和逻辑回归),预测值y^i\hat{y}_i根据不同的任务有不同的解释:

  • 线性回归(Linear Regression):y^i\hat{y}_i表示预测的分数。

  • 逻辑回归(Logistic Regression):1/(1+ey^i)1/(1+e^{-\hat{y}_i})预测了实例为正的概率。

  • 其他:例如在排名任务中y^i\hat{y}_i可以是排名分数。

参数(Parameters):需要从数据中学习的东西。

  • 线性模型(Linear Model):Θ={wjj=1,2,,d}\Theta =\left \{w_j|j=1,2,\dots,d\right\}

目标函数(Objective function)Obj(Θ)=L(Θ)+Ω(Θ)Obj(\Theta )=L(\Theta )+\Omega (\Theta)

  • L(Θ)L(\Theta )代表训练损失函数(Training Loss),表示模型多好的拟合了训练数据。

  • Ω(Θ)\Omega (\Theta )为正则化项(Regularization)衡量了模型的复杂程度。

训练数据损失函数(Training Loss)L=Σi=1nl(yi,y^i)L=\Sigma_{i=1}^{n}l(y_i,\hat{y}_i)

  • 平方损失(Square Loss):l(yi,y^i)=(yiy^i)2l(y_i,\hat{y}_i)=(y_i-\hat{y}_i)^2

  • 逻辑损失(Logistic Loss):l(yi,y^i)=yiln(1+ey^i)+(1yi)ln(1+ey^i)l(y_i,\hat{y}_i)=y_iln(1+e^{-\hat{y}_i})+(1-y_i)ln(1+e^{\hat{y}_i})

正则化项(Regularization):描述了模型的复杂程度。

  • L1 Norm(lasso)Ω(w)=λw1\Omega (w)=\lambda||w||_1

  • L2 NormΩ(w)=λw2\Omega (w)=\lambda||w||^2

(2)监督学习进阶知识

Ridge回归Σi=1n(yiwTxi)2+λw2\Sigma_{i=1}^{n}(y_i-w^Tx_i)^2+\lambda||w||^2

  • Ridge是线性模型(Linear Model),用的是平方损失(Square Loss),正则化项是L2 Norm。

LassoΣi=1n(yiwTxi)2+λw1\Sigma_{i=1}^{n}(y_i-w^Tx_i)^2+\lambda||w||_1

  • Lasso是线性模型(Linear Model),用的是平方损失(Square Loss),正则化项是L1 Norm。

逻辑回归(Logistic Regression):Σi=1n(yiln(1+ewTxi)+(1yi)ln(1+ewTxi))+λw2\Sigma_{i=1}^{n}(y_iln(1+e^{-w^Tx_i})+(1-y_i)ln(1+e^{w^Tx_i}))+\lambda||w||^2

  • 逻辑回归是线性模型(Linear Model),用的是逻辑损失(Logistic Loss),正则化项是L2 Norm。

(3)目标函数及偏差方差权衡

回顾一下目标函数Obj(Θ)=L(Θ)+Ω(Θ)Obj(\Theta )=L(\Theta )+\Omega (\Theta ),为什么目标函数需要两部分组成呢?

  • 优化训练损失函数(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棵树:y^i=Σk=1Kfk(xi),fkF\hat{y}_i=\Sigma_{k=1}^Kf_k(x_i), f_k\in F。其中,F为包含所有回归树的函数空间。

  • 回归树是一个将属性映射到分数的函数。

参数:包括每棵树的结构和叶子结点中的分数。或者使用函数当作参数:Θ={f1,f2,,fK}\Theta =\left\{f_1,f_2,…,f_K\right\}

  • 这里我们不学习RdR^d的权重,我们在Boosted Tree中学习函数(树)。

(5)在单变量上学习Boosted Tree

单变量也就是单个特征,通过了解如何在单变量上学习Boosted Tree,我们可以对Boosted Tree的学习模式有个简单的概念。

举例:假设回归树只有一个输入变量t(时间),希望预测小哥在t时刻有多喜欢浪漫音乐

从上左图可以看到,这位小哥在单身的时候,对浪漫音乐的喜欢程度很低;但是当他遇到了女朋友,随着体内荷尔蒙的分布增加,他对浪漫音乐的喜欢程度增加了;但是有一天分手了,他对浪漫音乐的喜欢程度又变低了。当然,我们也可以发现,上右图的回归树很容易能表达上左图。

为了构建上右图的树,我们需要学习两个东西:

  • 1、分裂的点;
  • 2、每个分段上的高。

单变量回归树的目标(阶跃函数)

  • 训练损失:函数如何拟合点?
  • 正则化:如何定义函数的复杂度?(分裂点的个数和每段高度的L2 Norm?)

  • 图(1)是小哥在每个时间上对浪漫音乐的喜欢程度的散点图;
  • 图(2)可以看到有太多的分割,模型的复杂度很高,所以模型的Ω(f){\color{DarkGreen} \Omega (f)}很高;
  • 图(3)可以看到模型的拟合程度很差,所以L(f){\color{DarkGreen} L (f)}很高;
  • 图(4)是最好的,无论是拟合程度和复杂程度都非常合适;

(6)一般情形的Boosted Tree

首先回顾上面我们对Boosted Tree的定义:

模型:假设我们有K棵树: y^i=Σk=1Kfk(xi),fkF\hat{y}_i = \Sigma_{k=1}^{K} f_k(x_i), f_k\in F

目标函数Obj=Σi=1nl(yi,y^i)+Σk=1KΩ(fk)Obj=\Sigma_{i=1}^nl(y_i,\hat{y}_i)+\Sigma_{k=1}^K\Omega (f_k)

  • Σi=1nl(yi,y^i)\Sigma_{i=1}^nl(y_i,\hat{y}_i)是成本函数

  • Σk=1KΩ(fk)\Sigma_{k=1}^K\Omega (f_k)是正则化项,代表树的复杂程度,树越复杂正则化项的值越高(正则化项如何定义我们会在后面详细说)。

当我们讨论树的时候,通常是启发式的:

  • 通过信息增益来做分裂
  • 修剪树木
  • 最大深度
  • 平滑叶值

大多数启发式算法都能很好地映射到目标函数,采用形式(目标)视图让我们知道我们正在学习什么:

  • 信息增益 → 训练损失
  • 修剪 → 对节点的正则化
  • 最大深度 – 函数空间上的约束
  • 平滑叶片值 – L2正则化对叶片的权重

回归树集成定义了如何得到预测值,它不仅仅可以做回归,同样还可以做分类和排序。具体做什么任务依赖于「目标函数」的定义:

  • 使用平方误差:可以得到用于回归问题的gradient boosted machine。
  • 使用对数损失:可以得到LogitBoost用于分类。

3)Gradient Boosting(如何学习)

在这一节中我们将正式学习Gradient Boosting。这里,xgboost的处理大家可以对比GBDT模型(可参考ShowMeAI文章 图解机器学习 | GBDT模型详解)来理解核心差异。

(1)解决方案

目标函数Obj=Σi=1nl(yi,y^i)+Σk=1KΩ(fk)Obj=\Sigma_{i=1}^nl(y_i,\hat{y}_i)+\Sigma_{k=1}^K\Omega (f_k)

在做GBDT的时候,我们没有办法使用SGD,因为它们是树,而非数值向量——也就是说从原来我们熟悉的参数空间变成了函数空间。

  • 参数空间:学习模型中的权重。
  • 函数空间:学习函数ff,包括函数的结构和其中的权重。

解决方案:初始化一个预测值,每次迭代添加一个新函数(ff):

y^i(0)=0y^i(1)=f1(xi)=y^i(0)+f1(xi)y^i(2)=f1(xi)+f2(xi)=y^i(1)+f2(xi)y^i(t)=Σk=1tfk(xi)=y^i(t1)+ft(xi)\begin{aligned} \hat{y}_i^{(0)} & = 0 \\ \hat{y}_i^{(1)} & = f_1(x_i)=\hat{y}_i^{(0)}+f_1(x_i) \\ \hat{y}_i^{(2)} & = f_1(x_i)+f_2(x_i)=\hat{y}_i^{(1)}+f_2(x_i) \\ \dots \\ \hat{y}_i^{(t)} & = \Sigma_{k=1}^tf_k(x_i)=\hat{y}_i^{(t-1)}+f_t(x_i) \\ \end{aligned}

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享