前言
看完统计学习方法有一段时间了,一直拖着没有总结。临近期末,复习完课程再去学新的知识过于疲劳,就想着把之前决定写的总结都给补一下。统计学习方法实现基本也差不多完成了(还有一两章寒假慢慢补吧),所有代码详见github(包括决策树,逻辑回归,SVM,梯度提升树,Adaboost,隐马尔可夫模型等)。所有实现都有很详细的注释,如果能够帮助到你的话就可以点个赞吧~
正文
回归树
在讲梯度提升树之前,先简单了解下回归树。因为GBDT中每一轮对残差拟合的都是回归树(无论是用GBDT做回归还是分类)。
在CART算法中,回归树均为二叉树,内部节点特征值作为分割点,左边分支对应特征值小于该切分点,右边分支对应特征值大于该切分点。对于每个分支递归的寻找特征值与切分点,最后将输入空间(即特征空间)划分为了有限的单元(也就是叶节点),然后在在每一个单元上给出预测的值作为最终输出。
下面我们思考一下回归树的生成
首先我们有输入变量X与输出变量Y。共同构成训练集D{(x1,y1),(x2,y2)…(xn,yn)}
假定我们已经划分好了一棵树,它将输入空间划分为R1,R2,…,Rm总共m个单元(叶节点)。在每一个单元上预测值为cm。那么回归树可以表示为 f ( x ) = ∑ m = 1 M c m I ( x i ϵ R m ) f(x)=\sum_{m=1}^{M} c_{m}I (x_i \epsilon R_m ) f(x)=m=1∑McmI(xiϵRm)
在每一个叶节点上,我们的损失函数使用MSE(均方误差)来衡量我们预测的准确性,则在该叶节点上损失为 L m = ∑ x ϵ R m ( y i − c m ) 2 L_m=\sum_{x\epsilon Rm}(y_{i}-c_m)^2 Lm=xϵRm∑(yi−cm)2
那么我们怎么获得使得每一个叶节点上的损失最小呢。我们以cm为参数,对损失函数求导,令其为0,即可获得cm最佳值。如果你对于求和符号很不习惯,你可以试试一项一项的写,然后对每一个二次项中的cm求导,所有二次项相加和为0,得到cm即叶节点上所有值的均值。还是做个示范吧
∂ L m ∂ c m = ( y 1 − c m ) + ( y 2 − c m ) + . . . + ( y n − c m ) = 0 \frac{\partial L_m}{\partial c_m}=(y_1-c_m)+(y_2-c_m)+...+(y_n-c_m)=0 ∂cm∂Lm=(y1−cm)+(y2−cm)+...+(yn−cm)=0
即 c m = a v g ( y i ∣ x i ϵ R m ) c_m=avg(y_i|x_i\epsilon R_m) cm=avg(yi∣xiϵRm)
当我们获得了叶节点,基于以上我们就知道了如何获取最佳预测值了。那么下面的任务就是如何对于对输入空间进行划分呢。
我们采用启发式的划分法,遍历所有可能的划分特征以及每一个特征对应的值,尝试以该值作为切分点构建左右节点。注意,回归树的分裂准则也是MSE。那么,我们就只需要找到划分之后似的左右节点MSE之和最小的特征与特征值作为切分变量(split variable)与切分点(split point)。假设当前选取第j个变量与其取值s,则左右区域R1与R2为: R 1 ( j , s ) = ( x ∣ x ( j ) < = s ) R_{1(j,s)}= (x|x^{(j)}<=s) R1(j,s)=(x∣x(j)<=s), R 2 ( j , s ) = ( x ∣ x ( j ) > s ) R_{2(j,s)}= (x|x^{(j)}>s) R2(j,s)=(x∣x(j)>s)
则我们遍历所有切分特征与切分点,求解
min j , s [ min c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] \min _{j, s}\left[\min _{c_{1}} \sum_{x_{i} \in R_{1}(j, s)}\left(y_{i}-c_{1}\right)^{2}+\min _{c_{2}} \sum_{x_{i} \in R_{2}(j, s)}\left(y_{i}-c_{2}\right)^{2}\right] j,smin⎣⎡c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2⎦⎤
从而获得最解切分变量与切分点。其中,确定切分之后,c1,c2的值为
c 1 = a v g ( y i ∣ x i ϵ R 1 ( j , s ) ) ) c1=avg(yi|xi\epsilon R_{1(j,s))}) c1=avg(yi∣xiϵR1(j,s)))
c 2 = a v g ( y i ∣ x i ϵ R 2 ( j , s ) ) ) c2=avg(yi|xi\epsilon R_{2(j,s))}) c2=avg(yi∣xiϵR2(j,s)))
最小二乘回归树生成算法
回归提升树
在进入正题之前,再简单说说回归提升树。提升树模型使用的前向分步算法,模型是决策树的加法模型。首先确定初始提升树 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0。则在第m步的时候,模型就是 f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x)=f_{m-1}(x)+T(x; \theta_m) fm(x)=f