32 votes

Régression pas à pas en Python

Comment réaliser régression par étapes en python ? Il existe des méthodes pour les MCO dans SCIPY mais je ne suis pas en mesure de faire une analyse par étapes. Toute aide à cet égard serait la bienvenue. Merci.

Edit : J'essaie de construire un modèle de régression linéaire. J'ai 5 variables indépendantes et en utilisant la régression pas à pas, je cherche à sélectionner les variables de telle sorte que mon modèle ait la p-value la plus faible. Le lien suivant explique l'objectif :

https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CEAQFjAD&url=http%3A%2F%2Fbusiness.fullerton.edu%2Fisds%2Fjlawrence%2FStat-On-Line%2FExcel%2520Notes%2FExcel%2520Notes%2520-%2520STEPWISE%2520REGRESSION.doc&ei=YjKsUZzXHoPwrQfGs4GQCg&usg=AFQjCNGDaQ7qRhyBaQCmLeO4OD2RVkUhzw&bvm=bv.47244034,d.bmk

Merci encore.

12voto

Aaron Schumacher Points 317

Trevor Smith et moi avons écrit une petite fonction de sélection avant pour la régression linéaire avec statsmodels : http://planspace.org/20150423-forward_selection_with_statsmodels/ Vous pourriez facilement le modifier pour minimiser une valeur p, ou sélectionner sur la base de valeurs p bêta avec juste un peu plus de travail.

12voto

Regi Mathew Points 550

Vous pouvez essayer mlxtend qui dispose de plusieurs méthodes de sélection.

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)

3voto

David Dale Points 3681

Vous pouvez effectuer une sélection avant-arrière sur la base de statsmodels.api.OLS modèle, comme indiqué dans cette réponse .

Cependant, cette réponse décrit pourquoi vous ne devriez pas utiliser la sélection par étapes pour les modèles économétriques en premier lieu.

2voto

HE Xin Points 31

J'ai développé ce référentiel https://github.com/xinhe97/StepwiseSelectionOLS

Mes classes de sélection pas à pas (best subset, forward stepwise, backward stepwise) sont compatibles avec sklearn. Vous pouvez faire Pipeline et GridSearchCV avec mes classes.

La partie essentielle de mon code est la suivante :

################### 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

1voto

Matti Pastell Points 4244

Statsmodels dispose de méthodes supplémentaires pour la régression : http://statsmodels.sourceforge.net/devel/examples/generated/example_ols.html . Je pense que cela vous aidera à mettre en œuvre la régression par paliers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X