Gradient Boost的算法流程

     

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类

备注:这里

gbdt如何用于分类 gbdt做分类_分类_02

表示损失函数,

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_03

表示样本在相对于决策面(后续分析回归问题和分类问题)的得分。

About Logistic

      对于二分类任务而言,常常采用Log-loss:

                                   

gbdt如何用于分类 gbdt做分类_MSE_04

,其中

gbdt如何用于分类 gbdt做分类_MSE_05

      与算法流程相对应,为了便于后续推导方便,这里对Log-loss进行化简:      

                                            

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_06

     

gbdt如何用于分类 gbdt做分类_MSE_07

关于得分F(x)的一阶、二阶导数为:                                                        

gbdt如何用于分类 gbdt做分类_GBDT_08

                                                       

gbdt如何用于分类 gbdt做分类_MSE_09

  

     如果采用Log-loss后使用GBDT关于二分类任务的算法,则有:

                                                         

gbdt如何用于分类 gbdt做分类_分类_10

     在第m轮的学习中,CART的第j个叶子节点

gbdt如何用于分类 gbdt做分类_数据集_11

的得分的推导公式:                                       

gbdt如何用于分类 gbdt做分类_数据集_12

Log_TreeBoost

About Softmax

对于多分类任务而言,常常采用softmax:

                                             

gbdt如何用于分类 gbdt做分类_数据集_13

           

对应的一阶导数:

                                                   

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_14

求解叶子节点的目标函数:

                                                   

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_15

解得叶子得分:

                                                                   

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_16

Sm_TreeBoost

gbdt如何用于分类 gbdt做分类_GBDT_17

算例

gbdt如何用于分类 gbdt做分类_MSE_18

1

2

3

4

5

6

7

8

9

10

gbdt如何用于分类 gbdt做分类_MSE_19

0

0

0

1

1

0

0

0

1

1

                                                                                   表1.数据集信息

参数的设置:

  • loss函数:Log-loss;
  • 回归树的分裂准则:MSE;
  • 树的深度:1(即决策树桩)
  • 学习率:0.1;

step - 1 : 初始化算法 

               首先,计算

gbdt如何用于分类 gbdt做分类_数据集_20

的取值:                                                                      

gbdt如何用于分类 gbdt做分类_GBDT_21

              利用GBDT-Logloss算法中step-2a计算loss函数关于

gbdt如何用于分类 gbdt做分类_数据集_20

的负梯度 :                                                         

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_23

              带入上述结果,得到各样本在loss函数中关于

gbdt如何用于分类 gbdt做分类_数据集_20

的负梯度:

gbdt如何用于分类 gbdt做分类_MSE_18

1

2

3

4

5

6

7

8

9

10

gbdt如何用于分类 gbdt做分类_数据集_26

-0.4

-0.4

-0.4

0.6

0.6

-0.4

-0.4

-0.4

0.6

0.6

                                                                               表2.loss函数关于

gbdt如何用于分类 gbdt做分类_数据集_20

的负梯度

step - 2 : 拟合第一棵树

若采用MSE作为分裂准则,首先规范几个符号:

                                                   MSE(x=val) = { var(L) * |L| + var(R) * |R| } / (|L| + R|)

其中,L={x|x<=val},R={x|x>val},|L|、|R|依次表示集合L和R中元素的个数,var表示计算集合元素的方差。【这里特别感谢csuyhb的提醒】

若以x1为分裂点,则MSE(x=x1) = {var({-0.4})*1 + var({-0.4, -0.4, 0.6,  0.6, -0.4, -0.4, -0.4,  0.6,  0.6}) *9}/10 = 0.2222;

若以x2为分裂点,则MSE(x=x2) = {var({-0.4, -0.4})*2 + var({-0.4, 0.6,  0.6, -0.4, -0.4, -0.4,  0.6,  0.6})*8}/10 = 0.2000;

其它分裂点类似,可得如下结果:

分裂点

1

2

3

4

5

6

7

8

9

10

   mse

0.2222

0.2000

0.1714

0.2250

0.2400

0.2333

0.2095

0.1500

0.2000

0.2400

                                                                           表3.基于表2得到的各分裂点对应的MSE

      易知,最优划分点为split_point = x8,从而得到如下的决策树桩:

                                                                          

gbdt如何用于分类 gbdt做分类_MSE_28

      计算左、右两侧叶子的预测值,由公式:

                                                                       

gbdt如何用于分类 gbdt做分类_MSE_29

      可得 

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_30

。更新

gbdt如何用于分类 gbdt做分类_分类_31

:                                                                   

gbdt如何用于分类 gbdt做分类_分类_32

                               这里

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_33

表示学习率,学习率过小,导致算法收敛过慢;反之,则容易导致算法在迭代过程中产生震荡,容易陷入局部最优。这 里我们取

gbdt如何用于分类 gbdt做分类_分类_34

,得到表4所示的

gbdt如何用于分类 gbdt做分类_分类_31

对数据集的预测得分为:

gbdt如何用于分类 gbdt做分类_MSE_18

1

2

3

4

5

6

7

8

9

10

gbdt如何用于分类 gbdt做分类_数据集_37

-0.468

-0.468

-0.468

-0.468

-0.468

-0.468

-0.468

-0.468

-0.1555

-0.1555

                                                                        表4. F1(x)对各样本的预测得分

     同样,利用下式可以得到Log-loss关于

gbdt如何用于分类 gbdt做分类_分类_31

的负梯度:                                                 

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_23

gbdt如何用于分类 gbdt做分类_GBDT_40

1

2

3

4

5

6

7

8

9

10

gbdt如何用于分类 gbdt做分类_GBDT_41

-0.3851

-0.3851

-0.3851

0.6149

0.6149

-0.3851

-0.3851

-0.3851

0.5388

0.5388

                                                                   表5.  Log-loss函数关于

gbdt如何用于分类 gbdt做分类_分类_31

的负梯度

step - 3 : 拟合第2棵树

       与计算第二棵树时过程类似,首先基于表5计算各分裂点的mse:

分裂点

1

2

3

4

5

6

7

8

9

10

mse

0.2062

0.1856

0.1592

0.2106

0.2224

0.2187

0.1998

0.1500

0.1904

0.2227

                                                                   表6.  基于表5得到的各分裂点对应的MSE

     对应的最优划分点为split_point = 8,得到与第一个树相同的决策树桩。进一步得到左、右两侧叶子的预测值为:

                                              

gbdt如何用于分类 gbdt做分类_MSE_43

.      得到

gbdt如何用于分类 gbdt做分类_GBDT_44

对数据集的预测得分为:

gbdt如何用于分类 gbdt做分类_GBDT_40

1

2

3

4

5

6

7

8

9

10

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_46

-0.5251

-0.5251

-0.5251

-0.5251

-0.5251

-0.5251

-0.5251

-0.5251

0.0613

0.0613

                                                                      表7. F2(x)对各样本的预测得分

类似地,我们得到

gbdt如何用于分类 gbdt做分类_MSE_47

对数据集的预测得分为:

gbdt如何用于分类 gbdt做分类_GBDT_40

1

2

3

4

5

6

7

8

9

10

gbdt如何用于分类 gbdt做分类_MSE_49

-1.0461

-1.0461

-1.0461

-1.0461

-1.0461

-1.0461

-1.0461

-1.0461

2.0018

2.0018

                                                                     表8. F3(x)对各样本的预测得分

通过sigmod函数将上述得分转换为概率:

                                                                            

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_50

gbdt如何用于分类 gbdt做分类_GBDT_40

1

2

3

4

5

6

7

8

9

10

gbdt如何用于分类 gbdt做分类_gbdt如何用于分类_52

0.2600

0.2600

0.2600

0.2600

0.2600

0.2600

0.2600

0.2600

0.8810

0.8810

                                                                     表9. F3(x)对各样本的预测概率 

Inference

[1] . Jerome Friedman. Greedy function approximation: a gradient boosting machine[2001]

[2].