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.

1voto

Varun-08 Points 11
"""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()

En utilisant la méthode du résumé, vous pouvez vérifier dans votre noyau les valeurs p de votre variables écrites sous la forme 'P>|t|'. Ensuite, recherchez la variable avec la valeur p la plus élevée. Supposons que x3 ait la valeur la plus élevée, par exemple 0,956. Supprimez alors cette colonne de votre tableau et répétez toutes les étapes.

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

Répétez ces méthodes jusqu'à ce que vous supprimiez toutes les colonnes dont la valeur p est supérieure à la valeur de signification (par exemple 0,05). Au final, votre variable X_opt contiendra toutes les variables optimales dont la valeur p est inférieure au seuil de signification.

0voto

Jacob Helwig Points 31

Voici une méthode que je viens d'écrire qui utilise la "sélection mixte" telle que décrite dans Introduction à l'apprentissage statistique. En entrée, elle prend :

  • lm, un statsmodels.OLS.fit(Y,X), où X est un tableau de n uns, où n est la valeur de l n est le nombre de points de données, et Y, où Y est la réponse dans les données d'apprentissage.

  • curr_preds- une liste avec ['const'].

  • potential_preds- une liste de tous les prédicteurs potentiels. Il faut aussi un cadre de données pandas X_mix qui contient toutes les données, y compris 'const', et toutes les données correspondant aux prédicteurs potentiels.

  • tol, facultatif. La valeur p maximale, 0,05 si elle n'est pas spécifiée.

    def mixed_selection (lm, curr_preds, potential_preds, tol = .05): while (len(potential_preds) > 0): index_best = -1 # this will record the index of the best predictor curr = -1 # this will record current index best_r_squared = lm.rsquared_adj # record the r squared of the current model

    loop to determine if any of the predictors can better the r-squared

    for pred in potential_preds:
      curr += 1 # increment current
      preds = curr_preds.copy() # grab the current predictors
      preds.append(pred)
      lm_new = sm.OLS(y, X_mix[preds]).fit() # create a model with the current predictors plus an addional potential predictor
      new_r_sq = lm_new.rsquared_adj # record r squared for new model
      if new_r_sq > best_r_squared:
        best_r_squared = new_r_sq
        index_best = curr
    
    if index_best != -1: # a potential predictor improved the r-squared; remove it from potential_preds and add it to current_preds
      curr_preds.append(potential_preds.pop(index_best))
    else: # none of the remaining potential predictors improved the adjust r-squared; exit loop
      break
    
    # fit a new lm using the new predictors, look at the p-values
    pvals = sm.OLS(y, X_mix[curr_preds]).fit().pvalues
    pval_too_big = []
    # make a list of all the p-values that are greater than the tolerance 
    for feat in pvals.index:
      if(pvals[feat] > tol and feat != 'const'): # if the pvalue is too large, add it to the list of big pvalues
        pval_too_big.append(feat)
    
    # now remove all the features from curr_preds that have a p-value that is too large
    for feat in pval_too_big:
      pop_index = curr_preds.index(feat)
      curr_preds.pop(pop_index)

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