【统计学习】逐步回归(Step Regression and) 和 分段回归(Stagewise regression)

【统计学习】*逐步回归(Step Regression and) 和 分段回归(Stagewise regression)

Enter:所有X一次性全部进入
Forward:X一个一个进,每次进入P-value最小的X,直到未进入的X都不significant
Backward:所有的X先一次性进入,然后一个一个剔除,每次剔除P-value最大的X,直到保留的X全都significant
Stepwise:X一个一个进,但是进入新的X以后,会重新审查所有已进入X的P-value,如果进入新的X导致原来的X的P-value从significant变成不significant,则把原来的X剔除。

QR分解

在ols(最小二乘)中要计算$(X^TX)^{−1}$,可以通过矩阵分解简化计算,将X分解成QR乘积的形式,其中Q是一个$N∗(p+1)$的正交矩阵,也就是X的列空间的一组正交基,R是一个上三角矩阵,于是,$\hatβ=(X^TX)^{−1}X^Ty=R^{−1}Qy,\hat y=QQ^Ty$


子集选择

有两个原因导致我们对最小二乘法(ols)的估计不满意:
1.第一个原因是预测精度(accuracy),最小二乘法估计通常具有低偏差(bias)和高方差(var),我们想要通过使某些系数收缩或者设置为零,牺牲一些偏差来换取方差的减小,这样一来可以提升预测的精度。
2.第二个原因是解释(interpretation),当有大量的自变量的时候,我们希望确定一个表现出最强影响的较小子集。

以下是三种子集选择的方法

最优子集选择(best-subset selection)

最优子集选择,顾名思义,就是便利所有可能的预测子的集合然后在训练集上进行ols确定参数,最后选取在测试集上表现最好的集合作为最优子集。

前向/后向逐步选择(forward/backwards-stepwise selection)

当预测子的数量变大时,最优子集选择就变得不可行了。这时候考虑使用逐步选择的算法。类似分部操作回归

前向逐步选择算法首先选择截距(由1构成的N维列向量),然后每次向当前集合中添加能使得残差平方和RSS变得最小的预测子,也就是选择残差向量投影后长度最大的方向。

后向逐步选择算法从一个包含所有自变量出发,每次删除一个自变量,每次删除的是具有最小Z得分的自变量(参见上一篇博客 )。
因为计算Z得分的时候用到了$\hatσ^2/σ^2$服从自由度为$N−p−1$的卡方分布的这个性质,所以当N<=p的时候不能使用后向逐步选择,而前向逐步选择则没有这个限制。

还可以将前向后向逐步选择算法结合起来,在每一步的时候选择向当前集合添加或者删除一个自变量,比如说可以利用AIC准则来衡量这个选择。

前向分段回归(Forward-Stagewise Regression)

FS比前向逐步回归限制更多。首先将截距的系数设置为$\hat y$,然后将其他自变量的系数设置为零。在算法的每一步,挑选和当前残差最相关的自变量,然后算法计算当前残差关于这个自变量的简单最小二乘法的系数,随后将这个系数加到之前这个自变量的系数上,算法持续执行直到没有自变量与残差相关(相关系数很小)。与逐步选择不同的是,每次选择一个最相关的自变量并计算它的系数时,算法并不改变其他自变量的系数,而逐步回归每次增加一个自变量的时候都要重新进行一次ols更新所有自变量的系数,也正是因为这一特性,FS可能要经过比p多很多的迭代次数才能到达最终的拟合值,因此效率不是很高,但FS在高维数据中表现出色,可以降低方差。

# 前向分段回归
def stageWiseRegres(xArr, yArr, eps=0.01, numIter=100):
  xMat = mat(xArr); yMat = mat(yArr).T
  m, n = shape(xMat)  #获取矩阵形状
  # 数据标准化
  xMean = mean(xMat, 0)
  xStd = std(xMat, 0)
  xMat = (xMat-xMean)/xStd
  yMean = mean(yMat)
  yMat -= yMean
  beta = zeros((n, 1))
  mu = 0
  for i in range(numIter):
      cHat = -1
      sig = 0
      bestFeat = -1
      for j in range(n):  #遍历n个向量,寻找与RSS最相关的
          cTemp = xMat[:, j].T * (yMat - mu)  #第j列向量乘
          if abs(cTemp) > cHat:
              cHat = abs(cTemp)
              sig = sign(cTemp)
              bestFeat = j
      beta[bestFeat, 0] += sig*eps
      mu += float(eps*sig)*xMat[:, bestFeat]
  return beta

总结

Forward selection: 首先模型中只有一个单独解释因变量变异最大的自变量,之后尝试将加入另一自变量,看加入后整个模型所能解释的因变量变异是否显著增加(这里需要进行检疫,可以用 F-test, t-test 等等);这一过程反复迭代,直到没有自变量再符合加入模型的条件。
Backward elimination: 与 Forward selection 相反,此时,所有变量均放入模型,之后尝试将其中一个自变量从模型中剔除,看整个模型解释因变量的变异是否有显著变化,之后将使解释量减少最少的变量剔除;此过程不断迭代,直到没有自变量符合剔除的条件。
Bidirectional elimination: 这种方法相当于将前两种结合起来。可以想象,如果采用第一种方法,每加入一个自变量,可能会使已存在于模型中的变量单独对因变量的解释度减小,当其的作用很小(不显著)时,则可将其从模型中剔除。而第三种方法就做了这么一件事,不是一味的增加变量,而是增加一个后,对整个模型中的所有变量进行检验,剔除作用不显著的变量。最终尽可能得到一个最优的变量组合。

-------------End of this passage-------------