Python "statsmodels" ist im Allgemeinen stabil und wird auch durch die lineare Regressionsberechnung OLS berücksichtigt. Aber wenn Sie genauer hinschauen? ?? ?? In manchen Fällen, Hier werde ich zwei Methoden für die logistische Regression auflisten und die zu beachtenden Punkte notieren.
Das Ziel ist ** statsmodels (0.6.1) **, die neueste neueste stabile Version.
Wenn Sie auf Google suchen, zeigen Ihnen die Fragen und Antworten zu stackoverflow.com, wie Sie das Logit-Modell verwenden. Sogar im Statsmodels-Dokument ist es korrekt in "Regression mit diskreter abhängiger Variable" geschrieben, daher habe ich die Bewegung gemäß dem Dokument bestätigt.
Ein Beispiel ist die Datenanalyse von Spector und Mazzeo, die von W. Greene stammt. "Econometric Analysis" Prentice Hall, 5. Auflage. 2003, ein Lehrbuch über messtechnische Ökonomie. Erklärende Variable: Problem der Vorhersage der Nachnote aus der erklärten Variablen: psi, tuce, gpa. Wenn Sie die aus dem Internet erhaltenen Informationen auf leicht verständliche Weise ersetzen (nach eigenem Ermessen), werden die Ergebnisse für das zweite Semester aus der Benachrichtigungstabelle für das erste Semester (gpa), den Ergebnissen der nationalen Sommer-Scheinprüfung (tuce) und dem Teilnahmestatus der Sommerkurse (psi) erhöht. Das Problem besteht darin, die Nachnote zu schätzen. Laut dem Statsmodels-Dokument habe ich Folgendes getan.
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()
Wie oben erwähnt, konnte ich mit sm.Logit () problemlos rechnen. Die Zusammenfassung () lautet wie folgt.
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
==============================================================================
Die logistische Regression ist eine Art generalisiertes Regressionsmodell (GLM), das Logit () für die Verknüpfungsfunktion verwendet, sodass es auch wie folgt geschrieben werden kann.
# 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()
Geben Sie an, dass die mit der Familienoption in sm.GLM () verwendete Verteilung Binomial ist. Jetzt ist die Verknüpfungsfunktion ein Prozess, der logit () verwendet (standardmäßig in Binomial). Die Ausgabezusammenfassung () lautet wie folgt.
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
==============================================================================
Das Ausgabeformat unterscheidet sich vom Fall mit Logit (). Anfangs waren Logit () und GLM () der Ansicht, dass die Verarbeitung im Inneren dieselbe war, nur die Wrapper waren unterschiedlich (weil sie Aliasing waren). Wenn Sie sich jedoch die Methode der Ausgabe genau ansehen,
Es ist anders wie. Ist das etwas anderes? Ich war besorgt, als ich mich auf den Artikel auf Wikipedia bezog. ――IRLS ist auch eine der Methoden zur Berechnung der Wahrscheinlichkeit.
Ich habe beschlossen, die Residuen zu berechnen, um den Status der Regressionsanalyse zu verstehen. Wenn Sie der OLS-Methode folgen,
>>> resid1 = logit_res.resid
AttributeError: 'LogitResults' object has no attribute 'resid'
>>> resid2 = glm_reslt.resid
AttributeError: 'GLMResults' object has no attribute 'resid'
Beide geben einen AttributeError zurück. Da sich das Konzept des "Residuums" vom linearen Modell unterscheidet, wurde ihm möglicherweise nicht derselbe Attributname zugewiesen. Als ich das Dokument verzweifelt anhand des Klassennamens des Objekts untersuchte, kam ich zu der folgenden richtigen Antwort.
>>> 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])
Es scheint ziemlich seltsam, dass der Name des Attributs je nach Klasse unterschiedlich ist, obwohl sie den gleichen Inhalt haben. (Der Programmierer, den Sie schreiben, kann unterschiedlich sein.)
Die numerischen Ausgabewerte sind jedoch genau gleich, was die Tatsache unterstützt, dass die Verarbeitung der Regressionsberechnung dieselbe war.
** Statsmodels (0.6.1) ** ist möglicherweise noch eine Beta-Version, aber ich möchte, dass sie in der zukünftigen Version etwas besser organisiert wird, um das Verständnis zu erleichtern.
Recommended Posts