[PYTHON] (Kaggle) Prognostizierte Überlebende der Titanic anhand eines Modells unter Verwendung von Entscheidungsbäumen und zufälligen Wäldern

1. Zuallererst

Als Tutorial zum Erlernen des maschinellen Lernens werde ich als Erinnerung die Methode aufzeichnen, mit der ich die Überlebenden der Titanic vorhergesagt habe. Dies ist ein Muss für alle.

Über die verwendete Version

Die verwendeten Daten wurden nach der Registrierung bei Kaggle von hier heruntergeladen. https://www.kaggle.com/c/titanic

2 Über das Programm

Importierte Bibliotheken usw.


import pandas as pd
import numpy as np
df = pd.read_csv('train.csv') 

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline 

Definiert als Datenrahmen df. Schauen wir uns nun die ersten fünf Zeilen der gelesenen Daten an.


df.head()

001.png

Überlebt ist 1 für das Überleben und 0 für den Tod. Auf der offiziellen Website finden Sie Informationen zu anderen Faktoren.

Histogramm

Schauen wir uns als nächstes das Histogramm an.


df.hist(figsize=(12,12))
plt.show()

002.png

Sie können sehen, dass die meisten von ihnen in den 20ern und 30ern sind und die meisten von ihnen eine Klasse von 3 haben (die billigsten).

Überprüfen Sie den Korrelationskoeffizienten


plt.figure(figsize = (15,15))
sns.heatmap(df.corr(),annot = True)

003.png

Indikatoren mit einem hohen Korrelationskoeffizienten für Survived sind 0,26: Fare und -0,34: Pclass. Wenn die Pclass-Note festgelegt wird, Tarif: Ich denke, dass der Tarif natürlich festgelegt wird, aber die beiden sind unterschiedliche Indikatoren. ..

Umgang mit fehlenden Werten


df.isnull().sum()

PassengerId 0 Survived 0 Pclass 0 Name 0 Sex 0 Age 177 SibSp 0 Parch 0 Ticket 0 Fare 0 Cabin 687 Embarked 2 dtype: int64

Alter: Alter und Kabine: Sie können sehen, dass es viele Beträge ohne Besatzungsnummer gibt. Informationen zum Umgang mit fehlenden Werten finden Sie im Folgenden. https://qiita.com/0NE_shoT_/items/8db6d909e8b48adcb203

Dieses Mal habe ich beschlossen, das Alter durch den Medianwert zu ersetzen. Auch eingeschifft: Die Pension ersetzt die meisten S. Andere fehlende Werte wurden entfernt.


from sklearn.model_selection import  train_test_split
#Verarbeitung fehlender Werte
df['Fare'] = df['Fare'].fillna(df['Fare'].median())
df['Age'] = df['Age'].fillna(df['Age'].median())
df['Embarked'] = df['Embarked'].fillna('S')

#Konvertierung kategorialer Variablen
df['Sex'] = df['Sex'].apply(lambda x: 1 if x == 'male' else 0)
df['Embarked'] = df['Embarked'].map( {'S': 0 , 'C':1 , 'Q':2}).astype(int)

#Löschen Sie nicht benötigte Spalten
df = df.drop(['Cabin','Name','PassengerId','Ticket'],axis =1)

Klassifizierung von Trainingsdaten und Testdaten


train_X = df.drop('Survived',axis = 1)
train_y = df.Survived
(train_X , test_X , train_y , test_y) = train_test_split(train_X, train_y , test_size = 0.3 , random_state = 0)

Diesmal betragen die Testdaten 30% (test_size = 0,3).

Vorhersage durch maschinelles Lernen (Entscheidungsbaum)


from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(criterion='gini', random_state = 0)
clf = clf.fit(train_X , train_y)
pred = clf.predict(test_X)

#Berechnung der richtigen Antwortrate
from sklearn.metrics import (roc_curve , auc ,accuracy_score)
pred = clf.predict(test_X)
fpr, tpr, thresholds = roc_curve(test_y , pred,pos_label = 1)
auc(fpr,tpr)
accuracy_score(pred,test_y)

Ich habe hier auf die Behandlung von Entscheidungsbaumparametern verwiesen. http://data-analysis-stats.jp/2019/01/14/%E6%B1%BA%E5%AE%9A%E6%9C%A8%E5%88%86%E6%9E%90%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A7%A3%E8%AA%AC/

criterion='gini', 0.7798507462686567 criterion='entropy', 0.7910447761194029

Die richtige Antwortrate war für die Entropie etwas höher. Laut der Referenz-URL

Aus Gründen der ordnungsgemäßen Verwendung wird gesagt, dass der Gini-Koeffizient bei kontinuierlichen Daten besser ist und die Entropie bei Kategoriedaten besser ist. Der Gini-Koeffizient minimiert die Fehlklassifizierung, während die Entropie explorativ nach einem Referenzwert sucht.

... anscheinend ... Dieses Mal gab es viele Kategoriedaten wie Geschlecht und Internat, sodass Entropie angebracht sein kann.

Dies ist auch hilfreich, da es detaillierte Informationen zum Entscheidungsbaum enthält. https://qiita.com/3000manJPY/items/ef7495960f472ec14377

Vorhersage durch maschinelles Lernen (Random Forest)


from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators = 10,max_depth=5,random_state = 0) #Erstellen Sie eine Instanz einer zufälligen Gesamtstruktur.
clf = clf.fit(train_X , train_y) #Trainieren Sie das Modell mit der Anpassungsmethode unter Verwendung von Lehrerbezeichnungen und Lehrerdaten
pred = clf.predict(test_X)
fpr, tpr , thresholds = roc_curve(test_y,pred,pos_label = 1)
auc(fpr,tpr)
accuracy_score(pred,test_y)

0.8283582089552238

Zufällige Wälder stehen zur Klassifizierung (Classifier) und zur Regressionsanalyse (Regressor) zur Verfügung. Dieses Mal werden wir es zur Klassifizierung verwenden, da der Zweck darin besteht, zu klassifizieren, ob es lebt oder tot ist.

Ich habe versucht, die Lernparameter und Argumente der RandomForestClassifier-Klasse zu verschieben, während ich mir das ansah. https://data-science.gr.jp/implementation/iml_sklearn_random_forest.html

Als ich n_estimators erhöhte, erhöhte sich die Genauigkeitsrate. Es wird gesagt, dass n_Stimatoren und Epochen, die in neuronalen Netzen verwendet werden, häufig in Schwierigkeiten geraten, selbst wenn sie mit großen Werten berechnet werden. Informationen zu Inhalt und Gegenmaßnahmen finden Sie weiter unten. https://amalog.hateblo.jp/entry/hyper-parameter-search

Ausgabe des Vorhersageergebnisses

Aus den vorherigen Ergebnissen wurde festgestellt, dass die richtige Antwortrate in der zufälligen Gesamtstruktur höher ist als im Entscheidungsbaum. Aus diesem Grund haben wir uns dieses Mal für eine zufällige Gesamtstruktur entschieden.


fin = pd.read_csv('test.csv')
fin.head()

passsengerid = fin['PassengerId']
fin.isnull().sum()
fin['Fare'] = fin['Fare'].fillna(fin['Fare'].median()) 
fin['Age'] = fin['Age'].fillna(fin['Age'].median())
fin['Embarked'] = fin['Embarked'].fillna('S')

#Konvertierung kategorialer Variablen
fin['Sex'] = fin['Sex'].apply(lambda x: 1 if x == 'male' else 0)
fin['Embarked'] = fin['Embarked'].map( {'S': 0 , 'C':1 , 'Q':2}).astype(int)

#Löschen Sie nicht benötigte Spalten
fin= fin.drop(['Cabin','Name','Ticket','PassengerId'],axis =1)
#In einem zufälligen Wald vorhergesagt
predictions = clf.predict(fin)

submission = pd.DataFrame({'PassengerId':passsengerid, 'Survived':predictions})
submission.to_csv('submission.csv' , index = False)

004.png

Es war 4900./16000. Ich würde mich gerne mehr widmen.

Recommended Posts

(Kaggle) Prognostizierte Überlebende der Titanic anhand eines Modells unter Verwendung von Entscheidungsbäumen und zufälligen Wäldern
Erstellen Sie ein Überlebensvorhersagemodell für Passagiere der Kaggle Titanic, ohne Python zu verwenden
Ich habe versucht, Überlebende der Titanic mit Kaggle vorherzusagen und einzureichen
[Kaggle] Ich habe mit dem Titanic-Tutorial eine Sammlung von Problemen erstellt