Stepwise, Forward, Backward和Bestsubsets四种线性回归变量选择方法的Python实现 您所在的位置:网站首页 多元回归方程的优缺点 Stepwise, Forward, Backward和Bestsubsets四种线性回归变量选择方法的Python实现

Stepwise, Forward, Backward和Bestsubsets四种线性回归变量选择方法的Python实现

2023-03-24 21:31| 来源: 网络整理| 查看: 265

本文章是根据《商务与经济统计》第十三版所介绍的方法来通过Python代码实现

需要加载以下库

import numpy as np import pandas as pd import statsmodels.api as sm import itertools import timeStepwise regression(逐步回归)方法介绍

逐步回归方法的每一步都是从确定已在模型里的自变量是否删除开始。

增加或删除的标准是显著性水平α,若自变量的p值大于α,则无法拒绝假设H0: β(增加或减少的自变量的判定系数) = 0,这个自变量就应该从已有或添加的自变量中删除。

首先对于已在模型内的自变量计算F统计值和对应的p值

如果有自变量的p值大于α,则有最大p值得自变量应该被删除

重复这个步骤直到没有自变量的p值大于α。

From 《商务与经济统计》第十三版 P416逐步回归方法的每一步,首先要考虑的是查看是否有哪个自变量能从当前的模型中被删除。如果没有一个变量能从模型中被删除,那么逐步回归方法要查看是否有哪个不在当前模型中的自变量能增加到模型里来。由于逐步回归方法的特性,一个自变量可能在回归过程的某一步进入模型,而在下一步这个自变量又可能从模型中被删除,但是在稍后的某一步它又可能重新进入模型。当没有自变量能从模型中被删除或者没有自变量能进入到模型里来时,逐步回归方法停止。代码实现def stepwise(x,y,alpha=0.05): #这里的x为所有的自变量,y为因变量,x和y都需为Series或者Dataframe格式 x_const = sm.add_constant(x) #statsmodels库在进行最小二乘法计算时需要自变量有一列常数(const)值1来提高运算的准确性 predictors = [x_const.columns[0]] #这里表示p值小于α的自变量索引,开始只有'const' predictors_remaining = x.columns #这里表示剩余的没有进入回归方程的自变量索引 count = 0 while count != len(predictors_remaining): #这里while是因为如果有自变量在进入后被删除,只用下面的for循环无法再次循环被删除的自变量 #当剩余自变量没有能进入模型的自变量后,下面count到一次while结束前就会跟predictors_remaining的长度相同,这个时候循环就会结束 count = 0 print('predictors selected:',predictors) for p in predictors_remaining: predictors.append(p) while True: regr = sm.OLS(y,x_const[predictors]).fit()#运用statsmodels的OLS块建立模型 pvalue = regr.pvalues.drop('const') sorted_pvalue = pvalue.sort_values(ascending=False)#将模型内的自变量的p值从高到低排序 if sorted_pvalue[0] > alpha: #大于α的从predictors中删除 predictors.remove(sorted_pvalue.index[0]) else: #小于或等于α的就在predictors里保留,从remaining里删除 predictors_remaining = x.columns.drop(predictors,errors='ignore') count += 1 break stepwise_regr = sm.OLS(y,x_const[predictors]).fit() return stepwise_regrForward selection(前向选择)方法介绍From 《商务与经济统计》第十三版 P416前向选择方法从模型中没有自变量开始。 这一方法使用与逐步回归为了确定一个变量是否应该进人模型同样的程序来增加变量,并且一次只能增加一个变量。然而,一旦一个自变量进入到模型中,前向选择方法就不允许再将这个变量从模型中删除。当不在模型中的每一个自变量的p-值全都大于α时,则前向选择过程结束。代码实现def forward(x,y,alpha=0.05): #同样,这里的x和y需为Series或Dataframe格式 x_const = sm.add_constant(x) predictors = [x_const.columns[0]] predictors_remaining = x_const.columns[1:] count=0 while count alpha: predictors.remove(p) count += 1 else: predictors_remaining = predictors_remaining.drop(p) count = 0 print(len(predictors)-1,"predictor(s) have entered") break forward_select_regr = sm.OLS(y,x_const[predictors]).fit() return forward_select_regrBackward selection(后向消元)方法介绍From 《商务与经济统计》第十三版 P416&P417后向消元方法从包含所有自变量的模型开始。这一方法使用与逐步回归为了确定一个变量是否应该从模型中被删除同样的程序来删除变量,并且一次只能删除一个变量。然而,一旦一个自变量从模型中被删除,后向消元方法就不允许这个自变量在下一步再重新进入模型。当模型中的自变量的p值没有大于α时,后向消元过程结束。前向选择方法从模型中没有自变量开始,并且每次只增加一个变量。而后向消元方法从包含所有自变量的模型开始,并且每次只删除一个变量。两种方法可能得到同样的估计的回归方程,但是两种方法也可能得到不同的估计的回归方程。代码实现def backward(x,y,alpha=0.05): #同样,这里的x和y需为Series或Dataframe格式 x_const = sm.add_constant(x) predictors = x_const.columns.to_list() predictors_deleted = [] while True: regr = sm.OLS(y,x_const[predictors]).fit() pvalue = regr.pvalues.drop('const') pvalue_max = pvalue.argmax() #返回最大p值的int索引 if pvalue[pvalue_max] > alpha: #这里加一是因为前面pvalue drop掉了const,这里predictors没有drop,加一保持int索引一致 deleted_predictor = predictors[pvalue_max+1] predictors.pop(pvalue_max+1) predictors_deleted.append(deleted_predictor) print(len(predictors_deleted),"have deleted") else: break backward_select_regr = sm.OLS(y,x_const[predictors]).fit() print(len(predictors)-1,"have reserved") return backward_select_regrBest subsets regression(最佳子集回归)方法介绍

将自变量所有的组合进行回归,根据组合中的自变脸个数,SSE(Sum of square for errors,误差项的平方和;又称RSS,Residual sum of square)的大小和R_squared(相关系数,correlation coefficient)的大小来选取最合适的估计的回归方程。

例如有3个自变量(A,B,C),那根据组合内自变量个数就有(A);(B);(C);(A, B);(A, C);(B, C);(A, B, C) 一共七个组合。对于组合内自变量个数为2的组合有(A, B);(A, C);(B, C),对这些组合建立回归方程,选取其中SSE最小的为best subset。对不同组合内自变量个数的组合重复这个过程,得到一组best subsets。再根据R_squared(相关系数)来选取合适的估计的回归方程。[1]

From 《商务与经济统计》第十三版 P418在所有其他条件相同的情形下,一个包含较少自变量的比较简单的模型通常会受到人们的喜爱。代码实现def bestSubsets(x,y): x_const = sm.add_constant(x) model_best = pd.DataFrame(columns=['r_squared','SSE','model']) for i in range(1,len(x.columns)+1): tic = time.time() result = [] for combo in itertools.combinations(x_const.columns.drop('const'),i): #因为这里的x有const存在要先drop掉,然后在后面给每一个自变量名称组合加上 combo = tuple(['const'])+combo regr = sm.OLS(y,x_const[list(combo)]).fit() sse = sum(regr.resid ** 2) #sse: sum of squares for errors r2 = regr.rsquared sub_result = {"model":regr, "SSE":sse, "r_squared":r2} result.append(sub_result) models = pd.DataFrame(result) #将组合内自变量为i的组合的回归方程,SSE和R_squared放进Dataframe里面 best_model = models.loc[models["SSE"].argmin()] #当sse最小时,残差平方的和最小,也就表示预测值越贴近估计的回归方程,以此为标准选取最佳子集 model_best.loc[i] = best_model toc = time.time() print("Processed", models.shape[0], "models on", i, "predictors in", (toc-tic), "seconds.") return model_best

参考^最佳子集回归选取标准源自 http://www.science.smith.edu/~jcrouser/SDS293/labs/lab8-py.html


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有