赞
踩
- 我的个人微信公众号: Microstrong
- 微信公众号ID: MicrostrongAI
- 微信公众号介绍: Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步!
- 我的知乎主页: https://www.zhihu.com/people/MicrostrongAI/activities
- Github: https://github.com/Microstrong0305
- 个人博客: https://blog.csdn.net/program_developer
- 本文首发在我的微信公众号里,地址:https://mp.weixin.qq.com/s/HDEKnIufbW8xQcOgHaXlZw,如有公式和图片不清楚,可以在我的微信公众号里阅读。
本文的主要内容概览:
XGBoost的全称是eXtreme Gradient Boosting,它是经过优化的分布式梯度提升库,旨在高效、灵活且可移植。XGBoost是大规模并行boosting tree的工具,它是目前最快最好的开源 boosting tree工具包,比常见的工具包快10倍以上。在数据科学方面,有大量的Kaggle选手选用XGBoost进行数据挖掘比赛,是各大数据科学比赛的必杀武器;在工业界大规模数据方面,XGBoost的分布式版本有广泛的可移植性,支持在Kubernetes、Hadoop、SGE、MPI、 Dask等各个分布式环境上运行,使得它可以很好地解决工业界大规模数据的问题。本文将从XGBoost的数学原理和工程实现上进行介绍,然后介绍XGBoost的优缺点,并在最后给出面试中经常遇到的关于XGBoost的问题。
XGBoost和GBDT两者都是boosting方法,除了工程实现、解决问题上的一些差异外,最大的不同就是目标函数的定义。因此,本文我们从目标函数开始探究XGBoost的基本原理。
XGBoost是由 k k k 个基模型组成的一个加法模型,假设我们第 t t t 次迭代要训练的树模型是 f t ( x ) f_{t}(x) ft(x) ,则有:
损失函数可由预测值 y ^ i \hat{y}_{i} y^i 与真实值 y i y_{i} yi 进行表示:
L = ∑ i = 1 n l ( y i , y ^ i ) L = \sum_{i=1}^{n}{l(y_{i},\hat{y}_{i})} L=i=1∑nl(yi,y^i)
其中, n n n 为样本的数量。
我们知道模型的预测精度由模型的偏差和方差共同决定,损失函数代表了模型的偏差,想要方差小则需要在目标函数中添加正则项,用于防止过拟合。所以目标函数由模型的损失函数 L L L 与抑制模型复杂度的正则项 Ω \Omega Ω 组成,目标函数的定义如下:
O b j = ∑ i = 1 n l ( y i , y ^ i ) + ∑ i = 1 t Ω ( f i ) Obj = \sum_{i=1}^{n}{l(y_{i},\hat{y}_{i})} + \sum_{i=1}^{t}{\Omega(f_{i})} Obj=i=1∑nl(yi,y^i)+i=1∑tΩ(fi)
其中, ∑ i = 1 t Ω ( f i ) \sum_{i=1}^{t}{\Omega(f_{i})} ∑i=1tΩ(fi) 是将全部 t t t 棵树的复杂度进行求和,添加到目标函数中作为正则化项,用于防止模型过度拟合。
由于XGBoost是boosting族中的算法,所以遵从前向分步加法,以第 t t t 步的模型为例,模型对第 i i i 个样本 x i x_{i} xi 的预测值为:
y ^ i ( t ) = y ^ i ( t − 1 ) + f t ( x i ) \hat{y}_{i}^{(t)} = \hat{y}_{i}^{(t-1)} + f_{t}(x_{i}) y^i(t)=y^i(t−1)+ft(xi)
其中, y ^ i ( t − 1 ) \hat{y}_{i}^{(t-1)} y^i(t−1) 是由第 t − 1 t-1 t−1 步的模型给出的预测值,是已知常数, f t ( x i ) f_{t}(x_{i}) ft(xi) 是这次需要加入的新模型的预测值。此时,目标函数就可以写成:
O b j ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t ) ) + ∑ i = 1 t Ω ( f i ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + ∑ i = 1 t Ω ( f i ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) + c o n s t a n t
注意上式中,只有一个变量,那就是第 t t t 棵树 f t ( x i ) f_{t}(x_{i}) ft(xi) ,其余都是已知量或可通过已知量可以计算出来的。细心的同学可能会问,上式中的第二行到第三行是如何得到的呢?这里我们将正则化项进行拆分,由于前 t − 1 t-1 t−1 棵树的结构已经确定,因此前 t − 1 t-1 t−1 棵树的复杂度之和可以用一个常量表示,如下所示:
∑ i = 1 t Ω ( f i ) = Ω ( f t ) + ∑ i = 1 t − 1 Ω ( f i ) = Ω ( f t ) + c o n s t a n t
泰勒公式是将一个在 x = x 0 x=x_{0} x=x0 处具有 n n n 阶导数的函数 f ( x ) f(x) f(x) 利用关于 ( x − x 0 ) (x-x_{0}) (x−x0) 的 n n n 次多项式来逼近函数的方法。若函数 f ( x ) f(x) f(x) 在包含 x 0 x_{0} x0 的某个闭区间 [ a , b ] [a,b] [a,b] 上具有 n n n 阶导数,且在开区间 ( a , b ) (a,b) (a,b) 上具有 n + 1 n+1 n+1 阶导数,则对闭区间 [ a , b ] [a,b] [a,b] 上任意一点 x x x 有:
f ( x ) = ∑ i = 0 n f ( i ) ( x 0 ) i ! ( x − x 0 ) i + R n ( x ) f(x) = \sum_{i=0}^{n}{\frac{f^{(i)}(x_{0})}{i!}}(x-x_{0})^{i}+R_{n}(x) f(x)=i=0∑ni!f(i)(x0)(x−x0)i+Rn(x)
其中的多项式称为函数在 x 0 x_{0} x0 处的泰勒展开式, R n ( x ) R_{n}(x) Rn(x) 是泰勒公式的余项且是 ( x − x 0 ) n (x-x_{0})^{n} (x−x0)n 的高阶无穷小。
根据泰勒公式,把函数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。