回归算法已经实现,可参考《集成算法之Boosting - GBDT回归算法 手推原理 以及 python 实现》 https://blog.csdn.net/Lee_Yu_Rui/article/details/107309184
本章继续完成分类算法的基本原理和python实现,在进行推导之前首先解释几个概念:
1. odds和概率的关系
红球的Odds是红色/绿色, 红色的概率是 红色/所有。 所以odds和概率是完全不一样的概念,但是两者可以转化
下图可知发生事件A的 odds = P/(1-P), P事件A发生的概率
2. 图一中 表示红球表示赢得比赛 ,绿球表示输了比赛,如果一共就10场,那赢了6场 和输了 4 场是一个意思,但是在odds上却有很大的差别 odds(红球) = 6/4 , odds(绿球) = 4/6,如果有1000场比赛呢,这个差别会更大。所以我们没办法用odds来解释发生事情的可能性, 为了便于理解所以引入log(odds),从下图中左边转成右边,是从odds转成 log(odds),原来的odds(绿球) = 4/6 如果红球变成1000个这个值会无限接近于0,所有odds(绿球)在0-1之间,而odds(红球)是在1-正无穷,显然这是不对称的。转变成右图之后,两者就关于0对称,所以就具备了可比性 另外 log(odds)是服从正态分布的有利与决策
3. P 和odds有关系,那么P和log(odds)关系是什么?
4. https://blog.csdn.net/Lee_Yu_Rui/article/details/107309184这里提到Gradient boosting算法要确定损失函数,回归采用的是平方损失,分类我们采用对数损失
损失函数就通过以上的转变从概率转成了 log(odds)的形式,你可能很好奇,为啥这么折腾 变成现在这个样子,接下来的结果应该会说服你。
下图是损失函数的一阶导和二阶导,是相当简单的,求导过程就不给了,链式求导和求导四则运算用一下就行,时刻记得1.3中推得的等式就可以得到如下结果
Gradient boosting算法的通用流程:
input: dataset { , 损失函数,回归问题最常用的损失函数是平方损失函数
step 1 . 通过寻找损失函数最小是对应的来设置初值
step 2. for m= 1 to M:
(a) 计算损失函数的负梯度值(也叫伪残差)
(b) 建立学习器拟合以上残差,并建立每个叶子节点最终区域 (就是记录在每个叶子节点的数据都有哪些,便于之后步骤的数据根据和伪残差修正), j = 1,2...Jm ,Jm表示该树叶子节点的个数
(c)通过最小化每个节点中数据的损失函数和,计算每个节点的预测值