1. Greedy Function Approximation: A Gradient Boosting Machine
假设有一组输出或者响应y,并且有一组输入或者解释x = {x1,x2...,xn}, 我们的目标是用一个训练方法,使得训练方法得出的数值拟合y,目标可以表示为L(y ,Fx).
模型可以表示为:
其中 L(y ,Fx)在回归树中 可以是最小二乘(y − F2)^2,也可以是绝对值 |y − F2|,而在分类中则是,。
森林可以表示为M个决策树相加的过程,其中a(m)表示分裂变量,B(m)表示树得出的值。
最速下降:
最速下降的过程如下:
其中gm 就是所要求的梯度,其中 p(m-1) 也就是模型输出的结果y,等于前边m-1棵树输出的值的相加。pm 可以表示为−ρm gm ,其中ρm表达书为(5),也就是说最优的pm 是 Pm−1梯度上下降后的一个值,最优的ρm
是使损失函数最小的一个值,也就是得到的梯度上的树的值乘以一个常数。这个过程是一个线性搜索的过程。
应用到当前的问题中,也就是:
gradient boost 算法的整体步骤为:
关于回归问题的损失函数,当损失函数为平方的时候也就是 ((y − F)^ 2)/2 ,求得到偏导刚好是残差,也就是y˜i = yi − Fm−1(xi).
而当损失函数是绝对值的时候,偏导就是正数或者负数,参数的求解也不一样。如下:
线性搜索的过程就变成了直接求解中位数,也就是上边median函数包含的表达书。
在回归树方面,可以省略掉ρm。
对于每个在梯度上建立的树每个节点用线性搜索的方法寻找一个最优常数γ。
而对于绝对值lad的损失函数,γ的就变成了找出中位数。
lad仅仅需要寻找中位数,但是ls却需要线性搜索来寻找最优参数,所以lad要快上不少。
这两种损失函数对于波动比较大的数据并没有很好的支持,所以引入了huber损失。
也就是当损失大于某一个值之后,偏导变成了一个常量。这个临界值可以表示为:
而对于每个节点线性搜索最优解的过程就变了,大于δ 的就变成了寻找中位数,小于δ的数据继续线性搜索,但是二者合起来就变成了求得中位数之后根据其它的数据来矫正这个中位数。
这里边还提到了分类问题,顺便也看了一下,首先对模型的结果进行了归一化处理,损失函数变成了逻辑似然,偏导也变成了不一样的形式,整个过程如下:
线性搜索寻找最优参数的过程,运用了牛顿迭代公式求出了近似解,这也是分类问题比回归问题要快的原因。
为了控制拟合程度,引入了迭代次数和学习速率两个变量,其中迭代次数M也就是树的个数,学习速率也就是给每棵树学到的结果乘以一个因子,表达式如下:
根据实验得到迭代次数在200的时候模型基本上收敛,而最优的学习速率是0.1,但是学习速率也会和迭代次数有关系,需要尝试一下选择出最优结果。
分类和回归的分割点选定: