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.
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
==============================================================================
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.
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.
Recommended Posts