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?
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.
Auf meiner eigenen Ebene frage ich mich, ob ich mit scicit-learn oder keras Lerncode schreiben kann.
Der Ablauf des maschinellen Lernens ist wie folgt.
Überprüfen und pflegen Sie die Daten.
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.
Ü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.
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.
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% |
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% |
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.
Ü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.
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.
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.
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.
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)
Das Training übergibt einfach Trainingsdaten an das Modell.
##############################
#Lernen
##############################
model.fit(x_train, y_train)
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.
Klicken Sie zum Senden auf "Zum Wettbewerb einreichen". Was wird passieren ...
Das Ergebnis war "0,75119". 75%. Es ist schlimmer als die Beispieldaten ^^;
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.
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