本文主要演示计算过程,不进行理论公式推导,网上理论的文章很多,可自行寻找,但是细节全面演示的几乎很少,本文演示计算细节。

1、模拟数据,15个样本,2个特征,二分类,概率预测

x1

x2

label

1

-5

0

2

5

0

3

-2

1

1

2

1

2

0

1

6

-5

1

7

5

1

6

-2

0

7

2

0

6

0

1

8

-5

1

9

5

1

10

-2

0

8

2

0

9

0

1

2、python  xgb 参数准备

      这里为了简单起见,树的深度设置为3(max_depth=3),树的颗数设置为2(num_boost_round=2),学习率为0.1(eta=0.1)。另外再设置两个正则的参数, \lambda=1,\gamma=0。

如何用python计算 一张图的光照_决策树

3、以logist 为xgb损失函数的一阶和二阶导数

如何用python计算 一张图的光照_割点_02

如何用python计算 一张图的光照_决策树_03

gi=base_score-lable

hi=base_score*(1-base_score)

x1

x2

label

base-score

gi

hi

1

-5

0

0.5

0.5

0.25

2

5

0

0.5

0.5

0.25

3

-2

1

0.5

-0.5

0.25

1

2

1

0.5

-0.5

0.25

2

0

1

0.5

-0.5

0.25

6

-5

1

0.5

-0.5

0.25

7

5

1

0.5

-0.5

0.25

6

-2

0

0.5

0.5

0.25

7

2

0

0.5

0.5

0.25

6

0

1

0.5

-0.5

0.25

8

-5

1

0.5

-0.5

0.25

9

5

1

0.5

-0.5

0.25

10

-2

0

0.5

0.5

0.25

8

2

0

0.5

0.5

0.25

9

0

1

0.5

-0.5

0.25

4、计算生成第一棵树,计算gain,求最好的分割特征以及对应的分割点

如何用python计算 一张图的光照_python_04

如何用python计算 一张图的光照_割点_05

如何用python计算 一张图的光照_手机的python怎么画图_06

以上计算寻找gain最大的阈值以及特征(红色表格);x1,x1<10,为左分支,x1>=10,右分支,第一棵树深度1生成

4.2 计算第一棵树的深度2

如何用python计算 一张图的光照_手机的python怎么画图_07

如何用python计算 一张图的光照_如何用python计算 一张图的光照_08

4.3 计算第一棵树的深度3

如何用python计算 一张图的光照_手机的python怎么画图_09

先看节点编号3,对特征x1,和x2 计算gain计算

如何用python计算 一张图的光照_决策树_10

再看节点编号4,对特征x1,和x2 计算gain计算

如何用python计算 一张图的光照_决策树_11

下面看下python的计算结果可以看跟上面一致

如何用python计算 一张图的光照_割点_12

5、对上图进行画图

如何用python计算 一张图的光照_决策树_13

6、leaf为每棵树的评分,通过excel计算评分

如何用python计算 一张图的光照_手机的python怎么画图_14

7、为了方便,假设我们的xgb只用一棵树,我们计算输出的概率,然后与右图的python结果对比,是一致的

如何用python计算 一张图的光照_如何用python计算 一张图的光照_15

8、我们继续按开篇的假设去生成第二课树,我们的样本量没有变,这时候我们的目标y值变了,变成了残差,也就是模型预测的残差,去直接学习这个残差,这个就是boosting提升方法

初始化每个样本的概率为0.5,求解下面的方程,x=0,正好,样本的开始得分初始得分为0分,下面我们更新目标值,生成新的样本

如何用python计算 一张图的光照_决策树_16

第二棵树的样本

如何用python计算 一张图的光照_python_17

      我们看第二课树的样本的初始概率由第一棵树初始概率0.5替换成了第一棵树预测的概率,第一个样本预测0.49,相对于0的预测还差0.49残差,而在初始阶段,模型都差0.5残差,说明第一棵已经学习到了0.01残差,逼近目标值0;对于第三个样本0.522712,相对于1还差0.47个残差,我们看最终的残差其实显现在gi中

对上面样本继续分支按第一棵树的思路生成第二棵树(这里不再演示),最后我们得到上边第一棵树,和下边的第二棵树

如何用python计算 一张图的光照_手机的python怎么画图_18

如何用python计算 一张图的光照_决策树_19

决策树输出txt格式

如何用python计算 一张图的光照_python_20

如何用python计算 一张图的光照_如何用python计算 一张图的光照_21

9、树结构解析,通过已经训练好的决策树寻找样本落在每颗树的叶子,vlookup匹配分数,然后求和叶子得分,在对叶子进行概率转换得到proba列,与python代码叶子索引、叶子得分、预测概率一致

如何用python计算 一张图的光照_割点_22

10、python一些其他的输出,weight,gain,cover,total_gain,total_cover等计算

如何用python计算 一张图的光照_如何用python计算 一张图的光照_23

weight是特征在所有树中被分割的次数求和,从上表和上面的决策树图可以看出,x1参与了6次分割,x2参与了2次分割,所以重要性就是这么计算的,我们常看的xgb画图重要性也是这么计算的,

如何用python计算 一张图的光照_如何用python计算 一张图的光照_24

下面我们再看特征重要性gain与total_gain,我们先看下这个表,来源上面表,只保留分支节点

如何用python计算 一张图的光照_割点_25

特征得分重要性,python输出

如何用python计算 一张图的光照_割点_26

如何用python计算 一张图的光照_决策树_27


参考来源:

https://www.jianshu.com/p/ac1c12f3fba1