: p( E5 u& k# \( `6 H$ H" L' P机器学习算法(15)之Xgboost算法 4 P8 i. {8 m4 K* L! Q9 ]$ C前言:前一篇文章对boosting的两个方法做了阐述,这篇文章将会是对前两篇文章的深化,谈的是一个更加优化了的boostIng算法,自从2014年9月份在 Kaggle 的希格斯玻色子机器学习大赛中夺魁以来,XGBoost 与深度学习两个算法垄断了 Kaggle 大赛的大部分冠军。现在Kaggle 大赛的情况基本是这样的,凡是非结构化数据相关,比如语音、图像,基本都是深度学习获胜,凡是结构化数据上的竞赛,基本都是 XGBoost 获胜。; U2 G6 _- Y: a, i+ X
; b9 p( I4 R9 F
1、回顾下GB、GBDT 0 j2 z, m7 o4 ^$ V+ G5 Q- Q& E GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类、回归、排序问题,因此这里尝试一步一步梳理GB、GBDT、xgboost,它们之间有非常紧密的联系,GBDT是以决策树(CART)为基学习器的GB算法,xgboost扩展和改进了GDBT,xgboost算法更快,准确率也相对高一些。 0 V5 W1 D# r, V \, u0 a * Z9 H) ]4 Z0 q, ~1.1、Gradient boosting(GB) / S: G7 h2 L0 S; _8 g4 d4 |6 B 机器学习中的学习算法的目标是为了优化或者说最小化loss Function, Gradient boosting的思想是迭代生多个(M个)弱的模型,然后将每个弱模型的预测结果相加,后面的模型基于前面学习模型的的效果生成的,关系如下:# {- V& j: j: [4 {8 A# V2 }
7 o# b, z9 M% |# k. ]5 K0 `. y2 Y3 g, O
2 |* _* Q6 @/ t( X
GB算法的思想很简单,关键是怎么生成?, [9 Y! b& }' Q) A# u. }6 b9 y
" @( D q' k* M 如果目标函数是回归问题的均方误差,很容易想到最理想的应该是能够完全拟合 ,这就是常说基于残差的学习。残差学习在回归问题中可以很好的使用,但是为了一般性(分类,排序问题),实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题残差和负梯度也是相同的。中的f,不要理解为传统意义上的函数,而是一个函数向量,向量中元素的个数与训练样本的个数相同,因此基于Loss Function函数空间的负梯度的学习也称为“伪残差”。1 [7 x8 {4 g2 ]6 O. T
# Q1 B. O& y4 a" y% R7 b
GB算法的步骤:' q/ s `" j* }9 e
, z1 Y8 U+ h+ m8 `1 K P: }1.初始化模型为常数值: 2 g" W9 I0 t- G0 ~ P 0 p: Z: i/ K1 o$ e 0 e+ G d6 f5 e8 s$ i$ P4 R- b( K % S* O, h% L& l, I$ T! A* r2.迭代生成M个基学习器 $ u( {1 r8 u" I5 Y( n& P: ]5 d, w3 q & i0 e- r1 _6 W# n 1)计算伪残差5 H4 B) C/ h7 }2 A
" g/ V( ?8 O0 e
( M$ Z. S" ?7 s+ _' S
U2 @8 J: E1 k4 P1 l
2.基于生成基学习器 7 ]* l( {8 H7 a3 L5 }3 Z3 Y. H( Z' U& A' S) u, a
3.计算最优的 9 ~0 e+ H1 u& _# { ?! f/ \- p1 M+ u! A4 P4 s- E% H, i9 L* C& \* q; K
9 z# V4 R; B, ~9 p0 p: g
4.更新模型 * O2 @% Q0 I; a8 h( V 2 A& u+ ?% d8 K" T3 b8 K) S9 i, J/ ?# K9 P( T% d
5 l3 q: u( k' c5 K# r, h. i' s2 [1.2、Gradient boosting Decision Tree(GBDT) 4 |& y* W \; j' v GBDT的原理篇在上一篇已经阐述过,这里稍微总结性下,GBDT是GB和DT的结合。要注意的是这里的决策树是分类回归树(是一种二叉树),GBDT中的决策树是个弱模型,有些GBDT的实现加入了随机抽样(subsample 0.5<=f <=0.8)提高模型的泛化能力。通过交叉验证的方法选择最优的参数。 . n* j2 ~$ h) M; x" v0 j9 ` / H. y5 t3 R( }8 p: P4 Q0 E因此GBDT实际的核心问题变成怎么基于使用CART回归树生成? % Y# Y' C/ E, s4 S( h: y$ O+ ~7 x% s3 D
2、Xgboost算法 1 o! M3 t) Y ~8 ]' D1 e- N 前面已经说过,xgboost可以说集成思想达到顶峰的一个模型,至少目前是这样,所以我们学习机器学习算法, 掌握这个是很有必要的。顺带提一下,Xgboost目前scikit-learn中没有实现,需要我们自行安装Xgboost,可以通过python调用,我自己也记录了一个纯小白都能安装好的方法。+ { v- l2 l% B+ N( j3 N
4 z0 q4 @/ a- T2 H1 k
全称:eXtreme Gradient Boosting(极值梯度提升算法)2 A! z2 A, X" O; U
作者:陈天奇(华盛顿大学博士) & D' F4 V# @$ N$ a/ N
基础:GBDT u3 ^# \# `/ q0 u: S- Q
所属:boosting迭代型、树类算法。 ) l! c$ ]5 W! Q: N
适用范围:分类、回归等1 T% [& v5 d, x' L2 M6 s
优点:速度快、效果好、能处理大规模数据、支持多种语言、支持自定义损失函数等等。4 N9 N/ q9 [2 _4 }
2.1、与GBDT的区别:/ r) E6 d: @& x. f4 D
首先我们先在大体上对xgboost有个大致的印象,然后我们在对其原理做详细的阐述。+ G5 J" o K- B: M' e
9 ^ w% v/ G* \- c
• XGBoost的基学习器除了可以是CART(这个时候就是GBDT)也可以是线性分类器,而GBDT只能是CART。 ! g4 [( f7 q7 k4 w% Q • XGBoost在代价函数中加入了正则项,用于控制模型的复杂度(正则项的方式不同,如果你仔细点话,GBDT是一种类似于缩 减系数,而XGBoost类似于L2正则化项)。 9 h+ D1 u$ m+ { • XGBoost借鉴了随机森林的做法,支持特征抽样,不仅防止过拟合,还能减少计算 8 j( N4 S9 `4 E$ J • XGBoost工具支持并行化 . v" P# }. v& d+ D K • 综合来说Xgboost的运算速度和算法精度都会优于GBDT3 u& q% J' H/ ^4 e7 n7 g# M
7 @. N' T. V ~8 Q2.2 Xgboost算法原理6 `1 a# U: ^' K# J- S T
Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART也可以是线性分类器(gblinear)。下面所有的内容来自原始paper,包括公式。 ' e! z+ S0 b) p. M 8 e8 n$ {/ G% }+ U1)树的结构 4 A/ e j; L1 Q3 Y/ ^+ Y4 N |/ p5 m, e- v8 m
我们从单一的树来考虑。对于其中每一棵回归树,其模型可以写成: : _' e' b4 y5 u/ Z. R& ?+ o5 |2 C
( [ @! h5 R. H& U6 q/ A( J ' Y- B" Z+ H, N9 Y; K 其中为叶子节点的得分值,表示样本对应的叶子节点。为该树的叶子节点个数。 8 A6 W- U4 B ^* Z: P 5 [# \7 H$ k" l$ i1 K8 `& `, ]5 Y& j 因此,在这里。我们将该树的复杂度写成:- p0 @$ J! m$ M/ r x+ v8 h
% W5 U @: F: R& E# a9 @ 其中,γγ为L1L1正则的惩罚项,λλ为L2L2正则的惩罚项 $ d# C+ i2 f/ C/ U1 ^2 d0 c3 g! {' V+ i$ L) S x
复杂度计算例子如下:# w ?) u4 ^& T# j; t
$ U" @ v# x! |: U5 z2 W8 v* }$ b ^" _9 _: m; D2 S0 w
. \+ |. p2 _; l) X4 J; S" r
2) 损失函数 S( a* v* Y7 u) E0 G ; a4 k5 C! Y) `6 y 前面已经说过,为了一般性,实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题残差和负梯度也是相同的。和传统的boosting tree模型一样,xgboost的提升模型也是采用的残差(或梯度负方向),不同的是分裂结点选取的时候不一定是最小平方损失。 7 O6 s: o& @" V0 V+ t: S- l+ ~7 R* |0 F! H
# E% \$ r) z& b对于有效数据的度量方法。 6 s6 ~5 m1 M- ?- }% D对于回归问题,默认值是rmse,对于分类问题,默认值是error。1 E6 m% |* y3 c* m+ c
典型值有: / \! B. @/ R4 ~, j& {rmse 均方根误差(∑Ni=1ϵ2N−−−−−√∑i=1Nϵ2N)1 [% O1 b) t7 t1 W; d& ]
mae 平均绝对误差(∑Ni=1|ϵ|N∑i=1N|ϵ|N)5 Y; y. _% B, E& M
logloss 负对数似然函数值2 ^( S; J$ Y8 ~4 {2 Z
error 二分类错误率(阈值为0.5): R% c, N, x( q
merror 多分类错误率4 \/ _5 e% w) z. P6 J5 a
mlogloss 多分类logloss损失函数 ! d: l5 ^* f! u oauc 曲线下面积 F4 [& i; D# u. k: s
python的Xgbosoost调参实例:推荐看 https://blog.csdn.net/han_xiaoyang/article/details/52665396 0 J n' j3 u0 O* M. e+ E/ ` ; N1 V! H2 c' G: M2 I5 v除此以外,xgboost除了原生版的调用以外,sklearn还为我们封装了一个sklearn版本调用的方法,from xgboost import XGBClassifier,调参同样可以借用网格搜索的方法,这是一篇xgboost的网格搜索的案例* c* K! u! z4 @ o% s! B
. z2 L& x* X. }4 J! ^; b
4、小结: s i. L8 I w# q$ n
xgboost与gdbt除了上述的不同,xgboost在实现时还做了许多优化:(以下转载于 机器学习系列(12)_XGBoost参数调优完全指南(附Python代码)) 5 B7 q9 W6 S/ A. a/ V6 `% U8 ]4 ~ h- w: _
1)并行处理0 G/ x- g0 q# D9 o/ ^/ {
/ ^: j. Y- X0 M
XGBoost可以实现并行处理,相比GBM有了速度的飞跃。3 x" N% z. [% s% J- N
不过,众所周知,Boosting算法是顺序处理的,它怎么可能并行呢?每一课树的构造都依赖于前一棵树,那具体是什么让我们能用多核处理器去构造一个树呢?我希望你理解了这句话的意思。如果你希望了解更多,点击这个链接。 k8 ^# w7 v' G5 ]- t- e
XGBoost 也支持Hadoop实现。 : k3 n0 x+ K- s9 k2)高度的灵活性 " u4 [2 d9 V) S& }( f- t, y' u, y# v
XGBoost 允许用户定义自定义优化目标和评价标准 % Y: Y3 g" `* X3 f- D- @2 R3)缺失值处理 2 m# q# h: I- r$ M8 m8 f * a5 t( P- ~6 F8 uXGBoost内置处理缺失值的规则。 2 Q5 \# [, x7 e" z用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值时的处理方法。 2 U; Q7 h0 B- d& @1 E i. m4)剪枝 7 t M0 N' D% P0 A/ ` X+ Q( x5 Z( F9 {. A4 V" S/ m0 g5)内置交叉验证 & A, ~# w( ]! E' Q; V" j n# v- }/ H( C6 H
XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。 ; N" D# y4 V; @! n6 O4 l9 i而GBM使用网格搜索,只能检测有限个值。 + O; a2 [& o! B o) |/ K/ y7 g 5 t0 k! \' ^0 x: F9 k * }: s4 n+ N) b5 D2 A/ {参考资料: & E+ y W8 S# r ) H5 r% X% K) e+ {- e. p' bhttps://www.cnblogs.com/wxquare/p/5541414.html / I0 {+ i( z/ G" B* D6 A ]* h: W3 j8 n
https://blog.csdn.net/a1b2c3d4123456/article/details/52849091 % o7 P% d$ S' n+ N) K* ? 1 G: c, b, g! v6 ]陈天奇的boosting tree的ppt:http://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf 4 k, S/ v: A/ g8 C+ s * A H t- i7 I: k7 J, b+ Qsklearn版本调用的方法:XGBoost Python API Reference (official guide)- H$ d2 u6 k/ G
" K% }; M& H# o6 H) P' r) w) r
XGBoost 参数:http://xgboost.apachecn.org/cn/latest/parameter.html#2 o% B/ `( J" H, H
4 Z2 f- m6 _2 b% s Y4 K& r4 A8 A% U/ E
XGBoost-Python完全调参指南-参数解释篇https://blog.csdn.net/wzmsltw/article/details/50994481 ; n: ^' L: Z% P0 U. c8 e0 u+ ]: n3 r# p2 ^
XGBoost参数调优完全指南(附Python代码)https://blog.csdn.net/han_xiaoyang/article/details/52665396 1 m% u* J$ p5 W8 Q& n: Y r% f$ ?6 u: [% S' @0 l
python 下实现xgboost 调参演示https://blog.csdn.net/weixin_41370083/article/details/79276887 7 v7 v" k8 n& q/ ]( G9 } 7 L+ [' c: {2 s% Y: w, N) ^' P3 N6 gXGBoost调参技巧(二)Titanic实战Top9%https://blog.csdn.net/c2a2o2/article/details/77646025 1 v# P2 I f, H; g! ]- M+ h4 V' {% h2 J( F# q' R8 Z# G# Q
1 |2 E O- E* F" l, k1 u, c————————————————) f, b3 V- o/ Q: s& i1 X: n7 \! G5 [, X
版权声明:本文为CSDN博主「且行且安~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 " O9 U: k. }. E) G+ c- u T0 r原文链接:https://blog.csdn.net/qq_20412595/article/details/82621744 ) s' L) k. E. G& ~- l$ L0 @) v/ y. y