多元线性回归笔记——逐步回归

目录

基本原理:

逐步回归法的整体思路:

Example&代码示例:


基本原理:

       当我们选取的回归模型之中有多个变量时,一般从中选取若干个变量构建回归模型,那么如何选择合适的变量使得模型是最优?

原则:选取对因变量影响最大的自变量进入模型

PS:自变量选择过多时会导致调整后的eq?R%5E%7B2%7D下降,不是我们所希望的结果。

选择变量的标准eq?R%5E%7B2%7D,AIC统计量(理论上,调整后的eq?R%5E%7B2%7D越大越好,AIC值越小越好)

变量选择的方法有很多种,其中使用最广泛的是逐步回归法。

逐步回归法的整体思路:

       通过逐步将自变量输入模型,如果模型具统计学意义,并将其纳入在回归模型中。同时移出不具有统计学意义的变量。最终得到一个自动拟合的回归模型。

forward_selected方法:在每一步迭代过程中,分别将进行到当前步骤时剩余的自变量一个个加入模型,计算输出相关的统计学变量(例如使用调整后R方作为标准选择最佳模型, 也可以使用AIC,BIC,PRESS等统计量),得到使得该模型最优的自变量加入模型,这样完成一步迭代。

Example&代码示例:

多元线性回归笔记——逐步回归_第1张图片

导入需要使用的资源包,并导入数据:

import statsmodels.formula.api as smf
import pandas as pd
import numpy as np
###导入数据
X1=np.array([7,  1, 11, 11,  7, 11,  3,  1,  2, 21,  1, 11, 10])
X2=np.array([26, 29, 56, 31, 52, 55, 71, 31, 54, 47, 40, 66, 68])
X3=np.array([6, 15,  8,  8,  6,  9, 17, 22, 18,  4, 23,  9,  8])
X4=np.array([60, 52, 20, 47, 33, 22,  6, 44, 22, 26, 34, 12, 12])
Y =np.array([78.5, 74.3, 104.3,  87.6,  95.9, 109.2, 102.7, 72.5,
            93.1,115.9,  83.8, 113.3, 109.4])
data = pd.DataFrame(np.array([X1, X2, X3, X4, Y]).T, columns = ['X1','X2', 'X3', 'X4', 'Y'])

下一步就是实现forward_selected方法:

def forward_selected(data, response):
    #remaining = set(data.columns)
    ###自变量名称,从DataFrame取出
    remaining=list(data.columns)
    ###从数据里去掉响应变量,作为自变量列表
    remaining.remove(response)
    selected = []
    current_score, best_new_score = 0.0, 0.0
    print('-----------初始变量列表:',remaining)
    i=1
    while remaining and current_score == best_new_score:
        scores_with_candidates = []  # 候选的打分列表
        ###从剩余变量中弹出一个变量迭代加入模型
        for candidate in remaining:
            formula = "{} ~ 1 + {}".format(response, ' + '.join(selected + [candidate]))
            result = smf.ols(formula, data).fit()  # 注意与smf.OLS的区别,该处是通过公式构建模型
            score = result.rsquared_adj
            aic = result.aic
            #press准则:Prediction Error of Square Sum
            #预测误差平方和
            press=np.sum(result.get_influence().resid_press**2)
            scores_with_candidates.append((score, candidate))
            print('\n模型:',formula,'\n调整后R方:',np.round(score,3),
                  ', AIC:',np.round(aic,3),'PRESS:',np.round(press,3))
        ###对模型按照score排序,list对象的sort函数是从小到大排序
        scores_with_candidates.sort()
        ###弹出一个变量及其评分,注意list的pop函数是弹出最后一个元素,即最大评分的自变量组合
        best_new_score, best_candidate = scores_with_candidates.pop()
        
        ###通过rsquared_adj比较模型自变量增减前后的模型效果。
        ###如果rsquared_adj增加,则从selected中移除候选模型,增加新的最佳模型。
        if current_score < best_new_score:
            remaining.remove(best_candidate)
            selected.append(best_candidate)
            current_score = best_new_score
        print('-----------remaining',i,'-',remaining)
        print('+++++++++++selected',i,'-',selected)
        i=i+1
    formula = "{} ~ 1+ {}".format(response,' + '.join(selected))
    model = smf.ols(formula, data).fit()
    return model,scores_with_candidates

 调用这个方法得出逐步回归的过程和结果:

model, swc = forward_selected(data, 'Y')
model.summary()

多元线性回归笔记——逐步回归_第2张图片多元线性回归笔记——逐步回归_第3张图片

 考察回归参数的显著性检验,X4的回归系数P值(0.205)远大于0.05,说明该系数不显著。同样,X2的显著性也十分可疑。

下面我们尝试去掉显著性最差的X4,尝试Y = 1 + X1 + X2 进行验证:

formula='Y~X1+X2'
result=smf.ols(formula,data=data).fit()
print(result.summary())
# PRESS(预测误差平方和)统计量  Leave One Observation Out具体在后续文章中说明
press = np.round(np.sum(result.get_influence().resid_press**2),3)
print('\n模型Y~X1+X2的PRESS:',press)

 多元线性回归笔记——逐步回归_第4张图片

 结果显示,回归参数的显著性都十分明显。调整后的eq?R%5E%7B2%7D值略有下降但可以接受。AIC值略有上升,上升不明显也可以接受。同理,PRESS的变化也可以接受。

注意:回归模型参数的t检验值非常重要,其显著性直接显示了模型的好坏。

结论:Y ~ X1+ X2 是最佳模型。

该笔记为个人的学习笔记,难免存在疏漏和错误。如有错误,请帮忙指出,谢谢!

你可能感兴趣的:(线性回归,算法,回归,笔记)