[PYTHON] Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Untreue durch maschinelles Lernen

Einführung

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.

Affairs dataset

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

Was ist logistische Regression?

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.

Datenaufbereitung und Visualisierung

#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')

ダウンロード (1).png

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')

ダウンロード (3).png

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.

Datenvorverarbeitung

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)

Modellbau mit Scikit-Learn

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.

Zusammenfassung

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.

Beiseite

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.

Wenn Sie PIP in der Anaconda-Umgebung installieren, können die Bibliotheken kollidieren und Probleme verursachen.

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

Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Untreue durch maschinelles Lernen
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Prognostizieren Sie das Geschlecht von Twitter-Nutzern durch maschinelles Lernen
Bestätigt den Unterschied im Vorhandensein oder Fehlen einer zufälligen Verarbeitung während des Mini-Batch-Lernens mit Chainer
Versuchen Sie, das Triplett des Bootsrennens vorherzusagen, indem Sie das Lernen bewerten
Python-Lernnotiz für maschinelles Lernen von Chainer bis zum Ende von Kapitel 2
Bestimmen Sie die Authentizität von veröffentlichten Artikeln durch maschinelles Lernen (Google Prediction API).
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 1
Über die Entwicklungsinhalte des maschinellen Lernens (Beispiel)
Analyse der gemeinsamen Raumnutzung durch maschinelles Lernen
[Übersetzung] scikit-learn 0.18 Einführung in maschinelles Lernen durch Tutorial scikit-learn
Angemessene Preisschätzung von Mercari durch maschinelles Lernen
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 2
Versuchen Sie, den Wert des Wasserstandsmessers durch maschinelles Lernen unter Verwendung der offenen Daten von Data City Sabae vorherzusagen
Wie sich die Referenz des Python-Arrays ändert, hängt vom Vorhandensein oder Fehlen von Indizes ab
Vorhersage kurzlebiger Arbeiten von Weekly Shonen Jump durch maschinelles Lernen (Teil 2: Lernen und Bewertung)
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Implementierung eines Modells, das Wechselkurse (Dollar-Yen-Kurs) durch maschinelles Lernen vorhersagt
Vorhersage kurzlebiger Arbeiten von Weekly Shonen Jump durch maschinelles Lernen (Teil 1: Datenanalyse)
Eindrücke vom Udacity Machine Learning Engineer Nano-Abschluss
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Zusammenfassung des grundlegenden Ablaufs des maschinellen Lernens mit Python
Aufzeichnung der ersten Herausforderung des maschinellen Lernens mit Keras
rsync Das Verhalten ändert sich abhängig vom Vorhandensein oder Fehlen des Schrägstrichs der Kopierquelle
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Regression zu bewerten
Grundlagen des maschinellen Lernens (Denkmal)
Das Ergebnis des maschinellen Lernens von Java-Ingenieuren mit Python www
Umfrage zum Einsatz von maschinellem Lernen in realen Diensten
Eine konkrete Methode zur Vorhersage von Pferderennen und zur Simulation der Wiederherstellungsrate durch maschinelles Lernen
Ein Beispiel für einen Mechanismus, der eine Vorhersage von HTTP aus dem Ergebnis des maschinellen Lernens zurückgibt
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Klassifizierung zu bewerten
Beurteilung des Sieges oder der Niederlage von Shadova anhand der Bilderkennung
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
So erhöhen Sie die Anzahl der Datensatzbilder für maschinelles Lernen
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Bedeutung von Datensätzen für maschinelles Lernen
4 [/] Vier Arithmetik durch maschinelles Lernen
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
[Maschinelles Lernen] Überprüfen Sie die Leistung des Klassifikators anhand handgeschriebener Zeichendaten
Führen Sie eine morphologische Analyse in der von GCE gestarteten maschinellen Lernumgebung durch
Wie nutzt man maschinelles Lernen für die Arbeit? 01_ Den Zweck des maschinellen Lernens verstehen
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 4)
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 5)
Bewerten Sie die Genauigkeit des Lernmodells durch einen Kreuztest von scikit learn
Zusammenfassung des maschinellen Lernens von Python-Anfängern
Maschinelles Lernen ③ Zusammenfassung des Entscheidungsbaums
Ich habe versucht, die Vorhersage-API des maschinellen Lernmodells von WordPress aus aufzurufen
Ein-Klick-Datenvorhersage für das Feld, realisiert durch vollautomatisches maschinelles Lernen
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 13 Grundlagen des neuronalen Netzwerks
Grundlegendes maschinelles Lernverfahren: ③ Vergleichen und untersuchen Sie die Auswahlmethode für die Merkmalsmenge
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Algorithmus für maschinelles Lernen (Verallgemeinerung der linearen Regression)
Vorhersage des Strombedarfs durch maschinelles Lernen Teil 2
Kontrolle eines Sandwich-Mannes durch maschinelles Lernen ver4
[Lernnotiz] Grundlagen des Unterrichts mit Python
Notieren Sie die Schritte zum Verständnis des maschinellen Lernens
Notizen vom Anfang von Python 1 lernen
2020 Empfohlen 20 Auswahlmöglichkeiten für einführende Bücher zum maschinellen Lernen
[Fehler] Finde Maki Horikita durch maschinelles Lernen