3 f# O6 i; {% n# V/ z" V8 K; ]2 y 7 C) r/ E/ A* w6 J , G: u, |# C! R$ d; Y2.迭代生成M个基学习器( E, y. S3 Q/ G w
" d9 {' R* W; v) O8 R7 g; {, J, l 1)计算伪残差2 C& w$ k% }% [8 v
) }, ]1 `2 ]; ^% O - n5 ?. w9 Y: p. C7 m# A R6 m0 \$ K
2.基于生成基学习器 " P- c- A: P& \8 ?6 M A+ e" ] 7 o1 T+ Y/ V# ^0 u% R 3.计算最优的 ( B# S1 a$ H# M k3 b7 t( v. q3 q , q- N# ^* M+ i0 ~! G f# O: ]0 w9 K4 s2 f& O% A$ K
$ v" A z8 s, E' z. H) R6 {4 u
4.更新模型- F7 f( O. R! s) {
4 s* w' t* n, ^, ` : R/ n' g1 ?/ ]( S0 f$ j1 [, H( j n, j
1.2、Gradient boosting Decision Tree(GBDT); ^# ^8 A0 f. b' Y4 ` l
GBDT的原理篇在上一篇已经阐述过,这里稍微总结性下,GBDT是GB和DT的结合。要注意的是这里的决策树是分类回归树(是一种二叉树),GBDT中的决策树是个弱模型,有些GBDT的实现加入了随机抽样(subsample 0.5<=f <=0.8)提高模型的泛化能力。通过交叉验证的方法选择最优的参数。8 M0 g4 W, h' T9 Q5 W
. b: j) ^0 q+ S0 r因此GBDT实际的核心问题变成怎么基于使用CART回归树生成? 9 ~. Q X5 c# n6 y( g3 K' s/ ]& x) [
2、Xgboost算法 u7 m- l I; h+ c, s$ G) H% g. }
前面已经说过,xgboost可以说集成思想达到顶峰的一个模型,至少目前是这样,所以我们学习机器学习算法, 掌握这个是很有必要的。顺带提一下,Xgboost目前scikit-learn中没有实现,需要我们自行安装Xgboost,可以通过python调用,我自己也记录了一个纯小白都能安装好的方法。 ) u/ Y6 F' Z) q! S " G2 e$ v/ `; k) E全称:eXtreme Gradient Boosting(极值梯度提升算法) ( a {2 n1 C% y/ ^8 u作者:陈天奇(华盛顿大学博士) : s5 U, r' l5 n5 U3 Y: r3 K
基础:GBDT - y* f6 N: r6 i4 L" r0 q所属:boosting迭代型、树类算法。 9 k! m! p b) P; ?6 n3 q+ H
适用范围:分类、回归等; j8 p/ Y) k' J ?$ B
优点:速度快、效果好、能处理大规模数据、支持多种语言、支持自定义损失函数等等。5 ]4 D* p3 K* G, ?" Z ?
2.1、与GBDT的区别: / i4 ]: L: y6 B: r, c首先我们先在大体上对xgboost有个大致的印象,然后我们在对其原理做详细的阐述。8 |4 I1 Y' @ {
" k# r9 u; \! R • XGBoost的基学习器除了可以是CART(这个时候就是GBDT)也可以是线性分类器,而GBDT只能是CART。; P9 P/ {. E' c' [4 h
• XGBoost在代价函数中加入了正则项,用于控制模型的复杂度(正则项的方式不同,如果你仔细点话,GBDT是一种类似于缩 减系数,而XGBoost类似于L2正则化项)。 + ~6 [8 x$ A/ k7 c& F! H4 ^0 h0 N • XGBoost借鉴了随机森林的做法,支持特征抽样,不仅防止过拟合,还能减少计算 8 o5 k {1 C, W • XGBoost工具支持并行化' G! q R w ~- X0 ?/ P8 f) j
• 综合来说Xgboost的运算速度和算法精度都会优于GBDT ; S. ~. E! i! Z& Y0 b ' A* ]) `; K0 \# T: k2.2 Xgboost算法原理 , [! N: \/ L. l! P3 ]* s Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART也可以是线性分类器(gblinear)。下面所有的内容来自原始paper,包括公式。 ) p5 X# C2 `; r1 d: {% s) F . ~. b! B$ Q# i I& `1)树的结构, D' z- N/ a4 _5 U, ~
' r) b( m; P, j' x3 f" J/ s$ y) R2 f
我们从单一的树来考虑。对于其中每一棵回归树,其模型可以写成: # q7 p( ?3 e, p1 S- ^: y/ q7 I/ o( K* p
, p: d, k& N' P& C9 L/ l
; N6 k' \6 x. @* |
其中为叶子节点的得分值,表示样本对应的叶子节点。为该树的叶子节点个数。 9 { D- e0 |8 h6 c9 m- I" `2 l4 L& D! T" h
因此,在这里。我们将该树的复杂度写成: 8 U) y8 H: c1 d; l. Q: M8 k$ b7 s& n* g- c. n
其中,γγ为L1L1正则的惩罚项,λλ为L2L2正则的惩罚项6 a: u9 K9 c+ [. V1 z/ Q' [+ @
. u+ t( u, z/ S. m$ p 复杂度计算例子如下: 0 d( d2 h7 P) ]" Z- n3 l I+ E ) y" G, [, p. C) u% o4 E: [ ! j+ d$ { v8 W4 d, z" d7 _+ d% u 4 c( T9 k: ?7 Z: T1 d2) 损失函数0 E0 R- F+ F; P+ y* g+ K! q& l
4 p! y3 H; P0 J3 `- A
前面已经说过,为了一般性,实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题残差和负梯度也是相同的。和传统的boosting tree模型一样,xgboost的提升模型也是采用的残差(或梯度负方向),不同的是分裂结点选取的时候不一定是最小平方损失。 0 E- N3 e% P( u+ F) x) u
- _% `0 a7 p7 t, c& A, t# p3 u3 A5 T5 R" M) _& d
) h8 [8 `( g; I# a) ]6 E
对目标函数的改写:4 R) Q1 Y4 v# @5 f- }* ^, O" u
: x/ |" M% G; g5 s9 q
. H. L4 H2 E# U/ J9 S( W$ _5 s6 _
h4 K$ w! w) {$ }! r# m
最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。这么写的原因很明显,由于之前的目标函数求最优解的过程中只对平方损失函数时候方便求,对于其他的损失函数变得很复杂,通过二阶泰勒展开式的变换,这样求解其他损失函数变得可行了。5 g4 W4 I6 K( K. W. j
* X1 K) b: n9 [ W$ C 我相信到这里肯定都没有问题,接下来的理解是整个损失函数的难点,我自己开始学的时候想了一些时间,接下来我尽量用白话来叙述。# n( u8 k" Y% ^8 U
- u8 L( \0 w+ E0 L! x6 E) U; ]1)对的理解:在上面我们已经说了,当一个样本进来的时候,不管是回归问题还是分类问题,你最终都会掉到叶子结点上,而每颗树的每个叶子节点都会对应有一个得分(想象一下回归问题,每个叶子节点对应的是落入该叶子结点的所有训练样本的均值),所以可以理解为一个样本在t轮最终的得分函数。 ; r. d6 \: L' f( P% V P8 F6 X2 W. [' \
2)对的理解:其实这个的理解,我最初钻了牛角尖,其实只要当我们的损失函数一旦确定下来(理解的前提),这个求导就和我们高数中的求导一回事啦,只不过表达式看起来很唬人。& f) L1 b! {/ O# z3 a6 p: }" Q
# O9 l" X# U, P" I3)目标函数全部转换成在第t棵树叶子节点的形式。从求和符号我们可以看出,是在对每个样本求损失,我们在第一点就已经说了,第i个样本最终都会落到树的叶子结点中去的,只是不同的叶子节点,你会取不同的值罢了。那我们能不能讲对样本的损失转移到对叶子结点中再求损失呢(后话,这个就是这么做的), 可以看做是每个样本在第t棵树的叶子节点得分值相关函数的结果之和,所以我们也能从第t棵树的叶子节点上来表示。 Z3 Z [& s0 E) B' p
9 f# E# m8 q. x0 u; ?. j1 x) _& {9 o; W+ q8 i9 J6 Z
4 O/ m: }/ `* d) H/ ]1 m
这里也在解释下,描述了一整颗树的模型,他当然能分解成每个叶子结点的集合啦,而刚好是每个叶子节点的得分函数,这两个于是就可以相互转化了。* i |3 Q1 N) B
) N) L1 c) y' y. [+ h
其中为第t棵树中总叶子节点的个数,表示样本落在第个叶子节点上,为第个叶子节点的得分值。. C4 j" ?# b9 r; I$ v6 H* L5 W
$ c% I5 |. ]1 w7 k0 Z, B0 k# e7 }$ p
在这里,令 / r2 r$ \ T, S: u; a. ?& G 0 e3 b# o+ B) r- ^3 T' {# R. Z" F ; _9 N3 @4 S' A# s- y K4 I% h& {" k; k3 |- i+ W1 @/ {& ^
对求偏导,并使其导函数等于0,则有: * c5 B2 r9 Y7 S3 D+ ?+ W8 {; w& A' g, O
) S# B% L+ V8 W* o) K/ W' ]7 ?
! \6 D/ d- V9 t% C. X