本文主要演示计算过程,不进行理论公式推导,网上理论的文章很多,可自行寻找,但是细节全面演示的几乎很少,本文演示计算细节。
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。
3、以logist 为xgb损失函数的一阶和二阶导数
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,求最好的分割特征以及对应的分割点
以上计算寻找gain最大的阈值以及特征(红色表格);x1,x1<10,为左分支,x1>=10,右分支,第一棵树深度1生成
4.2 计算第一棵树的深度2
4.3 计算第一棵树的深度3
先看节点编号3,对特征x1,和x2 计算gain计算
再看节点编号4,对特征x1,和x2 计算gain计算
下面看下python的计算结果可以看跟上面一致
5、对上图进行画图
6、leaf为每棵树的评分,通过excel计算评分
7、为了方便,假设我们的xgb只用一棵树,我们计算输出的概率,然后与右图的python结果对比,是一致的
8、我们继续按开篇的假设去生成第二课树,我们的样本量没有变,这时候我们的目标y值变了,变成了残差,也就是模型预测的残差,去直接学习这个残差,这个就是boosting提升方法
初始化每个样本的概率为0.5,求解下面的方程,x=0,正好,样本的开始得分初始得分为0分,下面我们更新目标值,生成新的样本
第二棵树的样本
我们看第二课树的样本的初始概率由第一棵树初始概率0.5替换成了第一棵树预测的概率,第一个样本预测0.49,相对于0的预测还差0.49残差,而在初始阶段,模型都差0.5残差,说明第一棵已经学习到了0.01残差,逼近目标值0;对于第三个样本0.522712,相对于1还差0.47个残差,我们看最终的残差其实显现在gi中
对上面样本继续分支按第一棵树的思路生成第二棵树(这里不再演示),最后我们得到上边第一棵树,和下边的第二棵树
决策树输出txt格式
9、树结构解析,通过已经训练好的决策树寻找样本落在每颗树的叶子,vlookup匹配分数,然后求和叶子得分,在对叶子进行概率转换得到proba列,与python代码叶子索引、叶子得分、预测概率一致
10、python一些其他的输出,weight,gain,cover,total_gain,total_cover等计算
weight是特征在所有树中被分割的次数求和,从上表和上面的决策树图可以看出,x1参与了6次分割,x2参与了2次分割,所以重要性就是这么计算的,我们常看的xgb画图重要性也是这么计算的,
下面我们再看特征重要性gain与total_gain,我们先看下这个表,来源上面表,只保留分支节点
特征得分重要性,python输出
参考来源: