[PYTHON] Vorsichtsmaßnahmen bei der Durchführung einer logistischen Regression mit Statsmodels

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.


Verwendung des Logit-Modells

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

Verwendung von GLM (Generalized Linear Models)

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.

Vergleich der beiden Methoden - Restberechnung

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.

Referenzen (Website)

Recommended Posts

Vorsichtsmaßnahmen bei der Durchführung einer logistischen Regression mit Statsmodels
Punkte, die beim Aktualisieren auf WSL2 zu beachten sind
Zu beachtende Punkte beim Wechsel von NAOqi OS 2.4.3 zu 2.5.5
Lineare Regression mit Statistikmodellen
Fügen Sie einen konstanten Term (y-Abschnitt) hinzu, wenn Sie mit Pythons Statsmodels mehrere Regressionsanalysen durchführen
Implementierung der logistischen Regression mit NumPy
[Python] Hinweise beim Versuch, Numpy mit Cython zu verwenden
Zu beachtende Punkte beim Löschen mehrerer Elemente aus der Liste
(Hinweis) Punkte, auf die Sie bei der Installation von Scilab unter ArchLinux achten sollten
Zu beachtende Punkte, wenn Pandas CSV der Excel-Ausgabe lesen
Wenden Sie die Einflussfunktion auf die logistische Regression an
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Logistische Regressionsanalyse Selbst erstellt mit Python
Hinweise beim Erstellen einer Umgebung mit Python
Versuch, SQLite3 mit Python zu handhaben [Hinweis]
Logistische Rückgabe
Logistische Rückgabe
Beachten Sie, dass der Standardwert des LogisticRegression-Solvers in lbfgs geändert wurde.
Ein Hinweis, dem ich beim Ausführen von Python mit Visual Studio Code verfallen war
Umgang mit Fehlern beim Auftreffen auf pip pip
Hinweis zum Zeichnen der IP-Adresse mit Kibana + Elastic Search
Python Hinweis: Wenn Sie einer Zeichenfolge einen Wert zuweisen
Probieren Sie Theano mit Kaggles MNIST-Daten ~ Logistic Return ~ aus
So vermeiden Sie BrokenPipeError mit PyTorchs DataLoader Hinweis
So zeigen Sie Bilder kontinuierlich mit matplotlib Memo an
Implementieren Sie mit stan ein zeitdiskretes logistisches Regressionsmodell
Implementierung der logistischen Regression mit Partikelgruppenoptimierungsmethode
Materialien zum Lesen, wenn Sie mit Python beginnen
Python-Skript zum Abrufen von Notizinformationen mit REAPER