Letztes Mal habe ich zusammengefasst, was ich aus der Theorie über logistische Regression gelernt habe.
Ich habe versucht, mein Verständnis zu vertiefen, indem ich einen Diskriminator geschaffen habe, der durch meine eigene logistische Regression binär klassifiziert werden kann. https://qiita.com/Fumio-eisan/items/e2c625c4d28d74cf02f3
Dieses Mal haben wir eine Modellschätzung unter Verwendung eines tatsächlichen Datensatzes durchgeführt. Wir haben die grundlegende Verarbeitung der sogenannten Datenvorverarbeitung (Dummy-Variableisierung, Löschen von Spalten, Kombination), Dateninterpretation und multiple Co-Linearität zusammengefasst, die bei der multivariaten Analyse ein Problem darstellt. Es gibt viele Implementierungsinhalte.
Der Umriss ist unten.
Die verwendete Version ist wie folgt.
Dieses Mal verwendeten wir den Datensatz der Ergebnisse der Umfrage von 1974 über verheiratete Frauen für das Vorhandensein oder Fehlen von Untreue.
affair.ipynb
df = sm.datasets.fair.load_pandas().data
df.head()
Wenn Sie sich die Daten ansehen, können Sie sehen, dass der Zeitraum seit der Heirat, das Alter, die Anwesenheit von Kindern usw. als erklärende Variablen beschrieben werden. Und schließlich gibt es eine Nummer in der Spalte Angelegenheiten. 0 zeigt an, dass Sie keine Untreue sind, und 1 oder mehr bedeutet, dass Sie Untreue sind (oder waren).
Bewerten Sie den Unterschied zwischen Vorhandensein und Nichtvorhandensein von Untreue. Erstens ist in den aktuellen Daten die Anzahl der Angelegenheiten unterschiedlich, also teilen Sie sie durch die Angelegenheit (1 oder mehr) und nicht durch die Angelegenheit (0).
affair.ipynb
def affair_check(x):
if x!=0:
return 1
else:
return 0
df['Had_Affair']=df['affairs'].apply(affair_check)
Interpretieren Sie die Daten, um nach Parametern zu suchen, die für das Vorhersagemodell wahrscheinlich relevanter sind. Klassifizieren Sie zu diesem Zweck nach Affäre (1) und ohne Affäre (0) und erstellen Sie mit jeder Variablen ein Histogramm. Geben Sie mit Achsen als Rückgabewert jeweils ein Argument in dem Diagramm an, das Sie darstellen möchten.
affair.ipynb
fig, axes = plt.subplots(nrows=3, ncols=3,figsize=(10,8))
sns.countplot(df['age'], hue=df['Had_Affair'],ax=axes[0,0])
sns.countplot(df['yrs_married'], hue=df['Had_Affair'],ax=axes[0,1])
sns.countplot(df['children'], hue=df['Had_Affair'],ax=axes[0,2])
sns.countplot(df['rate_marriage'], hue=df['Had_Affair'],ax=axes[1,0])
sns.countplot(df['religious'], hue=df['Had_Affair'],ax=axes[1,1])
sns.countplot(df['educ'], hue=df['Had_Affair'],ax=axes[1,2])
sns.countplot(df['occupation'], hue=df['Had_Affair'],ax=axes[2,0])
sns.countplot(df['occupation_husb'], hue=df['Had_Affair'],ax=axes[2,1])
Jetzt, da Sie alles auf einmal anzeigen können, können Sie die Daten interpretieren. Grundsätzlich denke ich, dass Sie sich auf die Parameter konzentrieren sollten, bei denen die Peaks zwischen der ** Untreue-Gruppe und der Nicht-Affären-Gruppe unterschiedlich sind. ** ** **
Jetzt führen wir eine Vorverarbeitung durch, um ein Vorhersagemodell zu erstellen. In diesem Affair-Datensatz sind die kategorialen Variablen Beruf und Beruf des Ehemanns. Für diese führen wir Dummy-Variablen ein und klassifizieren sie mit 0/1 Ausdruck.
Es ist so ein Bild. Die Implementierung ist wie folgt.
affair.ipynb
occ_dummies = pd.get_dummies(df['occupation'])
hus_occ_dummies = pd.get_dummies(df['occupation_husb'])
occ_dummies.columns = ['occ1','occ2','occ3','occ4','occ5','occ6']
hus_occ_dummies.columns = ['hocc1','hocc2','hocc3','hocc4','hocc5','hocc6']
occ_dummies
Ich konnte es sicher teilen.
Als nächstes möchte ich die nicht benötigten Spalten entfernen und die benötigten Spalten verbinden. Löschen Sie die Spalten Occupment und Had_Affair.
affair.ipynb
X = df.drop(['occupation','occupation_husb','Had_Affair'],axis=1)
Stellen Sie dann die Dummy-Variablen zusammen.
affair.ipynb
dummies = pd.concat([occ_dummies,hus_occ_dummies],axis=1)
Kombinieren Sie abschließend die Dummy-Variable mit den Originaldaten.
affair.ipynb
XX = pd.concat([X,dummies],axis= 1)
Als nächstes betrachten wir die multiple Co-Linearität. Dies ist ein Problem, das auftritt, wenn die Arten der erklärenden Variablen zunehmen. Unter diesen erklärenden Variablen wird das Phänomen, bei dem die Korrelationskoeffizienten stark miteinander sind, als ** multiple Co-Linearität ** bezeichnet. Wenn es viele multiple Co-Linearitäten gibt, kann die Genauigkeit der Regressionsgleichung extrem schlecht werden und die Analyseergebnisse können instabil werden.
Beispielsweise wird in einem Modell, das die Immobilienpreise vorhersagt, erwartet, dass "Anzahl der Zimmer" und "Zimmerfläche" eine starke Korrelation aufweisen. In solchen Fällen können Sie mehrfache Co-Linearität vermeiden, indem Sie eine der Variablen ausschließen.
Dieses Mal möchte ich ein Modell erstellen, indem ich occ1, hocc1 = Studenten von der Dummy-Variablenbesetzung ausschließe.
affair.ipynb
XX = XX.drop('occ1',axis=1)
XX = XX.drop('hocc1',axis=1)
Die Beziehung ist wie oben gezeigt.
Dann sagen Sie das Modell voraus. Dieses Mal möchte ich eine einfache Vorhersage unter Verwendung der logistischen Regression des wissenschaftlichen Lernens machen. Trainieren Sie das Modell zuerst nur mit den Trainingsdaten. Dann mit den Testdaten vorhersagen.
affair.ipynb
X_train, X_test, Y_train, Y_test = train_test_split(XX, Y)
model2 = LogisticRegression()
model2.fit(X_train, Y_train)
class_predict = model2.predict(X_test)
print(metrics.accuracy_score(Y_test,class_predict))
0.707286432160804
Es stellte sich heraus, dass die korrekte Antwortrate etwa 70% betrug. Was passiert dann, wenn die Daten, die unter Vermeidung der zuvor erwähnten Mehrfach-Co-Linearität gelöscht wurden, nicht so gelöscht werden, wie sie sind (= der Punkt ist, dass die Daten so sind, wie sie sind)?
affair.ipynb
X2_train, X2_test, Y2_train, Y2_test = train_test_split(X2, Y)
model3 = LogisticRegression()
model3.fit(X2_train, Y2_train)
class_predict2 = model3.predict(X2_test)
print(metrics.accuracy_score(Y2_test,class_predict2))
0.9748743718592965
Die richtige Antwortrate war mit 97% hoch. ** In diesem Fall tritt keine multiple Co-Linearität auf, sodass ersichtlich ist, dass die Daten unverändert bleiben sollten. ** ** **
Mit anderen Worten, es scheint, dass die Frage, ob die mehrfache Co-Linearität berücksichtigt werden sollte oder nicht, einmal berücksichtigt werden muss, wenn alle Daten in die Berechnung einbezogen und gelöscht werden. Es stellte sich heraus, dass der empirische Teil das Verfahren ist, Dinge zu sagen.
Die Daten wurden unter Verwendung von Pandas und Matplotlib interpretiert, und die Vorverarbeitung wurde unter Berücksichtigung der multiplen Co-Linearität durchgeführt. Da es sich um einen Tutorial-ähnlichen Datensatz handelt, scheint er reibungslos verlaufen zu sein, aber ich dachte, dass der Umgang mit Pandas wie Zeichnen und Kombinieren von Grafiken noch mehr ist. Da die Implementierung der logistischen Regression selbst sehr einfach ist, war es sehr praktisch, rechnen zu können, ohne zu wissen, was im Inneren vor sich ging.
Das vollständige Programm finden Sie hier. https://github.com/Fumio-eisan/affairs_20200412