逐步回归(step regression)和分段回归(stagewise regression)

QR分解

在ols中要计算 XTX)1 ,可以通过矩阵分解简化计算,将X分解成QR乘积的形式,其中Q是一个 N(p+1) 的正交矩阵,也就是X的列空间的一组正交基,R是一个上三角矩阵,于是, β^=XTX)1XTy=R1Qyy^=QQTy

子集选择

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

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

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

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

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

当预测子的数量变大时,最优子集选择就变得不可行了。这时候考虑使用逐步选择的算法。
前向逐步选择算法首先选择截距(由1构成的N维列向量),然后每次向当前集合中添加能使得残差平方和RSS变得最小的预测子,也就是选择残差向量投影后长度最大的方向。
后向逐步选择算法从一个包含所有自变量出发,每次删除一个自变量,每次删除的是具有最小Z得分的自变量(参见上一篇博客 )。
因为计算Z得分的时候用到了 σ^2σ2 服从自由度为 Np1 的卡方分布的这个性质,所以当N<=p的时候不能使用后向逐步选择,而前向逐步选择则没有这个限制。
还可以将前向后向逐步选择算法结合起来,在每一步的时候选择向当前集合添加或者删除一个自变量,比如说可以利用AIC准则来衡量这个选择。

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

FS比前向逐步回归限制更多。首先将截距的系数设置为 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):
            cTemp = xMat[:, j].T * (yMat - mu)
            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

你可能感兴趣的:(机器学习,机器学习,统计学习方法,线性回归模型,逐步回归,分段回归)