/ U& L' [! ^5 j; ?9 R! h# T9 F/ V, Q; o% y
1.2、Gradient boosting Decision Tree(GBDT) 1 Q" }# `3 D6 h/ U& z GBDT的原理篇在上一篇已经阐述过,这里稍微总结性下,GBDT是GB和DT的结合。要注意的是这里的决策树是分类回归树(是一种二叉树),GBDT中的决策树是个弱模型,有些GBDT的实现加入了随机抽样(subsample 0.5<=f <=0.8)提高模型的泛化能力。通过交叉验证的方法选择最优的参数。6 |8 @( h6 h4 |, s; Z" e7 ~
9 |7 M- t& a/ m2 m+ U6 d2 r+ K" B6 u
因此GBDT实际的核心问题变成怎么基于使用CART回归树生成?# O" X: T. H% j6 ^- _
& s( ~$ o- U6 S. {7 G" I% O! E/ ?
2、Xgboost算法: U4 T3 _. R, T1 y
前面已经说过,xgboost可以说集成思想达到顶峰的一个模型,至少目前是这样,所以我们学习机器学习算法, 掌握这个是很有必要的。顺带提一下,Xgboost目前scikit-learn中没有实现,需要我们自行安装Xgboost,可以通过python调用,我自己也记录了一个纯小白都能安装好的方法。5 m! X% v! z* i0 |& R4 U
. V) H9 z$ v$ T
全称:eXtreme Gradient Boosting(极值梯度提升算法) 1 }+ H+ j& c8 q作者:陈天奇(华盛顿大学博士) ; F! O' V/ s2 h ]3 x基础:GBDT % O/ c& H3 o* `' U" T0 v所属:boosting迭代型、树类算法。 8 t9 V2 E# ^* ^5 }适用范围:分类、回归等6 _7 R1 l4 C' U# A+ k4 V, a
优点:速度快、效果好、能处理大规模数据、支持多种语言、支持自定义损失函数等等。6 W1 z5 U1 h; X6 ]
2.1、与GBDT的区别:( G+ z* \9 Y! v' y- n
首先我们先在大体上对xgboost有个大致的印象,然后我们在对其原理做详细的阐述。' Y) ? B/ c. k5 ~( V
# @/ ? B* Q% ^; |3 H" } • XGBoost的基学习器除了可以是CART(这个时候就是GBDT)也可以是线性分类器,而GBDT只能是CART。# \& K! `. [/ v C% U$ o! O
• XGBoost在代价函数中加入了正则项,用于控制模型的复杂度(正则项的方式不同,如果你仔细点话,GBDT是一种类似于缩 减系数,而XGBoost类似于L2正则化项)。; {% X) F" e. K. p# K4 Z! i5 {! `8 |
• XGBoost借鉴了随机森林的做法,支持特征抽样,不仅防止过拟合,还能减少计算; T! D0 R( k2 |' l4 m
• XGBoost工具支持并行化0 ?/ O, _+ ~, a. I
• 综合来说Xgboost的运算速度和算法精度都会优于GBDT 3 t) e% ?% I4 E% T8 f - T( w- P+ p5 F+ i, A- O2.2 Xgboost算法原理$ R9 U0 [; m, C1 x
Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART也可以是线性分类器(gblinear)。下面所有的内容来自原始paper,包括公式。 9 B, D6 g+ r* k* c8 Q# | & x/ G( j) ]; b" T! T1)树的结构 # f; B: M) m, i8 s/ `- F1 i' B. P7 Y1 l1 ?
我们从单一的树来考虑。对于其中每一棵回归树,其模型可以写成: * q% [* w" b8 a3 c; g, Z. O, i ; M5 U' G# M" A1 a3 j : x$ j% M4 a2 L : Y9 m" u/ n2 b5 @3 D; r N" R4 ^ 其中为叶子节点的得分值,表示样本对应的叶子节点。为该树的叶子节点个数。3 G* t2 t7 \" a' k3 ^9 e1 }: C
6 @# Y" z) E5 l3 ]9 X& N C 因此,在这里。我们将该树的复杂度写成: 7 J2 b. U* @5 \3 J, Y V0 p x: d- i$ O7 w9 d$ [! L: Q) N
其中,γγ为L1L1正则的惩罚项,λλ为L2L2正则的惩罚项 , y8 L8 ~* X- _ {/ Y/ y- H1 a& S- l8 E1 ]1 L* i( m, z
复杂度计算例子如下: n) m% }3 E" _3 L0 Z# b2 A: Z* c2 {- w; o) K8 k' U
) X1 y2 k* c4 O* P
% X6 x4 j& d3 j8 Q$ O7 ~2) 损失函数 3 U( [/ m! q/ S ~8 M 5 t$ t; S5 |) ^: {$ V- B 前面已经说过,为了一般性,实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题残差和负梯度也是相同的。和传统的boosting tree模型一样,xgboost的提升模型也是采用的残差(或梯度负方向),不同的是分裂结点选取的时候不一定是最小平方损失。 / D9 F5 L+ s7 D+ z) p4 V7 Z
1 k8 o1 J' S; z0 W
& [) E0 z6 k0 h: C ; s% q5 B0 T7 [5 t3 q% \对目标函数的改写:% ?8 d* I+ U/ q/ s
# n$ [# k* c6 J; w# X
0 k: D, J2 m) J% J" Y" F
$ ~' y, {+ M. @1 W, z 最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。这么写的原因很明显,由于之前的目标函数求最优解的过程中只对平方损失函数时候方便求,对于其他的损失函数变得很复杂,通过二阶泰勒展开式的变换,这样求解其他损失函数变得可行了。, K' O& m+ y# T3 t* @. T
) J4 r" v& {& e+ A" U 我相信到这里肯定都没有问题,接下来的理解是整个损失函数的难点,我自己开始学的时候想了一些时间,接下来我尽量用白话来叙述。: j, Q- k0 s: B8 u
0 X, e9 w9 |. A# H' L: o1)对的理解:在上面我们已经说了,当一个样本进来的时候,不管是回归问题还是分类问题,你最终都会掉到叶子结点上,而每颗树的每个叶子节点都会对应有一个得分(想象一下回归问题,每个叶子节点对应的是落入该叶子结点的所有训练样本的均值),所以可以理解为一个样本在t轮最终的得分函数。" `8 j: F* j" v% Y# Q# B; D
+ r3 x2 b8 R4 G" e4 V! U/ q, }
2)对的理解:其实这个的理解,我最初钻了牛角尖,其实只要当我们的损失函数一旦确定下来(理解的前提),这个求导就和我们高数中的求导一回事啦,只不过表达式看起来很唬人。3 s1 h3 Y4 U a( f. L
0 E5 Y/ N- j. t
3)目标函数全部转换成在第t棵树叶子节点的形式。从求和符号我们可以看出,是在对每个样本求损失,我们在第一点就已经说了,第i个样本最终都会落到树的叶子结点中去的,只是不同的叶子节点,你会取不同的值罢了。那我们能不能讲对样本的损失转移到对叶子结点中再求损失呢(后话,这个就是这么做的), 可以看做是每个样本在第t棵树的叶子节点得分值相关函数的结果之和,所以我们也能从第t棵树的叶子节点上来表示。 " k: n( L, C; J/ e: x( G; w4 O1 L) U2 o( Z* U5 M
- J" y- o0 O7 A! I7 h' e* A/ ~7 F; S/ r. n2 I) b; e
这里也在解释下,描述了一整颗树的模型,他当然能分解成每个叶子结点的集合啦,而刚好是每个叶子节点的得分函数,这两个于是就可以相互转化了。 2 P$ `. y& G. L' K! Q; u- k 6 O$ j& F. S2 W" u* x其中为第t棵树中总叶子节点的个数,表示样本落在第个叶子节点上,为第个叶子节点的得分值。2 r: t. o# D( l+ \8 C- H3 P
* Q- E: B8 {2 b8 e在这里,令 * a3 }6 n, r9 A G% A$ J! w$ m, z6 z5 I! O) w& R
/ L: U4 f/ R5 ^+ C. i
, M1 C8 f7 L" {* L; q& |$ @
对求偏导,并使其导函数等于0,则有:' D8 p6 N+ ~ m
7 s1 M3 b) k3 Y* R# \! X# o
: d: `4 ^) i6 @" Q+ h
+ p' }% `# Y$ n( w6 n
& k" ]- l7 e, J
\# ]4 c5 A: _* i* z1 Y( IXGBoost可以实现并行处理,相比GBM有了速度的飞跃。3 R2 V' u: a x6 r
不过,众所周知,Boosting算法是顺序处理的,它怎么可能并行呢?每一课树的构造都依赖于前一棵树,那具体是什么让我们能用多核处理器去构造一个树呢?我希望你理解了这句话的意思。如果你希望了解更多,点击这个链接。 , W9 S0 ^- z9 dXGBoost 也支持Hadoop实现。, V. s5 m( |& L! N4 k
2)高度的灵活性 + G7 l: k0 g! w, x) U8 k : c! z; _! ^; X# h1 {- T- \XGBoost 允许用户定义自定义优化目标和评价标准: v" s. v5 @8 F' w* j: O& C% o9 L x
3)缺失值处理9 h4 D) q; M4 b) e7 a/ o9 l
1 a) I y$ }1 Q3 sXGBoost内置处理缺失值的规则。 B$ R/ p" e. Y3 N b* t$ G
用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值时的处理方法。 % O, j4 d* H: a( K; g1 i4)剪枝+ a6 Q, H% _" t: ^ v
) ~6 f. Y: n: r! D% R( R8 `3 V
5)内置交叉验证# C6 v7 d* Z% n% a# d8 M* R
9 m; j& K7 e) s
XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。) b6 H6 O5 a1 m) x3 z# n
而GBM使用网格搜索,只能检测有限个值。; k7 L8 s7 z N; h. F [4 j
$ J8 z) R& a0 x3 o( X$ X + \, x* U: T: w+ s/ N$ G0 n1 _参考资料:7 D" e, S8 J& @ j& G7 b
' a: G6 P% f7 l/ ^* g0 k( H; Ehttps://www.cnblogs.com/wxquare/p/5541414.html 7 @, f& e, W" }) m6 |0 S 8 p( l7 L$ ], m4 G) K3 h$ R3 R( F) X4 thttps://blog.csdn.net/a1b2c3d4123456/article/details/52849091! _% g8 Z" Y" m) a) n