Ich habe versucht, Daten mit Python unter Bezugnahme auf Udemys [50.000 Menschen auf der Welt] Practical Python Data Science zu analysieren. .. Bei den diesmal verwendeten Daten handelt es sich um Beispieldaten, die in einer Bibliothek namens Statsmodels enthalten sind. Dies ist ein Papier einer Umfrage aus dem Jahr 1974, in der gefragt wurde, ob eine Affäre mit einer verheirateten Frau bestand oder nicht.
Der Zweck dieser Zeit ist Anhand von Beispieldaten erstellen wir ein Modell, das das Vorhandensein oder Fehlen von Untreue durch maschinelles Lernen vorhersagt und vorhersagt, welche Attribute das Ergebnis beeinflussen.
*** Es gibt keine andere Absicht bei der Auswahl dieser Daten, und da die Möglichkeit besteht, dass Falschheit aufgrund von Selbstberichten enthalten ist, berücksichtigen wir die Glaubwürdigkeit der Daten nicht und behandeln sie bis zuletzt als Beispieldaten. *** ***
Umgebung: Pyhton3 scikit-learn version 0.21.2 (Udemy-Kurs und scikit-learn version sind unterschiedlich) jupyter notebook+Anaconda
** Erkläre nicht **: Umgebung Grundlegende Syntax für Python, Pandas, Numpy, matplotlib (andere werden in Kommentaren erklärt) Erklärung des mathematischen Hintergrunds
** Erklären **: Logistische Rückgabe Erklärende und objektive Variablen Datenaufbereitung und Visualisierung Datenvorverarbeitung Modellbau mit Scikit-Learn Zusammenfassung
Die logistische Regression ist eine Regressionsanalyse, bei der die Zielvariable (die Daten, die Sie erfassen möchten) gegen einen Wert zwischen 0 und 1 konvergiert. Insbesondere kann der Wert unter Verwendung der Sigmoid-Funktion konvergiert werden. Es scheint, dass seine Eigenschaften für die Wahrscheinlichkeitsvorhersage und die binäre Klassifizierung verwendet werden. Dieses Mal habe ich die logistische Regression verwendet, da das Vorhandensein oder Fehlen von Untreue in zwei Werte unterteilt ist: 1 und 0.
#Erforderlicher Bibliotheksimport
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import math
#seaborn ist eine Bibliothek, die Grafiken wunderschön zeichnen kann. Es scheint beliebt zu sein.
#set_Ändern Sie Stil mit Stil. Wählen Sie dieses Mal das weiße Gitter aus und wählen Sie mit Körnung mit weißem Hintergrund.
#Wenn es lästig ist.set()Sei einfach in Mode
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
#scikit-Importieren Sie die erforderlichen Module zum Lernen
#cross_Die Validierung kann nur mit älteren Versionen verwendet werden
#2.Ab 0 Modell_Verwenden Sie die Auswahl
from sklearn.linear_model import LogisticRegressin
from sklearn.model_selection import train_test_split
#Modul zur Bewertung eines Modells
from sklearn import metrics
#Importieren, um Beispieldaten für Statistikmodelle zu verwenden
#Möglicherweise muss eine andere als Anaconda installiert werden
import statsmodels.api as sm
Nachdem wir fertig sind, werfen wir einen Blick auf die Datenübersicht.
#Laden Sie Beispieldaten in Pandas DataFrame
df = sm.datasets.fair.load_pandas().data
#Beginnen wir mit einem Überblick über die Daten
df.info()
#Ausgabe
# RangeIndex: 6366 entries, 0 to 6365
# Data columns (total 9 columns):
# rate_marriage 6366 non-null float64
# age 6366 non-null float64
# yrs_married 6366 non-null float64
# children 6366 non-null float64
# religious 6366 non-null float64
# educ 6366 non-null float64
# occupation 6366 non-null float64
# occupation_husb 6366 non-null float64
# affairs 6366 non-null float64
# dtypes: float64(9)
# memory usage: 447.7 KB
#Als nächstes schauen wir uns die ersten 5 Zeilen an
df.head()
rate_ marriage |
age | yrs_married | children | religious | educ | occupation | occupation_husb | affairs |
---|---|---|---|---|---|---|---|---|
3 | 32 | 9.0 | 3 | 3 | 17 | 2 | 5 | 0.1111 |
3 | 27 | 13.0 | 3 | 1 | 14 | 3 | 4 | 3.2308 |
4 | 22 | 2.5 | 0 | 1 | 16 | 3 | 5 | 1.4000 |
4 | 37 | 16.5 | 4 | 3 | 16 | 5 | 5 | 0.7273 |
5 | 27 | 9.0 | 1 | 1 | 14 | 3 | 4 | 4.6667 |
Sie können sehen, dass die Anzahl der Zeilen 6366 beträgt, die Anzahl der Spalten sich aus den objektiven Variablenangelegenheiten und der erklärenden Variablen von insgesamt 9 zusammensetzt und es keine Null gibt. Ergänzung des Spaltennamens
・ Rate_marriage: Selbsteinschätzung des Ehelebens ・ Bildung: Bildung ・ Kinder: Anzahl der Kinder ・ Religiös: Religiös ・ Beruf: Beruf ・ Occupation_husb: Beruf des Ehemanns Sie können die Details jedoch auf der statsmodels-Website überprüfen.
*** Objektive Variable *** bezieht sich auf die Variable, die Sie vorhersagen möchten. In diesem Fall ist "Angelegenheiten", die eine Variable für das Vorhandensein oder Nichtvorhandensein einer Angelegenheit ist, dies. *** Erklärende Variablen *** sind Variablen, die zur Vorhersage der Zielvariablen verwendet werden. Diesmal alle Variablen außer Angelegenheiten.
Dieses Mal müssen wir die Variable auf zwei Werte setzen, um nach Affären zu suchen, aber die objektiven Variablenangelegenheiten sind ein kontinuierlicher reeller Wert. Dies liegt daran, dass der Inhalt der Frage die Zeit ist, in der die Angelegenheiten erledigt sind. Daher fügen wir eine neue Had_Affair-Spalte hinzu, um das Ergebnis über eine Funktion zu speichern, die Zahlen ungleich Null in 1 konvertiert.
#Hatte, wenn Angelegenheiten nicht Null sind_affairs。
def affair_check(x):
if x != 0:
return 1
else:
return 0
#Das Argument apply wendet die Funktion auf die angegebene Spalte an.
df['Had_Affair'] = df['affairs'].apply(affair_check)
#Geben Sie die ersten 5 Zeilen aus
df.head()
rate_marriage | age | yrs_married | children | religious | educ | occupation | occupation_ husb |
affairs | Had_Affair |
---|---|---|---|---|---|---|---|---|---|
3 | 32 | 9.0 | 3 | 3 | 17 | 2 | 5 | 0.1111 | 1 |
3 | 27 | 13.0 | 3 | 1 | 14 | 3 | 4 | 3.2308 | 1 |
4 | 22 | 2.5 | 0 | 1 | 16 | 3 | 5 | 1.4000 | 1 |
4 | 37 | 16.5 | 4 | 3 | 16 | 5 | 5 | 0.7273 | 1 |
5 | 27 | 9.0 | 1 | 1 | 14 | 3 | 4 | 4.6667 | 1 |
Ich konnte es hinzufügen. Lassen Sie uns nun die Daten visualisieren und leicht herausfinden, welche erklärenden Variablen Einfluss haben. Gruppieren Sie nach Had_Affair und berechnen Sie den Durchschnitt jeder Spalte.
df.groupby('Had_Affair').mean()
Had_Affair | rate_marriage | age | yrs_married | children | religious | educ | occupation | occupation_husb | affairs |
---|---|---|---|---|---|---|---|---|---|
0 | 4.330 | 28.39 | 7.989 | 1.239 | 2.505 | 14.32 | 3.405 | 3.834 | 0.000 |
1 | 3.647 | 30.54 | 11.152 | 1.729 | 2.262 | 13.97 | 3.464 | 3.885 | 2.187 |
Sie können sehen, dass die Spalte mit "Had_Affair" in der zweiten Zeile eine lange Ehe und eine geringe Selbsteinschätzung der Ehe aufweist. Lassen Sie uns nun die Beziehung zur Länge der Ehe mit einem Histogramm unter Verwendung von Seaborn (wie einer modischen Matplotlib) visualisieren.
#Aggregieren und visualisieren Sie Daten mithilfe der Countplot-Methode von seaborn. Die Argumente sind X-Achse, Ziel-DF, Spaltenname ist Had_Binäre Klassifizierung mit Affair, Farbspezifikation
sns.countplot('yrs_married',data=df.sort_values('yrs_married'),hue='Had_Affair',palette='coolwarm')
Es scheint eine Beziehung zwischen der Ehe und dem Vorhandensein oder Fehlen einer Affäre zu bestehen. Als nächstes visualisieren wir die Länge der Ehe und die Häufigkeit einer Affäre.
#Die y-Achse des Barplots gibt den Durchschnitt aus. Hätten_Da Affair ein Wert von 1 und 0 ist, wird das Verhältnis von 1 durch Berechnung des Durchschnitts berechnet.
sns.barplot(data=df, x='yrs_married', y='Had_Affair')
Wenn das Eheleben 9 Jahre überschreitet, beträgt die Rate einer Affäre mehr als 40%. Es scheint, dass Sie einige Vorhersagen treffen können, indem Sie sich andere Daten im Voraus ansehen, aber wir werden mit dem nächsten Schritt in diesem Bereich fortfahren.
Nachdem die Visualisierung abgeschlossen ist, werden wir die Daten vorverarbeiten. Insbesondere werden zur Anpassung an das Modell des maschinellen Lernens die erklärende Variable und die Zielvariable getrennt, die Datenwerte ausgerichtet und die fehlenden Werte behandelt.
Lassen Sie uns nun die Datenwerte ausrichten. Den Datenzeichenfolgen "Beruf" und "Beruf_Husb", die Berufe angeben, werden nur zur Vereinfachung Nummern zugewiesen, um sie zu kategorisieren, sodass die Größe der Nummern keinen Sinn macht. Es gibt keine Lizenzgebühren im Beruf.
Erstellen Sie daher eine neue Spalte für die kategorialen Daten der Berufe nach Beruf. Wenn der Datensatz anwendbar ist, werden die Daten angeordnet, indem sie in 2 Werte geteilt werden, andernfalls in 1. Es ist eine mühsame Aufgabe, aber mit der Dummy-Variablengenerierungsfunktion von Pandas ist sie sofort verfügbar.
Da die Besetzungsspalte nicht mehr benötigt wird, löschen Sie sie, weisen Sie die Zielvariable Y zu, weisen Sie die erklärende Variable X zu und löschen Sie Angelegenheiten, bei denen es sich um die Originaldaten der Zielvariablen handelt.
Bei der Ausgabe handelt es sich um eine Tabelle. Da jedoch zu viele Spalten vorhanden sind und Qiita nur schwer erkennen kann, ist sie in zwei Tabellen unterteilt.
#Verwenden Sie eine Funktion, die Dummy-Variablen für Pandas erstellt. Scikit-Es scheint, dass es auch im Lernen ist.
occ_dummies = pd.get_dummies(df['occupation'])
hus_occ_dummies = pd.get_dummies(df['occupation_husb'])
#Nennen Sie den Kategorienamen. Es ist tatsächlich einfacher, den Spaltennamen der Originaldaten zu verwenden, aber ich habe aufgegeben, weil es problematisch war.
occ_dummies.columns = ['occ1','occ2','occ3','occ4','occ5','occ6']
hus_occ_dummies.columns = ['hocc1','hocc2','hocc3','hocc4','hocc5','hocc6']
#Die Spalte für unnötiges Auftreten und die Zielvariable "Had"_Löschen Sie "Affäre". Auch Angelegenheiten.
#Für die Achse gibt 0 die Zeile und 1 die Spalte an.
#Die Drop-Methode findet als Argument statt=Wenn Sie True nicht eingeben, wird es nicht aus dem ursprünglichen DataFrame gelöscht.
X = df.drop(['occupation','occupation_husb','Had_Affair','affairs'],axis=1)
#Kombinieren Sie die Dummy-Variablen im DataFrame der erklärenden Variablen X.
dummies = pd.concat([occ_dummies,hus_occ_dummies],axis=1)
X = pd.concat([X,dummies],axis=1)
#Weisen Sie die Zielvariable Y zu
Y = df.Had_Affair
#Ausgabe
X.head()
rate_marriage | age | yrs_married | children | religious | educ |
---|---|---|---|---|---|
3 | 32 | 9.0 | 3 | 3 | 17 |
3 | 27 | 13.0 | 3 | 1 | 14 |
4 | 22 | 2.5 | 0 | 1 | 16 |
4 | 37 | 16.5 | 4 | 3 | 16 |
5 | 27 | 9.0 | 1 | 1 | 14 |
occ1 | occ2 | occ3 | occ4 | occ5 | occ6 | hocc1 | hocc2 | hocc3 | hocc4 | hocc5 | hocc6 |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
Es scheint, dass eine Analyse möglicherweise nicht möglich ist, wenn eine starke Korrelation zwischen unabhängigen Variablen besteht. Ich nenne es ** multiple Co-Linearität **, aber ich konnte die Details nicht verstehen, selbst wenn ich sie gegoogelt habe, also werde ich sie untersuchen, während ich im nächsten Monat Statistiken studiere.
Derzeit ist die Besetzungsspalte mit Dummy-Variablen diejenige mit der hohen Korrelation in diesen Daten. Es scheint also, dass dies durch einzelnes Löschen behoben werden kann.
#Damit kann ich vorerst umgehen
X = X.drop('occ1',axis=1)
X = X.drop('hocc1',axis=1)
Da die Zielvariable Y Series ist, ändern Sie sie in Array, das ein primäres Array ist, um es an das Modell anzupassen. Damit ist die Datenvorverarbeitung abgeschlossen.
type(Y)
Y = np.ravel(Y)
Erstellen Sie mit scikit-learn ein logistisches Regressionsmodell.
#Erstellen Sie eine Instanz der LogisticRegression-Klasse.
log_model = LogisticRegression()
#Erstellen Sie ein Modell mit den Daten.
log_model.fit(X,Y)
#Lassen Sie uns die Genauigkeit des Modells überprüfen.
log_model.score(X,Y)
#Ausgabe
#0.7260446120012567
Die Genauigkeit dieses Modells beträgt ca. 73%. Ist dies sinnvoll, weil das Modell trainiert ist und die Parameter die Standardeinstellungen sind? Lassen Sie uns nun den Regressionskoeffizienten anzeigen und untersuchen: "Welche Variable trägt zur Vorhersage bei?"
#Erstellen Sie einen DataFrame, um den Variablennamen und seinen Koeffizienten zu speichern.
#coef_Zeigt den Regressionskoeffizienten an.
coeff_df = DataFrame([X.columns, log_model.coef_[0]]).T
coeff_df
0 | 1 |
---|---|
rate_marriage | -0.72992 |
age | -0.05343 |
yrs_married | 0.10210 |
children | 0.01495 |
religious | -0.37498 |
educ | 0.02590 |
occ2 | 0.27846 |
occ3 | 0.58384 |
occ4 | 0.35833 |
occ5 | 0.99972 |
occ6 | 0.31673 |
hocc2 | 0.48310 |
hocc3 | 0.65189 |
hocc4 | 0.42345 |
hocc5 | 0.44224 |
hocc6 | 0.39460 |
Sie können den Regressionskoeffizienten sehen, als das Modell für die erklärenden Variablen erstellt wurde.
Aus dieser Tabelle geht hervor, dass die Möglichkeit der Untreue mit zunehmender Selbsteinschätzung des Ehelebens und der Sichtweise der Religion abnimmt und die Möglichkeit der Untreue mit zunehmender Anzahl von Jahren nach der Heirat zunimmt. Obwohl es auch nach Beruf angezeigt wird, scheint es besser, es als Referenzniveau zu betrachten, da der Wert 1 gelöscht wird, wenn Maßnahmen gegen multiple Co-Linearität ergriffen werden (übrigens occ5, was ein ziemlich hoher Wert ist). Da es sich bei dem Beruf um ein Management handelt, kann es sich um einen Wert handeln, der intuitiv überzeugt.
Wenn Sie die Genauigkeit verbessern möchten, können Sie die Parameter normalisieren und ausprobieren. Angesichts der Glaubwürdigkeit der Daten hielt ich es jedoch für sinnvoller, die Beziehung zu den Ergebnissen anhand von Attributen anhand der im Modell verwendeten Regressionskoeffizienten zu analysieren.
Das Posten der von DataFrame ausgegebenen Tabelle in Qiita war sehr schwierig und dauerte etwa 5 Stunden.
Zuerst habe ich versucht, es in eine matplotlib-Tabelle zu konvertieren und als Bild auszugeben, aber ich habe aufgegeben, weil die Indexzeichen klein wurden und ich nicht wusste, wie ich es beheben sollte. Als nächstes habe ich versucht, eine Bibliothek namens pytablewriter zu verwenden, die DataFrame in Markdown konvertiert. Da es sich jedoch nicht um eine von Anaconda vertriebene Bibliothek handelt, hatte ich keine andere Wahl, als sie mit PIP zu installieren. In der importierten Bibliothek tritt der Fehler "Name kann nicht importiert werden" auf. Überprüfen Sie ihn daher.
Oh! Ich bin überrascht! Wenn Sie darüber nachdenken, können die abhängigen Bibliotheksversionen für Anaconda und PIP unterschiedlich sein, sodass es wahrscheinlich zu Problemen kommt. Bis jetzt war es mir egal, und als ich es auf der Conda-Liste überprüfte, gab es unzählige Pypi, also habe ich es nicht gesehen. Ich fragte mich, ob es Probleme mit anderen Sprachen wie NPM und Garn geben würde, und als ich den Ingenieur meines Freundes fragte, sagte er: "Die Bibliothek wird am selben Ort gespeichert!". Die Wahrheit liegt also im Dunkeln. Die Gegenmaßnahme besteht also darin, eine andere Anaconda-Umgebung oder eine andere Umgebung zu erstellen, in der nur PIP installiert wird. Ich wähle jedoch letztere aus und installiere die Bibliothek mit PIP von Grund auf neu, installiere jedoch Statistikmodelle mit PIP In einigen Fällen tritt ein Fehler auf (mit Anaconda ist es einfacher), und wenn etwas schief geht, ist er behoben.
*** Ich respektiere die Poster, die mit Markdown schnell Tabellen erstellen. Ich würde gerne wissen, ob es einen Weg gibt. *** ***
Recommended Posts