[PYTHON] (Kaggle) Prédiction des survivants du Titanic à l'aide d'un modèle utilisant des arbres de décision et des forêts aléatoires

1.Tout d'abord

En guise de tutoriel sur l'apprentissage de l'apprentissage automatique, j'enregistrerai pour rappel la méthode que j'ai utilisée pour prédire les survivants du Titanic, qui est un chemin incontournable pour tout le monde.

À propos de la version utilisée

Les données utilisées ont été téléchargées à partir d'ici après l'enregistrement auprès de Kaggle. https://www.kaggle.com/c/titanic

2 À propos du programme

Bibliothèques importées, etc.


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 

Défini comme trame de données df. Regardons maintenant les cinq premières lignes des données lues.


df.head()

001.png

Survived est 1 pour la survie et 0 pour la mort. Veuillez consulter le site Web officiel pour connaître les autres facteurs auxquels se réfèrent.

histogramme

Ensuite, regardons l'histogramme.


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

002.png

Vous pouvez voir que la plupart d'entre eux ont entre 20 et 30 ans, et la plupart d'entre eux ont une classe P de 3 (la moins chère).

Vérifiez le coefficient de corrélation


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

003.png

Les indicateurs avec un coefficient de corrélation élevé pour Survived sont 0,26: Fare et -0,34: Pclass. Si la note Pclass est décidée, Fare: Je pense que le tarif sera décidé naturellement, mais les deux sont des indicateurs différents. ..

Traitement des valeurs manquantes


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

Âge: Âge et cabine: Vous pouvez voir qu'il y a beaucoup de montants sans le numéro d'équipage. Pour la gestion des valeurs manquantes, reportez-vous à ce qui suit. https://qiita.com/0NE_shoT_/items/8db6d909e8b48adcb203

Cette fois, j'ai décidé de substituer la valeur médiane à l'âge. Aussi, embarqué: le lieu d'embarquement remplace le plus S. Les autres valeurs manquantes ont été supprimées.


from sklearn.model_selection import  train_test_split
#Traitement de la valeur manquante
df['Fare'] = df['Fare'].fillna(df['Fare'].median())
df['Age'] = df['Age'].fillna(df['Age'].median())
df['Embarked'] = df['Embarked'].fillna('S')

#Conversion de variables catégorielles
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)

#Supprimer les colonnes inutiles
df = df.drop(['Cabin','Name','PassengerId','Ticket'],axis =1)

Classification des données d'entraînement et des données de test


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)

Cette fois, les données de test sont de 30% (test_size = 0,3).

Prédiction par apprentissage automatique (arbre de décision)


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

#Calcul du taux de réponse correcte
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)

Je me suis référé ici pour le traitement des paramètres de l'arbre de décision. 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

Le taux de réponse correcte était légèrement plus élevé pour l'entropie. Selon l'url de référence

Pour une bonne utilisation, on dit que le coefficient de Gini est meilleur pour les données continues et l'entropie est meilleure pour les données de catégorie. Le coefficient de Gini minimise les erreurs de classification, tandis que l'entropie recherche une valeur de référence de manière exploratoire.

... Apparemment ... Cette fois, il y avait beaucoup de données sur les catégories telles que le sexe et le lieu d'embarquement, donc l'entropie peut être appropriée.

Ceci est également utile car il contient des informations détaillées sur l'arbre de décision. https://qiita.com/3000manJPY/items/ef7495960f472ec14377

Prédiction par apprentissage automatique (forêt aléatoire)


from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators = 10,max_depth=5,random_state = 0) #Créez une instance d'une forêt aléatoire.
clf = clf.fit(train_X , train_y) #Entraînez le modèle avec la méthode d'ajustement à l'aide des étiquettes et des données de l'enseignant
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

Des forêts aléatoires sont disponibles pour la classification (classificateur) et pour l'analyse de régression (régresseur). Cette fois, puisque le but est de classer s'il est vivant ou mort, nous l'utiliserons pour le classement.

J'ai essayé de déplacer les paramètres d'apprentissage et les arguments de la classe RandomForestClassifier tout en regardant cela. https://data-science.gr.jp/implementation/iml_sklearn_random_forest.html

Au fur et à mesure que j'augmentais n_estimators, le taux de précision augmentait. On dit que les n_estimateurs et époques utilisés dans les réseaux de neurones se retrouvent souvent en difficulté même s'ils sont calculés avec de grandes valeurs. Veuillez voir ci-dessous pour le contenu et les contre-mesures. https://amalog.hateblo.jp/entry/hyper-parameter-search

Sortie du résultat de la prédiction

D'après les résultats précédents, il a été constaté que le taux de réponse correcte est plus élevé dans la forêt aléatoire que dans l'arbre de décision. Par conséquent, nous avons décidé d'utiliser une forêt aléatoire cette fois.


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

#Conversion de variables catégorielles
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)

#Supprimer les colonnes inutiles
fin= fin.drop(['Cabin','Name','Ticket','PassengerId'],axis =1)
#Prédite dans une forêt aléatoire
predictions = clf.predict(fin)

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

004.png

C'était le 4900e / 16000e. Je voudrais me consacrer davantage.

Recommended Posts

(Kaggle) Prédiction des survivants du Titanic à l'aide d'un modèle utilisant des arbres de décision et des forêts aléatoires
Créez un modèle de prédiction de survie pour les passagers du Kaggle Titanic sans utiliser Python
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
[Kaggle] J'ai fait une collection de problèmes en utilisant le didacticiel Titanic