[PYTHON] Ich habe versucht, mit Kaggles Titanic (kaggle②) zu lernen.

Einführung

Dies ist die Geschichte der erstmaligen Teilnahme am Kaggle </ b> -Wettbewerb. In Last "First Kaggle", ・ Wie man an Kaggle teilnimmt ・ Wie man am Wettbewerb teilnimmt ・ Bis Sie teilnehmen und den Code schreiben ・ So reichen Sie die Ergebnisse ein Ich habe hauptsächlich geschrieben. Dieses Mal möchte ich zum Studium beim "Titanic-Wettbewerb" übergehen. Kann die Genauigkeitsrate des Beispielcodes "76%" überschreiten?

Inhaltsverzeichnis

  1. Grundkenntnisse
  2. Lernfluss
  3. Daten organisieren 3.1. Extrahieren Sie die erforderlichen Elemente 3.2. Behandeln Sie fehlende Werte 3.3. Etiketten digitalisieren 3.4. Zahlen standardisieren
  4. Erstellen Sie ein Modell
  5. Lernen Sie mit Trainingsdaten
  6. Prognostizieren Sie die Ergebnisse mit Testdaten
  7. Übermitteltes Ergebnis
  8. Zusammenfassung Geschichte

1. Grundkenntnisse

Es geht darum, wie sehr eine Person, die maschinelles Lernen kennt, es beschreibt. Vor ungefähr einem halben Jahr (April 2019) interessierte ich mich für maschinelles Lernen und lernte hauptsächlich aus den folgenden Büchern. ・ [Theorie und Praxis des Python-Experten für maschinelles Lernen, Programmierwissenschaftler](https://www.amazon.co.jp/Python-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7% BF% 92% E3% 83% 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0-% E9% 81 % 94% E4% BA% BA% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 82% B5% E3% 82% A4% E3% 82% A8% E3% 83% B3 % E3% 83% 86% E3% 82% A3% E3% 82% B9% E3% 83% 88% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E7% 90% 86% E8 % AB% 96% E3% 81% A8% E5% AE% 9F% E8% B7% B5-Impress-Gear / dp / 4295003379 / ref = dp_ob_title_bk) ・ [Detaillierte Erklärung Deep Learning ~ Zeitreihendatenverarbeitung durch TensorFlow ・ Keras ~](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-%E3%83%87%E3 % 82% A3% E3% 83% BC% E3% 83% 97% E3% 83% A9% E3% 83% BC% E3% 83% 8B% E3% 83% B3% E3% 82% B0-TensorFlow% E3 % 83% BBKeras% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E6% 99% 82% E7% B3% BB% E5% 88% 97% E3% 83% 87% E3% 83 % BC% E3% 82% BF% E5% 87% A6% E7% 90% 86-% E5% B7% A3% E7% B1% A0-% E6% 82% A0% E8% BC% 94 / dp / 4839962510 / ref = sr_1_2? __mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & Schlüsselwörter =% E8% A9% B3% E8% A7% A3 +% E3% 83% 87 % E3% 82% A3% E3% 83% BC% E3% 83% 97% E3% 83% A9% E3% 83% BC% E3% 83% 8B% E3% 83% B3% E3% 82% B0 +% 7ETensorFlow % E3% 83% BBKeras% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E6% 99% 82% E7% B3% BB% E5% 88% 97% E3% 83% 87% E3 % 83% BC% E3% 82% BF% E5% 87% A6% E7% 90% 86 & qid = 1575853564 & s = books & sr = 1-2)

Es ist eine Situation, in der Sie nicht wissen, was "Scikit-Learn", "Tensorflow" und "Keras" sind.

Das Bild, das ich verstehe, ist wie folgt.

  • scikit-learn hat nur wenige Parameter und kann leicht erlernt werden (Verarbeitungsgeschwindigkeit ist schnell)
  • keras ist eine Gruppe von Bibliotheken für maschinelles Lernen, die mit Tensorflow ausgeführt werden. Es kann feiner eingestellt werden als Scikit-Lernen. (Keras scheint außerhalb des Tensorflusses zu arbeiten, aber ich kenne die Details nicht. Theano?)
  • tensorflow ist eine Gruppe von Bibliotheken für maschinelles Lernen, aber diese Bibliothek befindet sich in der Nähe eines Containers. Sie können mit "Konstanten", "Variablen" und "Platzhaltern" umgehen, die für maschinelles Lernen geeignet sind. Wenn Sie jedoch nur Tensorflow verwenden, müssen Sie selbst "Aktivierungsfunktionen" und "Bewertungsfunktionen" erstellen.

Auf meiner eigenen Ebene frage ich mich, ob ich mit scicit-learn oder keras Lerncode schreiben kann.

2. Lernfluss

Der Ablauf des maschinellen Lernens ist wie folgt.

  1. Daten organisieren
  2. Erstellen Sie ein Modell
  3. Lernen Sie mit Trainingsdaten
  4. Prognostizieren Sie die Ergebnisse mit Testdaten

3. Daten organisieren

Überprüfen und pflegen Sie die Daten.

20191209_01.png

Da wir mit einem neuen Notizbuch beginnen, das sich vom vorherigen unterscheidet, klicken Sie zunächst auf "Neues Notizbuch" und wählen Sie die Sprache "Paython" aus und geben Sie "Notizbuch" wie zuvor ein.

20191209_02.png

Überprüfen Sie train.csv. Da Sie den Code schreiben können, können Sie die Daten mit dem Befehl pandas.head () ausgeben, aber Sie können ihn auch herunterladen. Laden Sie ihn also herunter. Klicken Sie auf train.csv und Sie sehen 100 Datenzeilen auf dem Bildschirm. Sie können es mit dem Download-Button herunterladen.

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 0 3 Braund, male 22 1 0 A/5 21171 7.25 S
2 1 1 Cumings, female 38 1 0 PC 17599 71.2833 C85 C
3 1 3 Heikkinen, female 26 0 0 STON/O2. 3101282 7.925 S
4 1 1 Futrelle, female 35 1 0 113803 53.1 C123 S
5 0 3 Allen, male 35 0 0 373450 8.05 S
6 0 3 Moran, male 0 0 330877 8.4583 Q
7 0 1 McCarthy male 54 0 0 17463 51.8625 E46 S
8 0 3 Palsson, male 2 3 1 349909 21.075 S
9 1 3 Johnson, female 27 0 2 347742 11.1333 S
10 1 2 Nasser, female 14 1 0 237736 30.0708 C

Überprüfen Sie CSV mit Excel usw. Es gibt einige Punkte, die ich nicht verstehe, aber es gibt eine Beschreibung in den Daten des Wettbewerbs. Nebenbei bemerkt, wie in OverView erläutert, scheint das Beispiel "gender_submission.csv" "nur Frauen haben überlebt" zu berücksichtigen. Sicherlich stimmen die Werte von "Sex" in "test.csv" und "Survived" in "gender_submission.csv" überein. Deshalb ist die korrekte Antwortrate von "76%" ziemlich beeindruckend.

20191209_03.png Data Dictionary

Variable Definition Übersetzung Key
survival Survival Überleben 0 = No, 1 = Yes
pclass Ticket class Ticketklasse 1 = 1st, 2 = 2nd, 3 = 3rd
sex Sex Sex
Age Age in years Alter
sibsp # of siblings / spouses aboard the Titanic Brüder reiten auf der Titanic/Anzahl der Ehepartner
parch # of parents / children aboard the Titanic Eltern fahren die Titanic/Anzahl der Kinder
ticket Ticket number Ticketnummer
fare Passenger fare Passagiertarif
cabin Cabin number Zimmernummer
embarked Port of Embarkation Boarding Port C = Cherbourg, Q = Queenstown, S = Southampton

Überlegen Sie, welche Elemente zum Lernen verwendet werden sollen. Da "Überleben" der Teil ist, der gefragt wird, werde ich es als Antwort zum Lernen verwenden. Da Frauen und Kinder mit größerer Wahrscheinlichkeit vorrangig auf das Rettungsboot steigen, werden "Geschlecht" und "Alter" verwendet. Je nach Situation kann sich auch Wohlstand ausgewirkt haben. Verwenden wir auch "Ticketklasse" und "Passagiertarif". "Name", "Ticketnummer" und "Einschiffungshafen" scheinen nicht miteinander verbunden zu sein, daher sind sie ausgeschlossen. Das Problem ist "sibsp" und "parch". Wenn "sibsp" und "parch" von Excel usw. aggregiert werden, ist dies wie folgt. Es scheint verwandt zu sein, aber diesmal habe ich es der Einfachheit halber ausgeschlossen.

sibsp (Anzahl der Brüder / Ehepartner auf der Titanic)

Wert von sibsp Survival=1 Survival=0 Überlebensrate
0 210 608 26%
1 112 209 35%
2 13 28 32%
3 4 16 20%
4 3 18 14%
5 0 5 0%
8 0 7 0%

parch (Anzahl der Eltern / Kinder auf der Titanic)

Wert von parch Survival=1 Survival=0 Überlebensrate
0 233 678 26%
1 65 118 36%
2 40 80 33%
3 3 5 38%
4 0 4 0%
5 1 5 17%
6 0 1 0%

3.1. Extrahieren Sie die erforderlichen Elemente

Löschen Sie den Beispielcode und schreiben Sie den folgenden Code. Laden Sie train.csv und extrahieren Sie nur die erforderlichen Elemente ('Überlebt', 'Klasse', 'Geschlecht', 'Alter', 'Tarif').

import numpy 
import pandas 

##############################
#Datenvorverarbeitung 1
#Extrahieren Sie die erforderlichen Elemente
##############################

# train.Laden Sie csv
df_train = pandas.read_csv('/kaggle/input/titanic/train.csv')

df_train = df_train.loc[:, ['Survived', 'Pclass', 'Sex', 'Age', 'Fare']]
df_train.head()
index Survived Pclass Sex Age Fare
0 0 3 male 22 7.25
1 1 1 female 38 71.2833
2 1 3 female 26 7.925
3 1 1 female 35 53.1
4 0 3 male 35 8.05

Ich konnte nur die erforderlichen Elemente extrahieren.

3.2. Behandeln Sie fehlende Werte

Überprüfen Sie, ob Werte fehlen.

##############################
#Datenvorverarbeitung 2
#Behandeln Sie fehlende Werte
##############################

#Überprüfen Sie, ob Werte fehlen
df_train.isnull().sum()
Säule Anzahl
Survived 0
Pclass 0
Sex 0
Age 177
Fare 0

Es gibt viele Daten ohne Alter. Wenn möglich, geben Sie die fehlenden Werte ein, löschen Sie sie diesmal jedoch.

#Löschen Sie Zeilen mit dem Alter Null
# Delete rows with null age
df_train = df_train.dropna(subset=['Age']).reset_index(drop=True)
len(df_train)
Anzahl
714

Zeilen mit dem Alter Null wurden entfernt.

3.3. Etiketten digitalisieren

Die Geschlechter "männlich" und "weiblich" sind so wie sie sind schwer zu handhaben, also digitalisieren Sie sie. Da es nur zwei Typen gibt, männlich und weiblich, können Sie sie selbst konvertieren, aber scikit-learn hat eine praktische Klasse namens LabelEncoder </ b>. Verwenden wir sie also. LabelEncoder: Die Methode fit und die Methode fit_transform ersetzen die Zeichenfolge durch eine Ganzzahl von 0 bis N-1, wenn in der Eingabe N Arten von Zeichenfolgen angezeigt werden.

##############################
#Datenvorverarbeitung 3
#Quantifizieren Sie das Etikett (Name)
##############################
from sklearn.preprocessing import LabelEncoder

#Quantifizieren Sie das Geschlecht mit dem Label Encoder
encoder = LabelEncoder()
df_train['Sex'] = encoder.fit_transform(df_train['Sex'].values)
df_train.head()
index Survived Pclass Sex Age Fare
0 0 3 1 22 7.25
1 1 1 0 38 71.2833
2 1 3 0 26 7.925
3 1 1 0 35 53.1
4 0 3 1 35 8.05

"Sex" wurde quantifiziert. Dieser Encoder wird auch später bei der Quantifizierung des Geschlechts in test.csv verwendet.

3.4. Zahlen standardisieren

Es scheint, dass es viele Fälle gibt, in denen es besser ist, die Skala anzupassen (zu standardisieren), als die numerischen Werte so wie sie sind als Lerndaten einzugeben. Ist es beispielsweise bei der Analyse von Testergebnissen einfacher, Abweichungswerte als Punkte (von 100 oder 200) zu verwenden? Lassen Sie uns "Alter" und "Fahrpreis" standardisieren. Wie bei der Etikettencodierung hat die Standardisierung eine nützliche Klasse beim Scicit-Learn. Standard Scaler </ b>.

##############################
#Datenvorverarbeitung 4
#Zahlen standardisieren
# Data preprocessing 4
# Standardize numbers
##############################
from sklearn.preprocessing import StandardScaler

#Standardisierung
# Standardize numbers
standard = StandardScaler()
df_train_std = pandas.DataFrame(standard.fit_transform(df_train.loc[:, ['Age', 'Fare']]), columns=['Age', 'Fare'])

#Alter standardisieren
# Standardize Age
df_train['Age'] = df_train_std['Age']

#Tarif standardisieren
# Standardize Fare
df_train['Fare'] = df_train_std['Fare']

df_train.head()
index Survived Pclass Sex Age Fare
0 0 3 1 -0.530376641 -0.518977865
1 1 1 0 0.571830994 0.69189675
2 1 3 0 -0.254824732 -0.506213563
3 1 1 0 0.365167062 0.348049152
4 0 3 1 0.365167062 -0.503849804

Alter und Fahrpreis wurden standardisiert. Zu diesem Zeitpunkt ist die Datenpflege abgeschlossen.

4. Erstellen Sie ein Modell

Sobald die Daten fertig sind, ist es Zeit, das Modell zu erstellen. Lassen Sie es uns vorerst mit scicit-learn erstellen. Unten finden Sie ein Flussdiagramm der Algorithmusauswahl auf der sckit-learn-Site.

ml_map.png

Wählen wir ein Modell gemäß diesem Flussdiagramm aus. "Kategorie" JA ⇒ "Mit Etikettendaten" Ja, weiter mit "Klassifizierung" oben links. Ich denke, es entspricht "klassifikationsüberwachtem Lernen". Es wurde "Linear SVC" in der Tabelle.

Beim Training werden die zu trainierenden Daten (= x_train) und die Antwort (= y_train) separat an das Modell übergeben. Das Bild ist wie folgt.

y_train x_train
index Survived Pclass Sex Age Fare
0 0 3 1 -0.530376641 -0.518977865
1 1 1 0 0.571830994 0.69189675
2 1 3 0 -0.254824732 -0.506213563
3 1 1 0 0.365167062 0.348049152
4 0 3 1 0.365167062 -0.503849804

Der Code ist unten.

##############################
#Ein Modell bauen
##############################
from sklearn.svm import LinearSVC

#Trainingsdaten vorbereiten
x_train = df_train.loc[:, ['Pclass', 'Sex', 'Age', 'Fare']].values
y_train = df_train.loc[:, ['Survived']].values

# y_Zugabmessung entfernen
y_train = numpy.reshape(y_train,(-1))

#Generieren Sie ein Modell
model = LinearSVC(random_state=1)

5. Lernen Sie mit Trainingsdaten

Das Training übergibt einfach Trainingsdaten an das Modell.

##############################
#Lernen
##############################
model.fit(x_train, y_train)

6. Prognostizieren Sie die Ergebnisse mit Testdaten

Lassen Sie uns das Lernergebnis mit Testdaten sehen. test.csv sollte den Trainingsdaten (x_train) ähnlich sein. Es gibt einen Mangel an Alter und Fahrpreis, aber selbst wenn es mangelhaft ist, muss das Ergebnis vorhergesagt werden. Wenn es sich um Testdaten handelt, werden diese in "0" konvertiert, ohne gelöscht zu werden.

##############################
# test.CSV konvertieren
# convert test.csv
##############################
# test.Laden Sie csv
# Load test.csv
df_test = pandas.read_csv('/kaggle/input/titanic/test.csv')

# 'PassengerId'Extrahieren(Mit dem Ergebnis kombinieren)
df_test_index = df_test.loc[:, ['PassengerId']]

# 'Survived', 'Pclass', 'Sex', 'Age', 'Fare'Extrahieren
# Extract 'Survived', 'Pclass', 'Sex', 'Age', 'Fare'
df_test = df_test.loc[:, ['Pclass', 'Sex', 'Age', 'Fare']]

#Quantifizieren Sie das Geschlecht mit dem Label Encoder
# Digitize gender using LabelEncoder
df_test['Sex'] = encoder.transform(df_test['Sex'].values)

df_test_std = pandas.DataFrame(standard.transform(df_test.loc[:, ['Age', 'Fare']]), columns=['Age', 'Fare'])

#Alter standardisieren
# Standardize Age
df_test['Age'] = df_test_std['Age']

#Tarif standardisieren
# Standardize Fare
df_test['Fare'] = df_test_std['Fare']

# Age,Tarif Nan in 0 umwandeln
# Convert Age and Fare Nan to 0
df_test = df_test.fillna({'Age':0, 'Fare':0})

df_test.head()
Index Pclass Sex Age Fare
0 3 1 0.298549339 -0.497810518
1 3 0 1.181327932 -0.512659955
2 2 1 2.240662243 -0.464531805
3 3 1 -0.231117817 -0.482887658
4 3 0 -0.584229254 -0.417970618

Ich konnte die Testdaten auf die gleiche Weise konvertieren. Prognostizieren Sie das Ergebnis. Geben Sie einfach die Testdaten ein und sagen Sie voraus.

##############################
#Ergebnisse vorhersagen
# Predict results
##############################
x_test = df_test.values
y_test = model.predict(x_test)

Das Ergebnis ist in y_test. Speichern Sie das Ergebnis im selben Format wie gender_submission.csv.

#Kombinieren Sie das Ergebnis mit dem DataFrame der PassengerId
# Combine the data frame of PassengerId and the result
df_output = pandas.concat([df_test_index, pandas.DataFrame(y_test, columns=['Survived'])], axis=1)

# result.Schreiben Sie csv in das aktuelle Verzeichnis
# Write result.csv to the current directory
df_output.to_csv('result.csv', index=False)

Mit den oben genannten konnten wir die Ergebnisse erhalten. Ich werde versuchen, es wie zuvor mit "Commit" auszuführen. Klicken Sie nach Abschluss der Ausführung auf "Open Viersion". Sie können sehen, dass result.csv erstellt wurde.

20191209_04.png

Klicken Sie zum Senden auf "Zum Wettbewerb einreichen". Was wird passieren ...

7. Übermitteltes Ergebnis

20191210_01.png

Das Ergebnis war "0,75119". 75%. Es ist schlimmer als die Beispieldaten ^^;

8. Zusammenfassung

Wie war das. Ich habe die Lernparameter überhaupt nicht angepasst, aber den Lernfluss verstanden. Nächstes Mal untersucht die Daten und überprüft die Lernparameter, damit die Punktzahl etwas besser wird.

Geschichte

2019/12/11 Erste Ausgabe veröffentlicht 2019/12/26 Installation des nächsten Links 2020/01/03 Kommentare zur Quelle korrigiert 2020/03/26 Teilweise Überarbeitung des Quellcodes von "6. Vorhersage des Ergebnisses mit Testdaten"

Recommended Posts