最近偶然接触到一种回归算法,叫做前向分布回归(Forward Stagewise Regression),注意这不是那个向前逐步回归(Forward stepwise regression),stepwise和stagewise,还是有区别的,网上关于他的介绍非常少,中文社区基本就没怎么看到了,就顺手写一下吧,算法的思想来源于boosting,理解这个也有助于之后对各种树模型的boosting算法的学习。
算法原理
这个算法的思想与boosting类似,每次迭代时都挑选出一个最优的变量来拟合残差,具体步骤如下:
- 首先将截距项\(\beta _0\)设置为\(\bar{y}\),所有的自变量系数\(\beta\)都设为0,残差项设置为\(r=y-\bar y\)
- 挑选出与残差项最相关的自变量\(x_j\)
- 更新\(\beta _j\)的值:,其中\(\delta_j=\epsilon \times \text{sign}[\langle x_j,r \rangle]\),这个\(\text{sign}[\langle x_j,r \rangle]\)代表相关性的正负,\(\epsilon\)代表步长。再更新下残差项的值:\(r=r-\delta_j x_j\)
- 重复步骤2,3,直到达到最大迭代次数或者所有的变量都与残差项无关。 这个算法的优点在于与Lasso回归有着异曲同工之妙,通过选择合适的迭代次数和步长,可以使得部分变量的系数压缩为0,就可以起到变量选择和降低方差的作用,因此在高维数据的场景下会有较好的表现,再偷一张《The Elements of Statistical Learning》的变量系数路径图来说明这一点,左图的横轴为Lasso的L1范式,右图的横轴为前向分布回归的迭代次数,可以看到,变量系数的压缩路径大体上是一致的。
Python实现
用波斯顿房价的数据集来做个测试,将迭代次数设为2000的时候,mse要略小于线性回归: 因为这个数据集只有13个变量,而且每个变量都很重要,所以前向分布回归的优势并没有很明显,不过通过调参效果还是可以比普通的线性回归好那么一点,代码如下:
1 | import numpy as np |
总结
前向分布回归和Lasso回归本质上其实差不多,而且两者好像都是最小角回归(Least angle regression)的一个变种,具体可以参见ESL这本书(太难了我看不懂),这两张回归算法都能起到压缩系数和变量选择的作用,但是前向分布回归的计算效率比较差,所以Lasso似乎更为人熟知,不过前者为我们学习boosting相关算法提供了一个不错的切入点。