[PYTHON] Essayez le didacticiel Titanic de Kaggle

J'ai essayé le didacticiel Titanic de Kaggle. Enregistrez le code sur le Jupyter NoteBook ici pour apprendre à utiliser Pandas et scikit-learn.

Kaggle est un site qui concourt pour le score par apprentissage automatique basé sur des données réelles.

C'est un excellent moyen d'étudier l'apprentissage automatique, car il existe des didacticiels que vous pouvez utiliser pour l'apprentissage automatique sans avoir à participer au concours.

Pour plus d'informations sur l'utilisation de Kaggle et du didacticiel Titanic [Introduction aux débutants de Kaggle] Qui survivra au Titanic? Je l'ai mentionné.

Mon code a été modifié pour me faciliter la compréhension, en me référant à l'article ci-dessus.

Lorsque vous vous inscrivez en tant qu'utilisateur avec Kaggle Titanic: Machine Learning from Disaster | Kaggle Vous pourrez télécharger les données depuis.

L'algorithme est un arbre de décision.

Après ça, Installation et démarrage faciles de Jupyter Notebook à l'aide de Docker (prend également en charge nbextensions et Scala) --Qiita Je suis en train de l'essayer dans l'environnement de Jupyter Notebook préparé selon.

Dans cet environnement Jupyter, vous pouvez accéder au port 8888 avec un navigateur et utiliser Jupyter Notebook. Vous pouvez ouvrir une nouvelle note en suivant Nouveau> Python 3 sur le bouton en haut à droite.

Préparation des données

import numpy as np
import pandas as pd
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

train et test sont des objets DataFrame.

image.png

Concaténez les données une fois pour prétraiter les données en commun avec «train» et «test». Je vais mettre un drapeau pour que je puisse le diviser à nouveau plus tard. De plus, la colonne Survived est uniquement incluse dans train, supprimez-la donc une fois.

train["is_train"] = 1
test["is_train"] = 0
data = pd.concat([train.drop(columns=["Survived"]), test])

train.drop (columns = [" Survived "]) renvoie un nouvel objet DataFrame avec les colonnes supprimées. Il renvoie un nouvel objet, donc la colonne reste dans le train d'origine. C'est la même chose même si vous écrivez train.drop ([" Survived "], axis = 1). ʻAxis = 1` est un indicateur pour supprimer des colonnes au lieu de lignes. Cependant, le premier est plus facile à comprendre.

pd.concat renvoie un nouveau DataFrame qui est une concaténation de plusieurs DataFrames. Au fait, si vous passez ʻaxis = 1 à pd.concat`, il sera connecté horizontalement.

À la suite de la concaténation, les données seront comme ceci. 1309 lignes de données.

image.png

Prend en charge les données manquantes

Vérifiez l'état des données manquantes. La partie affichée comme NaN dans l'écran ci-dessus est manquante dans la partie qui était vide dans le fichier CSV d'origine.

data.isnull().sum()

image.png

Vous pouvez vérifier le type de données dont vous disposez et la valeur médiane avec le code ci-dessous.

data["Age"].unique()
data["Age"].median()

Je mettrai la valeur médiane dans la partie manquante de l'item ʻAge`.

data["Age"] = data["Age"].fillna(data["Age"].median())

Vérifiez quelles données sont dans ʻEmbarked`. Vous pouvez vérifier le nombre d'enregistrements pour chaque donnée.

data["Embarked"].value_counts()

image.png

Il semble que S occupe la majeure partie de ʻEmbarked, donc je vais mettre S` dans la partie manquante.

data["Embarked"] = data["Embarked"].fillna("S")
data.isnull().sum()

Convertir les données de chaîne en nombres

Ensuite, convertissez les éléments «Sex» et «Embarked» qui sont des chaînes en nombres.

ʻEmbarked` n'avait que 3 modèles de S, C et Q, donc j'aimerais le convertir comme ça. C'est ce qu'on appelle le codage à chaud.

Embarked
S
S
C
Q

Embarked_C Embarked_Q Embarked_S
0 0 1
0 0 1
1 0 0
0 1 0

L'encodage à chaud peut être fait avec une fonction appelée pd.get_dummies. Le code pd.get_dummies (data [" Embarked "], prefix =" Embarked ")] produit un DataFrame à trois colonnes: ʻEmbarked_S, ʻEmbarked_C, ʻEmbarked_Q`. L'une des trois colonnes est 1 et les autres sont 0. Concaténez-le horizontalement avec les données d'origine et supprimez la colonne d'origine «Embarqué».

data = pd.concat([data, pd.get_dummies(data["Embarked"], prefix="Embarked")], axis=1).drop(columns=["Embarked"])

Puisque "Sex" n'avait que "male" et "female", il n'est pas nécessaire d'avoir deux colonnes, une colonne de 0, 1 suffit.

Sex
male
female
female

Sex
1
0
0

Il semble que l'ajout de l'option drop_first = True à pd.get_dummies supprime la première colonne et ne laisse qu'une seule colonne en conséquence.

data["Sex"] = pd.get_dummies(data["Sex"], drop_first=True)

Des deux colonnes générées par pd.get_dummies, la première colonne était une femme, donc homme était 1 et femme 0. Je pense que peu importe lequel.

Le résultat est ce type de données.

image.png

Divisez à nouveau les «données» prétraitées en données d'entraînement et en données de vérification, et limitez-vous aux seules colonnes utilisées cette fois.

feature_columns =["Pclass", "Sex", "Age", "Embarked_C", "Embarked_Q", "Embarked_S"]
feature_train = data[data["is_train"] == 1].drop(columns=["is_train"])[feature_columns]
feature_test = data[data["is_train"] == 0].drop(columns=["is_train"])[feature_columns]

La variable objective n'était pas incluse dans "data", donc extrayez-la du premier "train".

target_train = train["Survived"]

Apprentissage

Apprenez le modèle.

from sklearn import tree
model = tree.DecisionTreeClassifier()
model.fit(feature_train, target_train)

référence sklearn.tree.DecisionTreeClassifier — scikit-learn 0.21.3 documentation

Voyons le taux de réponse correct avec les données d'entraînement.

from sklearn import metrics
pred_train = model.predict(feature_train)
metrics.accuracy_score(target_train, pred_train)

J'ai "0.9001122334455668". 90% semble être la bonne réponse.

Évaluation

Enregistrons le résultat de l'inférence dans Kaggle et évaluons-le.

Tout d'abord, enregistrez le résultat de l'estimation avec les données de vérification dans my_prediction.csv.

pred_test = model.predict(feature_test)
my_prediction = pd.DataFrame(pred_test, test["PassengerId"], columns=["Survived"])
my_prediction.to_csv("my_prediction.csv", index_label=["PassengerId"])

La première ligne du fichier CSV est la ligne d'en-tête, qui est «PassengerId, Survived».

Si vous téléchargez ce fichier sur le site de Kaggle, il vous donnera un score.

image.png

C'était "0,74641".

Recommended Posts

Essayez le didacticiel Titanic de Kaggle
Essayez tous les modèles de scikit-learn avec le Titanic de Kaggle (kaggle ⑤)
Kaggle Tutorial Titanic Précision 80.9% (Top 7% 0.80861)
Certains modèles de Kaggle's Titanic (kaggle ④)
Prédire le Titanic de Kaggle avec Keras (Kaggle ⑦)
Essayez le tutoriel officiel de Django depuis le début
Prédiction des survivants à l'aide du réseau neuronal titanesque de Kaggle [80,8%]
Vérifiez les données brutes avec Kaggle's Titanic (Kaggle ⑥)
Prédiction de survivant utilisant le boost de xg titanesque de Kaggle [80,1%]
Vérifiez la corrélation avec le Titanic de Kaggle (kaggle③)
Analyse des données avant la génération de fonctionnalités titanesques de Kaggle