Python中的逐步回归

Python中的逐步回归,python,scipy,regression,Python,Scipy,Regression,如何在python中执行逐步回归?SCIPY中有OLS的方法,但我无法逐步执行。这方面的任何帮助都将是巨大的帮助。谢谢 编辑:我正在尝试建立一个线性回归模型。我有5个自变量,并使用正向逐步回归,我的目标是选择变量,使我的模型具有最低的p值。以下链接解释了目标: 再次感谢 Statsmodels有其他回归方法:。我认为它将帮助您实现逐步回归。Trevor Smith和我为statsmodels的线性回归编写了一个小的正向选择函数:您可以轻松地修改它以最小化p值,或者只需稍微多做一点工作就可以基于

如何在python中执行逐步回归?SCIPY中有OLS的方法,但我无法逐步执行。这方面的任何帮助都将是巨大的帮助。谢谢

编辑:我正在尝试建立一个线性回归模型。我有5个自变量,并使用正向逐步回归,我的目标是选择变量,使我的模型具有最低的p值。以下链接解释了目标:


再次感谢

Statsmodels有其他回归方法:。我认为它将帮助您实现逐步回归。

Trevor Smith和我为statsmodels的线性回归编写了一个小的正向选择函数:您可以轻松地修改它以最小化p值,或者只需稍微多做一点工作就可以基于beta p值进行选择

"""Importing the api class from statsmodels"""
import statsmodels.formula.api as sm

"""X_opt variable has all the columns of independent variables of matrix X 
in this case we have 5 independent variables"""
X_opt = X[:,[0,1,2,3,4]]

"""Running the OLS method on X_opt and storing results in regressor_OLS"""
regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
regressor_OLS.summary()
使用summary方法,您可以在内核中检查 写为“P>| t |”的变量。然后检查p值最高的变量 价值假设x3的值最高,例如0.956。然后删除此列 从阵列中选择并重复所有步骤

X_opt = X[:,[0,1,3,4]]
regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
regressor_OLS.summary()

重复这些方法,直到删除p值高于显著性值(例如0.05)的所有列。最后,变量X_opt将包含p值小于显著性水平的所有最优变量。

您可以基于
statsmodels.api.OLS
model进行正向反向选择,如图所示


然而,描述了为什么不应该首先对计量经济模型使用逐步选择。

您可以尝试mlxtend,它有多种选择方法

from mlxtend.feature_selection import SequentialFeatureSelector as sfs

clf = LinearRegression()

# Build step forward feature selection
sfs1 = sfs(clf,k_features = 10,forward=True,floating=False, scoring='r2',cv=5)

# Perform SFFS
sfs1 = sfs1.fit(X_train, y_train)

我刚刚写了一个方法,它使用了《统计学习导论》中描述的“混合选择”。作为输入,它需要:

  • lm,a statsmodels.OLS.fit(Y,X),其中X是n个1的数组,其中n是 数据点的数量,Y,其中Y是训练数据中的响应

  • curr_preds-带有['const']的列表

  • 潜在预测因子-所有潜在预测因子的列表。 还需要有一个包含所有数据(包括“const”)的pandas数据帧X_mix,以及与潜在预测值对应的所有数据

  • 托尔,可选。如果未指定,则最大值为.05


我开发了这个存储库

我的逐步选择类(最佳子集、向前逐步、向后逐步)与sklearn兼容。您可以使用我的类执行管道和GridSearchCV

我的代码的基本部分如下:

################### Criteria ###################
def processSubset(self, X,y,feature_index):
    # Fit model on feature_set and calculate rsq_adj
    regr = sm.OLS(y,X[:,feature_index]).fit()
    rsq_adj = regr.rsquared_adj
    bic = self.myBic(X.shape[0], regr.mse_resid, len(feature_index))
    rsq = regr.rsquared
    return {"model":regr, "rsq_adj":rsq_adj, "bic":bic, "rsq":rsq, "predictors_index":feature_index}

################### Forward Stepwise ###################
def forward(self,predictors_index,X,y):
    # Pull out predictors we still need to process
    remaining_predictors_index = [p for p in range(X.shape[1])
                            if p not in predictors_index]

    results = []
    for p in remaining_predictors_index:
        new_predictors_index = predictors_index+[p]
        new_predictors_index.sort()
        results.append(self.processSubset(X,y,new_predictors_index))
        # Wrap everything up in a nice dataframe
    models = pd.DataFrame(results)
    # Choose the model with the highest rsq_adj
    # best_model = models.loc[models['bic'].idxmin()]
    best_model = models.loc[models['rsq'].idxmax()]
    # Return the best model, along with model's other  information
    return best_model

def forwardK(self,X_est,y_est, fK):
    models_fwd = pd.DataFrame(columns=["model", "rsq_adj", "bic", "rsq", "predictors_index"])
    predictors_index = []

    M = min(fK,X_est.shape[1])

    for i in range(1,M+1):
        print(i)
        models_fwd.loc[i] = self.forward(predictors_index,X_est,y_est)
        predictors_index = models_fwd.loc[i,'predictors_index']

    print(models_fwd)
    # best_model_fwd = models_fwd.loc[models_fwd['bic'].idxmin(),'model']
    best_model_fwd = models_fwd.loc[models_fwd['rsq'].idxmax(),'model']
    # best_predictors = models_fwd.loc[models_fwd['bic'].idxmin(),'predictors_index']
    best_predictors = models_fwd.loc[models_fwd['rsq'].idxmax(),'predictors_index']
    return best_model_fwd, best_predictors

也许
toad.selection.in
toad
程序包中的
toad.selection.step
可以解决您的问题

以下是github链接:

github web中的示例如下:

toad.selection.stepwise(data_woe,target = 'target', estimator='ols', direction = 'both', criterion = 'aic', exclude = to_drop)

希望这能奏效

scikits.learn
有LARS/lasso,如果有任何用处的话:你能详细说明一下选择预测变量要使用什么样的标准吗?如果你想要一个例子,你能发布或链接到一些样本数据吗?不建议基于p值建立模型。它们更像是一种健全的检查,其他标准(如AIC或BIC)更合适。链接似乎已断开:
很抱歉,找不到您请求的页面。您可以返回Mihaylo主页或向网站管理员报告错误。
我只想指出,数据分区应该能够解决David链接的文章中提出的过度拟合/数据挖掘问题。发布的答案之一是关于数据分区的:话虽如此,本文(Wiley的data Mining for Business Analytics)讨论了数据分区的方法。换句话说,分步应该是可以的,只要你不在生产中使用培训模型的结果,你需要对验证数据进行k-fold测试,以得到一个可行的列表。404未找到页面:(虽然我感谢你的贡献,但我忍不住要指出,模型选择仅在r2上(这里是这么做的?)不是一个好主意。事实上,我以前没有尝试过,只是提供了一些可能的资源。
toad.selection.stepwise(data_woe,target = 'target', estimator='ols', direction = 'both', criterion = 'aic', exclude = to_drop)