[PYTHON] Annäherungserklärung für Anfänger, um in Kaggle Titanic_2 unter den besten 1,5% (0,83732) zu sein

Nach Letztes Mal erreichte Kaggle Titanic die höchsten 1,5% (0,83732). Ich werde den Ansatz von erklären. Der verwendete Code ist titanic (0.83732) _2 in Github. Dieses Mal werden wir die eingereichte Punktzahl auf 0,81339 erhöhen und uns auf die nächsten 0,83732 vorbereiten. Darüber hinaus werden wir vor der Prognose die verwendeten [vorherigen] Daten (https://qiita.com/shiroino11111/items/bc3889fa38ff32d46c13) visualisieren und die Daten analysieren.

1. Importieren Sie die erforderliche Bibliothek und laden Sie die CSV.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline,make_pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
from sklearn import model_selection
from sklearn.model_selection import GridSearchCV
import warnings
warnings.filterwarnings('ignore')
#Lesen Sie CSV
train= pd.read_csv("train.csv")
test= pd.read_csv("test.csv")

#Datenintegration
dataset = pd.concat([train, test], ignore_index = True)

#Zur Einreichung
PassengerId = test['PassengerId']

Schauen wir uns die Beziehung der einzelnen Daten an.

2. Bestätigen Sie die Beziehung zwischen Alter und Überlebensrate

#Banddiagramm von Alter und Überlebensrate
sns.barplot(x="Sex", y="Survived", data=train, palette='Set3')

#Überlebensrate nach Geschlecht
print("females: %.2f" %(train['Survived'][train['Sex'] == 'female'].value_counts(normalize = True)[1]))
print("males: %.2f" %(train['Survived'][train['Sex'] == 'male'].value_counts(normalize = True)[1]))

image.png females: 0.74 males: 0.19 Sie können sehen, dass Frauen viel hilfreicher sind. Was ist mit der Überlebensrate für jede Ticketklasse?

3. Bestätigen Sie das Verhältnis der Überlebensrate für jede Ticketklasse

#Ticketklasse und Überlebensbanddiagramm
sns.barplot(x='Pclass', y='Survived', data=train, palette='Set3')

#Überlebensrate nach Ticketklasse
print("Pclass = 1 : %.2f" %(train['Survived'][train['Pclass']==1].value_counts(normalize = True)[1]))
print("Pclass = 2 : %.2f" %(train['Survived'][train['Pclass']==2].value_counts(normalize = True)[1]))
print("Pclass = 3 : %.2f" %(train['Survived'][train['Pclass']==3].value_counts(normalize = True)[1]))

image.png Pclass = 1 : 0.63 Pclass = 2 : 0.47 Pclass = 3 : 0.24 Je höher der Ticketkäufer, desto höher die Überlebensrate. Was ist mit dem Preis?

4. Bestätigen Sie das Verhältnis der Überlebensrate gegen Gebühr

#Vergleich der Überlebensrate nach Preis
fare = sns.FacetGrid(train, hue="Survived",aspect=2)
fare.map(sns.kdeplot,'Fare',shade= True)
fare.set(xlim=(0, 200))
fare.add_legend()

image.png Immerhin ist zu sehen, dass Menschen mit niedrigen Ticketpreisen eine niedrige Überlebensrate haben.

5. Bestätigen Sie die Beziehung zwischen Alter und Überlebensrate

#Vergleich der Überlebensrate nach Alter
age = sns.FacetGrid(train, hue="Survived",aspect=2)
age.map(sns.kdeplot,'Age',shade= True)
age.set(xlim=(0, train['Age'].max()))
age.add_legend()

image.png Hat das Kind zuerst Hilfe bekommen? Sie können sehen, dass die Überlebensrate unter 10 Jahren hoch ist.

6. Bestätigen Sie die Beziehung zwischen Gästezimmer und Überlebensrate

Von hier aus vorher werden wir die nicht verwendeten Daten überprüfen. Erstens ist die Rauminformation. Kabine (Raumnummer) scheint je nach Akronym unterschiedliche Raumebenen zu haben. image.png

#Vergleich der Überlebensrate nach Raumebene
dataset['Cabin'] = dataset['Cabin'].fillna('Unknown') #Ersetzen Sie Unbekannt, wenn Raumdaten fehlen
dataset['Deck'] = dataset['Cabin'].str.get(0) #Holen Sie sich den ersten Buchstaben (0. Buchstabe) der Kabine (Zimmernummer)
sns.barplot(x="Deck", y="Survived", data=dataset, palette='Set3')

image.png Es gibt einige Variationen. Letztes Mal Nachdem der fehlende Wert durch den Medianwert ersetzt und bestätigt wurde, dass kein Wert fehlt, werden die diesmal erstellten Informationen "Deck" (Raumhierarchie) angezeigt. Machen Sie zusätzliche Vorhersagen.

6.1 Fügen Sie Rauminformationen hinzu und treffen Sie Vorhersagen auf die gleiche Weise wie Letztes Mal.

# Age(Alter)Und Fahrpreis(Gebühr)Ist der Medianwert von jedem, eingeschifft(Ausgangspunkt)Ist S.(Southampton)Ersatz
dataset["Age"].fillna(dataset.Age.mean(), inplace=True) 
dataset["Fare"].fillna(dataset.Fare.mean(), inplace=True) 
dataset["Embarked"].fillna("S", inplace=True)

#Überprüfen Sie die Anzahl der fehlenden Daten
dataset_null = dataset.fillna(np.nan)
dataset_null.isnull().sum()
#Extrahieren Sie die zu verwendenden Variablen
dataset3 = dataset[['Survived','Pclass','Sex','Age','Fare','Embarked', 'Deck']]

#Erstellen Sie eine Dummy-Variable
dataset_dummies = pd.get_dummies(dataset3)
dataset_dummies.head(3)
#Zerlegen Sie Daten in Zug und Test
#( 'Survived'Existiert im Zug,Nicht testen)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]

#Trennen Sie Zugdaten in Variablen und korrigieren Sie die Antworten
X = train_set.as_matrix()[:, 1:] #Variablen nach Pclass
y = train_set.as_matrix()[:, 0] #Richtige Antwortdaten

#Erstellen eines Vorhersagemodells
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Versuchen Sie 20-30 in Schritten
              'classify__max_depth':list(range(3, 10, 1))} #Versuchen Sie 3-10 in Schritten
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(X, y)
print(grid.best_params_, grid.best_score_)

#Vorhersage von Testdaten
pred = grid.predict(test_set)

#Erstellen einer CSV-Datei für die Kaggle-Übermittlung
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": pred.astype(np.int32)})
submission.to_csv("submission3.csv", index=False)

{'classify__max_depth': 8, 'classify__n_estimators': 22} 0.8327721661054994 Die eingereichte Punktzahl betrug 0,78947. Durch die Aufnahme von Informationen auf Raumebene wurde diese gegenüber der vorherigen Zeit erhöht.

7. Bestätigen Sie die Beziehung zwischen Ticket und Überlebensrate

Dann probieren Sie die Ticketinformationen. Aber wie gruppiert man sie? Es ist möglich, zwischen der Anzahl der Zeichen und der Angabe des ersten Buchstabens oder Alphabets der Zahl zu unterscheiden. Wenn diese jedoch zu stark erhöht wird, wird die Genauigkeit verringert. Lassen Sie uns dies überprüfen, indem Sie die Anzahl der Zeichen im Ticket teilen.

#Vergleich der Überlebensrate anhand der Anzahl der Zeichen im Ticket
Ticket_Count = dict(dataset['Ticket'].value_counts()) #Gruppieren Sie nach der Anzahl der Zeichen im Ticket
dataset['TicketGroup'] = dataset['Ticket'].apply(lambda x:Ticket_Count[x]) #Gruppenverteilung
sns.barplot(x='TicketGroup', y='Survived', data=dataset, palette='Set3')

image.png Es gibt einen Unterschied zur vorherigen Kabinenabteilung (Raumebene).

7.1 Fügen Sie erste Ticketinformationen hinzu, um Vorhersagen zu treffen

#Extrahieren Sie die zu verwendenden Variablen
dataset4 = dataset[['Survived','Pclass','Sex','Age','Fare','Embarked', 'Deck', 'TicketGroup']]

#Erstellen Sie eine Dummy-Variable
dataset_dummies = pd.get_dummies(dataset4)
dataset_dummies.head(4)
#Zerlegen Sie Daten in Zug und Test
#( 'Survived'Existiert im Zug,Nicht testen)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]

#Trennen Sie Zugdaten in Variablen und korrigieren Sie die Antworten
X = train_set.as_matrix()[:, 1:] #Variablen nach Pclass
y = train_set.as_matrix()[:, 0] #Richtige Antwortdaten

#Erstellen eines Vorhersagemodells
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Versuchen Sie 20-30 in Schritten
              'classify__max_depth':list(range(3, 10, 1))} #Versuchen Sie 3-10 in Schritten
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(X, y)
print(grid.best_params_, grid.best_score_, sep="\n")

#Vorhersage von Testdaten
pred = grid.predict(test_set)

#Erstellen einer CSV-Datei für die Kaggle-Übermittlung
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": pred.astype(np.int32)})
submission.to_csv("submission4.csv", index=False)

{'classify__max_depth': 8, 'classify__n_estimators': 23} 0.8406285072951739 Die Trainingspunktzahl stieg, aber die an Kaggle übermittelte Punktzahl fiel auf 0,77990. Erstens scheint die Korrelation zwischen der Anzahl der Zeichen in einem Ticket und der Überlebensrate realistisch gesehen schwach zu sein. Da es sich jedoch um eine Funktion handelt, die mit großem Aufwand herausgekommen ist, werde ich versuchen, durch Unterdrücken der Elemente in zwei Gruppen, einer hohen Gruppe und einer niedrigen Gruppe, zu lernen.

7.2 Machen Sie Vorhersagen, indem Sie die Anfangsinformationen der Tickets gruppieren

#Teilen Sie sich in zwei Gruppen ein, eine Gruppe mit einer hohen Überlebensrate in Bezug auf die Anzahl der Zeichen im Ticket und eine Gruppe mit einer niedrigen Überlebensrate.
#Ersetzen Sie 2, wenn hoch, und 1, wenn niedrig
def Ticket_Label(s):
    if (s >= 2) & (s <= 4): #Gruppe mit hoher Überlebensrate in der Anzahl der Charaktere
        return 2
    elif ((s > 4) & (s <= 8)) | (s == 1): #Gruppe mit niedriger Überlebensrate in der Anzahl der Charaktere
        return 1
    elif (s > 8):
        return 0

dataset['TicketGroup'] = dataset['TicketGroup'].apply(Ticket_Label)
sns.barplot(x='TicketGroup', y='Survived', data=dataset, palette='Set3')

image.png Es sieht so aus, als wäre es ordentlich getrennt.

#Zerlegen Sie Daten in Zug und Test
#( 'Survived'Existiert im Zug,Nicht testen)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]

#Trennen Sie Zugdaten in Variablen und korrigieren Sie die Antworten
X = train_set.as_matrix()[:, 1:] #Variablen nach Pclass
y = train_set.as_matrix()[:, 0] #Richtige Antwortdaten

#Erstellen eines Vorhersagemodells
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Versuchen Sie 20-30 in Schritten
              'classify__max_depth':list(range(3, 10, 1))} #Versuchen Sie 3-10 in Schritten
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(X, y)
print(grid.best_params_, grid.best_score_, sep="\n")

#Vorhersage von Testdaten
pred = grid.predict(test_set)

#Erstellen einer CSV-Datei für die Kaggle-Übermittlung
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": pred.astype(np.int32)})
submission.to_csv("submission5.csv", index=False)

{'classify__max_depth': 7, 'classify__n_estimators': 23} 0.8417508417508418 Die bei Kaggle eingereichte Punktzahl hat sich deutlich auf 0,81339 verbessert.

8. Zusammenfassung

Diesmal durch Hinzufügen von Informationen zur Raumhierarchie und Informationen, die in zwei Gruppen unterteilt sind, eine Gruppe mit einer hohen Überlebensrate und eine Gruppe mit einer niedrigen Überlebensrate unter dem Akronym des Tickets vorher / bc3889fa38ff32d46c13) Die eingereichte Punktzahl verbesserte sich von 0,78468 auf 0,81339. Nächstes Mal Abschließend werde ich den Ansatz für den Einreichungswert 0,83732 erläutern, der den oberen 1,5% entspricht.

Recommended Posts

Annäherungserklärung für Anfänger, um in Kaggle Titanic_3 unter den besten 1,5% (0,83732) zu sein
Annäherungserklärung für Anfänger, um in Kaggle Titanic_1 unter den besten 1,5% (0,83732) zu sein
Annäherungserklärung für Anfänger, um in Kaggle Titanic_2 unter den besten 1,5% (0,83732) zu sein
Kaggle Tutorial Titanic Know-how, um in den Top 2% zu sein
Untersuchen Sie die Parameter von RandomForestClassifier im Kaggle / Titanic-Tutorial
[Für Kaggle-Anfänger] Titanic (LightGBM)
[Für Anfänger] Ich möchte die Anzahl der Lernerfahrungen leicht verständlich erklären.
[Kaggle für Super-Anfänger] Titanic (Logistic Return)
Wechseln Sie das zu ladende Modul für jede Ausführungsumgebung in Python
Datenanalyse in Python Zusammenfassung der Quellen, die Anfänger zuerst betrachten sollten
Der schnellste Weg für Anfänger, um Python zu beherrschen
Ich habe versucht, die Pferde vorherzusagen, die mit LightGBM unter den Top 3 sein werden
Versuchen Sie, RPN mit Python zu berechnen (für Anfänger)
[Für Anfänger] Einführung in die Vektorisierung beim maschinellen Lernen
Grundlegende Geschichte der Vererbung in Python (für Anfänger)
Tag 66 [Einführung in Kaggle] Die einfachste Titanic-Vorhersage
So beschränken Sie die API, die in der gemeinsam genutzten Linux-Bibliothek in C-Sprache veröffentlicht werden soll
[Für Anfänger] Web-Scraping mit Python "Greifen Sie auf die URL auf der Seite zu, um den Inhalt abzurufen."
Suchen Sie eine Richtlinie für die Anzahl der Prozesse / Threads, die auf dem Anwendungsserver festgelegt werden sollen
Geben Sie für jede Datei die angegebene Tabelle der Oracle-Datenbank in Python in Excel aus
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
So ermitteln Sie die Anzahl der Stellen in Python
Ich habe das MNIST-Tutorial von tensorflow für Anfänger ausprobiert.
[Für Anfänger] Installieren Sie das Paket in der Anaconda-Umgebung (Janome)
Überprüfen Sie, ob in Java BigQuery-Tabellen vorhanden sind
[Für Anfänger] Quantifizieren Sie die Ähnlichkeit von Sätzen mit TF-IDF
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Alles für Anfänger, um maschinelles Lernen zu können
[Für Anfänger von Wettkampfprofis] Drei Eingabemethoden, die Sie beim Starten der Wettkampfprogrammierung mit Python beachten sollten
Was scheint eine Vorlage für den Standardeingabe-Teil des Competition Pro in Python3 zu sein
So finden Sie die optimale Anzahl von Clustern für k-means
Testcode, um auf der Seite nach defekten Links zu suchen
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
Python3-Verarbeitung, die in Paiza verwendbar zu sein scheint
[Für Anfänger] Zusammenfassung der Standardeingabe in Python (mit Erklärung)
■ Kaggle-Übung für Anfänger - Einführung von Python - von Google Colaboratory
Zusammenfassung der Stolperpunkte in Django zum ersten Mal
[Erklärung für Anfänger] Einführung in die Faltverarbeitung (erklärt in TensorFlow)
[Erklärung für Anfänger] Einführung in die Pooling-Verarbeitung (erklärt in TensorFlow)
Ermitteln Sie die Anzahl der Vorkommen für jedes Element in der Liste
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden
Für Anfänger, wie man mit häufigen Fehlern in Keras umgeht
[Python] Die größten Schwächen und Nachteile von Google Colaboratory [Für Anfänger]
Google sucht mit Python nach der Zeichenfolge in der letzten Zeile der Datei
Aktivieren Sie die Schaltfläche Überprüfen in Tkinter, damit der Eintrag bearbeitet werden kann
So entfernen Sie die "Tags müssen ein Array von Hashes sein." Fehler in Qiita API
Schlafverarbeitung für einen bestimmten Zeitraum (Sekunden) oder länger in Python
Eine kleine süchtig machende Geschichte mit den Berechtigungen des von expdp angegebenen Verzeichnisses (für Anfänger)
Die Geschichte, zum ersten Mal seit 5 Jahren wieder an die Front zurückzukehren und Python Django umzugestalten
Erster Kaggle (Kaggle ①)
[Für Anfänger] Kaggle-Übung (Merucari)
Übersicht über Docker (für Anfänger)
Kaggle Tutorial Titanic Genauigkeit 80,9% (Top 7% 0,80861)
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
[Für Anfänger] So implementieren Sie O'reilly-Beispielcode in Google Colab
So bestimmen Sie die Existenz eines Selenelements in Python
So ändern Sie die Protokollstufe von Azure SDK für Python