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

多元线性回归笔记——逐步回归多元线性回归中有关逐步回归部分的详细笔记 包含基本原理和 python 例子的代码讲解 逐步回归

大家好,欢迎来到IT知识分享网。

目录

基本原理:

逐步回归法的整体思路:

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&代码示例:

beeec54abc3747a88ba7d305864af890.jpeg

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

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_press2) 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()

45c317a991d7441a9ff657ba160e1cc0.pngf0a8b9bdc86546f68aa43b15a2fe9d12.png

 考察回归参数的显著性检验,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_press2),3) print('\n模型Y~X1+X2的PRESS:',press)

 d7974458d0ae4899adc8e6efe8158f74.png

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

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

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

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/113238.html

(0)
上一篇 2025-12-15 22:45
下一篇 2025-12-16 07:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信