[PYTHON] Précautions lors de l'exécution de la régression logistique avec Statsmodels

Python "statsmodels" est généralement stable et est également pris en charge par le calcul de régression linéaire OLS, mais si vous regardez de plus près? ?? ?? Dans certains cas, Ici, je vais énumérer deux méthodes de régression logistique et noter les points à noter.

La cible est ** statsmodels (0.6.1) **, qui est la dernière version stable.


Comment utiliser le modèle Logit

Si vous effectuez une recherche sur Google, les questions et réponses de stackoverflow.com vous montreront comment utiliser le modèle Logit. Même dans le document Statsmodels, il est correctement écrit dans "Régression avec variable dépendante discrète", j'ai donc confirmé le mouvement selon le document.

Un exemple est résolu par l'analyse des données de Spector et Mazzeo, provenant de W. Greene. "Econometric Analysis" Prentice Hall, 5e édition. 2003, un manuel d'économie métrologique. Variable explicative: Problème de prédiction du post-grade à partir de la variable expliquée: psi, tuce, gpa. Si vous remplacez les informations obtenues sur Internet de manière facile à comprendre (à votre propre discrétion), les résultats du deuxième semestre augmenteront à partir du tableau de notification du premier semestre (gpa), des résultats de l'examen national d'été (tuce) et du statut de participation aux cours d'été (psi). Le problème est d'estimer la note du poste. D'après le document Statsmodels, j'ai fait ce qui suit.

import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

# Load the data from Spector and Mazzeo (1980)
spector_data = sm.datasets.spector.load()
spector_data.exog = sm.add_constant(spector_data.exog)

# Follow statsmodles ipython notebook
logit_mod = sm.Logit(spector_data.endog, spector_data.exog)
logit_res = logit_mod.fit(disp=0)
print('Parameters: ', logit_res.params)
print logit_res.summary()

Comme mentionné ci-dessus, j'ai pu calculer sans problème en utilisant sm.Logit (). Le résumé () est le suivant.

                           Logit Regression Results                           
==============================================================================
Dep. Variable:                      y   No. Observations:                   32
Model:                          Logit   Df Residuals:                       28
Method:                           MLE   Df Model:                            3
Date:                Tue, 01 Sep 2015   Pseudo R-squ.:                  0.3740
Time:                        22:20:41   Log-Likelihood:                -12.890
converged:                       True   LL-Null:                       -20.592
                                        LLR p-value:                  0.001502
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const        -13.0213      4.931     -2.641      0.008       -22.687    -3.356
x1             2.8261      1.263      2.238      0.025         0.351     5.301
x2             0.0952      0.142      0.672      0.501        -0.182     0.373
x3             2.3787      1.065      2.234      0.025         0.292     4.465
==============================================================================

Comment utiliser GLM (modèles linéaires généralisés)

La régression logistique est un type de modèle de régression généralisé (GLM) qui utilise Logit () pour la fonction de lien, donc il peut également être écrit comme suit.

# logit_mod = sm.Logit(spector_data.endog, spector_data.exog)
glm_model = sm.GLM(spector_data.endog, spector_data.exog, family=sm.families.Binomial())
# logit_res = logit_mod.fit(disp=0)
glm_reslt = glm_model.fit()

# print logit_res.summary()
print glm_reslt.summary()

Indiquez que la distribution utilisée avec l'option de famille dans sm.GLM () est Binomiale. La fonction de lien utilise maintenant logit () (par défaut de Binomial). Le résumé de sortie () est le suivant.

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                      y   No. Observations:                   32
Model:                            GLM   Df Residuals:                       28
Model Family:                Binomial   Df Model:                            3
Link Function:                  logit   Scale:                             1.0
Method:                          IRLS   Log-Likelihood:                -12.890
Date:                Tue, 01 Sep 2015   Deviance:                       25.779
Time:                        22:21:20   Pearson chi2:                     27.3
No. Iterations:                     7                                         
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const        -13.0213      4.931     -2.641      0.008       -22.687    -3.356
x1             2.8261      1.263      2.238      0.025         0.351     5.301
x2             0.0952      0.142      0.672      0.501        -0.182     0.373
x3             2.3787      1.065      2.234      0.025         0.292     4.465
==============================================================================

Le format de sortie est différent par rapport au cas utilisant Logit (). Au départ, Logit () et GLM () pensaient que le traitement à l'intérieur était le même, seuls les wrappers étaient différents (car ils étaient aliasing). Cependant, si vous regardez de près la méthode de sortie,

C'est différent comme. Est-ce autre chose? J'étais inquiet en me référant à l'article sur wikipedia, ――IRLS est également l'une des méthodes de calcul de la vraisemblance.

Comparaison des deux méthodes - calcul résiduel

J'ai décidé de calculer les résidus afin de comprendre le statut de l'analyse de régression. Si vous suivez la méthode OLS,

>>> resid1 = logit_res.resid
AttributeError: 'LogitResults' object has no attribute 'resid'

>>> resid2 = glm_reslt.resid
AttributeError: 'GLMResults' object has no attribute 'resid'

Les deux renvoient une AttributeError. Étant donné que le concept de «résidu» est différent du modèle linéaire, il se peut qu'il n'ait pas reçu le même nom d'attribut. Lorsque j'ai désespérément examiné le document à partir du nom de classe de l'objet, je suis arrivé à la bonne réponse suivante.

>>> resid1 = logit_res.resid_dev   # for Logit model
>>> resid1
array([-0.23211021, -0.35027122, -0.64396264, -0.22909819,  1.06047795,
       -0.26638437, -0.23178275, -0.32537884, -0.48538752,  0.85555565,
       -0.22259715, -0.64918082, -0.88199929,  1.81326864, -0.94639849,
       -0.24758297, -0.3320177 , -0.28054444, -1.33513084,  0.91030269,
       -0.35592175,  0.44718924, -0.74400503, -1.95507406,  0.59395382,
        1.20963752,  0.95233204, -0.85678568,  0.58707192,  0.33529199,
       -1.22731092,  2.09663887])
>>> resid2 = glm_reslt.resid_deviance   # for GLM model
>>> resid2
array([-0.23211021, -0.35027122, -0.64396264, -0.22909819,  1.06047795,
       -0.26638437, -0.23178275, -0.32537884, -0.48538752,  0.85555565,
       -0.22259715, -0.64918082, -0.88199929,  1.81326864, -0.94639849,
       -0.24758297, -0.3320177 , -0.28054444, -1.33513084,  0.91030269,
       -0.35592175,  0.44718924, -0.74400503, -1.95507406,  0.59395382,
        1.20963752,  0.95233204, -0.85678568,  0.58707192,  0.33529199,
       -1.22731092,  2.09663887])

Il semble assez étrange que le nom de l'attribut soit différent selon la classe même s'ils ont le même contenu. (Le programmeur que vous écrivez peut être différent.)

Cependant, les valeurs numériques de sortie sont exactement les mêmes, ce qui est considéré comme corroborant le fait que le traitement du calcul de régression était le même.

** Statsmodels (0.6.1) ** est peut-être encore une version bêta, mais j'aimerais qu'elle soit un peu plus organisée dans la future version pour faciliter la compréhension.

Références (site Web)

Recommended Posts

Précautions lors de l'exécution de la régression logistique avec Statsmodels
Points à noter lors de la mise à jour vers WSL2
Points à noter lors du passage de NAOqi OS 2.4.3 à 2.5.5
Régression linéaire avec statsmodels
Ajouter un terme constant (section y) lors de l'exécution d'une analyse de régression multiple avec les Statsmodels de Python
Implémentation de la régression logistique avec NumPy
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython
Points à noter lors de la suppression de plusieurs éléments de la liste
(Note) Points auxquels il faut être accro lors de l'installation de Scilab sur ArchLinux
Points à noter lorsque les pandas lisent le csv de la sortie Excel
Appliquer la fonction d'influence à la régression logistique
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
Analyse de régression logistique Self-made avec python
Remarques lors de la création d'un environnement avec python
Essayer de gérer SQLite3 avec Python [Note]
Retour logistique
Retour logistique
Notez que la valeur par défaut du solveur LogisticRegression est devenue lbfgs.
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
Comment gérer les erreurs en frappant pip ②
Remarque pour tracer l'adresse IP avec Kibana + Elastic Search
Remarque Python: lors de l'attribution d'une valeur à une chaîne
Essayez Theano avec les données MNIST de Kaggle ~ Retour logistique ~
Comment éviter BrokenPipeError avec la note DataLoader de PyTorch
Comment afficher des images en continu avec matplotlib Memo
Implémenter un modèle de régression logistique en temps discret avec stan
Implémentation de la régression logistique avec la méthode d'optimisation des groupes de particules
Matériel à lire lors de la mise en route de Python
Script Python pour obtenir des informations de note avec REAPER