[, G: J3 @6 {, e$ Y0 x" g 机器学习算法(15)之Xgboost算法 8 C: F" @* k$ e6 ^前言:前一篇文章对boosting的两个方法做了阐述,这篇文章将会是对前两篇文章的深化,谈的是一个更加优化了的boostIng算法,自从2014年9月份在 Kaggle 的希格斯玻色子机器学习大赛中夺魁以来,XGBoost 与深度学习两个算法垄断了 Kaggle 大赛的大部分冠军。现在Kaggle 大赛的情况基本是这样的,凡是非结构化数据相关,比如语音、图像,基本都是深度学习获胜,凡是结构化数据上的竞赛,基本都是 XGBoost 获胜。 6 R& U8 r0 B# {7 u/ b( D7 ?8 k 4 [& R5 R# B9 r- i1、回顾下GB、GBDT1 D( c# E. D' b, i9 }
GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类、回归、排序问题,因此这里尝试一步一步梳理GB、GBDT、xgboost,它们之间有非常紧密的联系,GBDT是以决策树(CART)为基学习器的GB算法,xgboost扩展和改进了GDBT,xgboost算法更快,准确率也相对高一些。 ; ^# `. `: M* |+ K6 X+ k0 H3 R. R) e; y' L% ]
1.1、Gradient boosting(GB) 3 o1 k- v" O" @( H1 a 机器学习中的学习算法的目标是为了优化或者说最小化loss Function, Gradient boosting的思想是迭代生多个(M个)弱的模型,然后将每个弱模型的预测结果相加,后面的模型基于前面学习模型的的效果生成的,关系如下: $ ~% ^6 Y8 F0 @0 A % G9 h; a0 O5 w! m0 q$ v( n+ R% u( F4 r/ S
1 d, Z y, i' A5 q/ T
GB算法的思想很简单,关键是怎么生成?( |4 ^1 ]; q* H4 B6 m
( T; |+ g5 L$ f8 x5 V" d6 b
如果目标函数是回归问题的均方误差,很容易想到最理想的应该是能够完全拟合 ,这就是常说基于残差的学习。残差学习在回归问题中可以很好的使用,但是为了一般性(分类,排序问题),实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题残差和负梯度也是相同的。中的f,不要理解为传统意义上的函数,而是一个函数向量,向量中元素的个数与训练样本的个数相同,因此基于Loss Function函数空间的负梯度的学习也称为“伪残差”。# ~. ?# I. W9 }) z5 `
) L- d6 l; {" j' B+ {# H% }
GB算法的步骤:0 q- u! C3 i. s4 n) g$ G( |6 V# F6 E
% D- \( s- D$ r) r
1.初始化模型为常数值: - ^( C0 t; S* `; g 8 |1 P: `0 Z( W, W: d, n% [4 P1 |, W4 D
% \4 d2 X3 I: i& B j4 ~/ A
2.迭代生成M个基学习器 + q/ O: j* V, I1 l" A4 m6 L" H% E4 ? 8 y4 ~+ E4 f0 M# p- G3 l8 B 1)计算伪残差2 O3 \: G' f! g8 `* w2 j7 _5 P* M
8 a4 K9 r- S9 Q4 L - G! b+ o' w- m' j x . B# r8 G* }2 Z' U* F$ Y( e2 e 2.基于生成基学习器* K, F) b, ?6 r5 d
/ X' k" E: m# \/ |8 x/ X; W& I 3.计算最优的3 g) I5 y/ U R
2 H, r, _& f# s- O# x5 ]4 g* b6 a+ ^$ n3 p! O
, B6 c3 E4 t5 C" O. y* K0 o1 o d) a
4.更新模型 3 T! G" O4 n+ m % F* E. V& r3 q$ n) p+ L, Q7 a) o% y0 G1 C- g! Y0 F8 r: |- \
& P. x( q4 O2 H3 x1.2、Gradient boosting Decision Tree(GBDT) J7 i h/ i7 E+ Z) f9 l
GBDT的原理篇在上一篇已经阐述过,这里稍微总结性下,GBDT是GB和DT的结合。要注意的是这里的决策树是分类回归树(是一种二叉树),GBDT中的决策树是个弱模型,有些GBDT的实现加入了随机抽样(subsample 0.5<=f <=0.8)提高模型的泛化能力。通过交叉验证的方法选择最优的参数。1 s- L, b/ f |+ e/ r
: i" _" m6 K) t' i4 T* p4 H S: h因此GBDT实际的核心问题变成怎么基于使用CART回归树生成?/ @0 s- `4 K' @5 l* D; E D+ |5 \3 G
$ T8 q" {3 `/ |+ z; j/ s" F
2、Xgboost算法 W7 C4 L3 ^: |3 \9 l; R( C7 v2 P& F 前面已经说过,xgboost可以说集成思想达到顶峰的一个模型,至少目前是这样,所以我们学习机器学习算法, 掌握这个是很有必要的。顺带提一下,Xgboost目前scikit-learn中没有实现,需要我们自行安装Xgboost,可以通过python调用,我自己也记录了一个纯小白都能安装好的方法。& X% a" _' b2 K6 N" Y- P: ^; W- ^ [
. |4 V; J+ | _5 L) e6 |& @8 _' F) ]
全称:eXtreme Gradient Boosting(极值梯度提升算法) 2 j" _3 B) [! k+ m/ ]0 [作者:陈天奇(华盛顿大学博士) ) E. q3 j ~. f9 R
基础:GBDT % {& N& m% Z, ] Z0 n! E
所属:boosting迭代型、树类算法。 , `. A' n, I0 B; B8 f
适用范围:分类、回归等) T! |! l n% h4 A. x
优点:速度快、效果好、能处理大规模数据、支持多种语言、支持自定义损失函数等等。 + V7 i* L# [5 Q0 q# K( Z+ b2.1、与GBDT的区别: # n# E& ~2 Q3 {* H) C, M4 M首先我们先在大体上对xgboost有个大致的印象,然后我们在对其原理做详细的阐述。 8 B) O& s8 X7 v7 \/ |- z: h + Y$ P4 d/ ?6 S' T* D. G/ m • XGBoost的基学习器除了可以是CART(这个时候就是GBDT)也可以是线性分类器,而GBDT只能是CART。 9 f6 T5 h$ c5 y2 |4 \9 F • XGBoost在代价函数中加入了正则项,用于控制模型的复杂度(正则项的方式不同,如果你仔细点话,GBDT是一种类似于缩 减系数,而XGBoost类似于L2正则化项)。 - E- U$ ^$ f9 J; F& q. X6 ?- H • XGBoost借鉴了随机森林的做法,支持特征抽样,不仅防止过拟合,还能减少计算+ i3 \8 z/ w) B
• XGBoost工具支持并行化. I: l, ] r$ p, T5 c7 G, d% U
• 综合来说Xgboost的运算速度和算法精度都会优于GBDT1 O; B* s8 j [: T/ z k4 P6 W
. z; h6 b1 U" E# |
2.2 Xgboost算法原理 7 ]( e4 L4 x& Z% f! b; x( r. s+ f Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART也可以是线性分类器(gblinear)。下面所有的内容来自原始paper,包括公式。 0 m2 ]9 Y3 r1 [4 w8 J 7 L9 K! O5 [7 z# o8 m$ |. N/ @& U1)树的结构6 q+ B- o, g) B. z
5 U* z. a# D6 Z7 T0 E! ~
我们从单一的树来考虑。对于其中每一棵回归树,其模型可以写成: 0 {" [0 N) L4 P2 \- {/ o& Z
$ p& f8 R" u" Z* Q8 @& s( F2 y/ A; W# u8 L- n0 Z* ~; X0 [% n* Y
2 @; A; u: E3 Q7 o. z4 v
其中为叶子节点的得分值,表示样本对应的叶子节点。为该树的叶子节点个数。) I& u& \) J0 N* X. u5 T
3 y# P P3 O2 l" A5 [: j7 P
因此,在这里。我们将该树的复杂度写成: 4 j/ R* L' O2 _. J) M1 y1 ^. ~ 8 [$ W f9 s* Z: @9 p 其中,γγ为L1L1正则的惩罚项,λλ为L2L2正则的惩罚项 - e7 f9 Q( p$ I, r0 \- `5 I0 d ?, U- Z5 F
复杂度计算例子如下: * X2 I$ O+ S$ k$ X2 a0 l9 Z' g3 F. N9 q! P& s! r/ y8 a
/ m2 G; j% a1 z4 E5 F9 T! f' k! C& Z# k, `; e' e. h
2) 损失函数: ?) K. P2 O) r9 _& D
" _7 M$ M+ D2 y& f' E' j 前面已经说过,为了一般性,实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题残差和负梯度也是相同的。和传统的boosting tree模型一样,xgboost的提升模型也是采用的残差(或梯度负方向),不同的是分裂结点选取的时候不一定是最小平方损失。 ) y b- E( g. P$ b
+ r1 z; z6 p4 B; ^8 _
8 j, C( F1 N, h; N 4 T! g k: d0 n' R 这里也在解释下,描述了一整颗树的模型,他当然能分解成每个叶子结点的集合啦,而刚好是每个叶子节点的得分函数,这两个于是就可以相互转化了。% r1 l& W3 [$ j+ ~/ H& o# c
7 s6 ~. @9 n. L3 Q* \' w
其中为第t棵树中总叶子节点的个数,表示样本落在第个叶子节点上,为第个叶子节点的得分值。, G- v# A' Y7 ^1 s! x4 j
0 a: R, y, X2 Z+ R
在这里,令8 k6 ^# m& Y6 g( e" I
2 J; P+ ~1 \% P9 ] ?) [6 l# i3 f) t% p
+ y# y7 T' A9 Y; A
对求偏导,并使其导函数等于0,则有:; F+ G$ R1 }3 n& g) I
/ l- ~2 D9 ^1 h; m M6 Y3 y2 e6 {% M% q
' R0 k3 h. R7 o0 B5 ?3 v3 M1 P. r1 s6 [
0 `' t# E1 `% ^4 y9 O