Kaggle : Commencer avec le Titanic ! (Partie 1)

Pour les « Kaggle killer » 75% au Titanic c’est pas terrible. Certes ! Néanmoins, pour ceux qui se lancent dans le Machine Learning et qui désirent sortir la tête de la théorie en utilisant un cas pratique, cette compétation kaggle est parfaitement adaptée. Bref, l’idée de cet article est de vous montrer au travers de ce cas pratique comment se lancer dans une compétition kaggle. Vous verrez c’est plutot sympa …et quand on y prend gout ! on laisse prendre au jeu.

Kaggle « Titanic: Machine Learning from Disaster »

La première chose à faire est de s’inscrire sur kaggle. pour ceux qui ne connaissent pas Kaggle c’est « The place to be » des Data Scientistes. vous  trouverez un tas de compétitions plus passionantes les unes des autres, des tutos, des formations en ligne, des forums. Bref, c’est un must si vous vous lancez dans le machine Learning !

Une fois inscrit, sélectionnez l’onglet « Competition » et recherchez titanic. Sélectionnez la première entrée (« Titanic: Machine Learning from Disaster ») comme dans l’écran ci-dessous :

Maintenant sélectionnez l’onglet data et téléchargez les fichiers csv. Vous en avez trois :

  • train.csv pour entrainer votre modèle (celui-ci contient les libellés : Survived)
  • test.csv pour calculer le résultat à partir de votre modèle (celui-ci ne contient PAS les libellés : Survived)
  • gender_submission.csv : qui vous montre le résultat attendu (format) par kaggle

Ca y est vous êtes pret pour vous lancer dans votre 1er projet (?) de Machine learning !

Préparation du Modèle

Avant tout nous allons travailler sur le jeu d’entrainement (train.csv). Voici les variables sur lesquelles on peut commencer de travailler simplement :

  • Le sexe (Sex) : les données de cette caractéristiques sont catégorielles et ne présentent que deux valeurs (male ou female). Nous allons numériser cette variable via get_dummies (Cf. article One-hot)
  • La Cabine (Cabin): A priori la première lettre de la cabine propose le pont, c’est un élément interressant …
  • L’Age (Age): évidemment un élément primordial. Ne dit-on pas « les femmes et les enfants d’abord ? » Mais, attention, car cette variable n’est pas toujours renseignée. Je propose donc dans un premier temps de remplacer les valeurs Nulles (NaN) par la moyenne d’age des autres passagers.
  • L’embarquement (Embarked)
  • Le prix du ticket (Fare)
  • La classe (Class) : il semblerait que tous les passagers n’aient pas été logés à la même enseigne !
  • Nombre d’époux/femmes (SibSp)

Afin de bien préparer le modèle et surtout de pouvoir réutiliser les préparations effectuées sur le jeu d’entrainement, je recommandede faire une fonction globale de préparation.

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import MinMaxScaler

train = pd.read_csv("./data/train.csv")
test = pd.read_csv("./data/test.csv")

def dataprep(data):
    sexe = pd.get_dummies(data['Sex'], prefix='sex')
    cabin = pd.get_dummies(data['Cabin'].fillna('X').str[0], prefix='Cabin')
    # Age
    age = data['Age'].fillna(data['Age'].mean())
    emb = pd.get_dummies(data['Embarked'], prefix='emb')
    # Prix du billet / Attention une donnée de test n'a pas de Prix !
    faresc = pd.DataFrame(MinMaxScaler().fit_transform(data[['Fare']].fillna(0)), columns = ['Prix'])
    # Classe
    pc = pd.DataFrame(MinMaxScaler().fit_transform(data[['Pclass']]), columns = ['Classe'])

    dp = data[['SibSp']].join(pc).join(sexe).join(emb).join(faresc).join(cabin).join(age)
    return dp

A ce moment là il se passe quelque chose d’interressant. Un problème classique qu’il faut gérer sans quoi rien ne fonctionnera ! En effet les données sur la variable catégorielle « Cabin » du jeu de tests ne proposent pas les mêmes valeurs que celles du jeu d’entrainement. Du coup la fonction get_dummies ne renverra pas les mêmes valeurs pour les deux jeux de données ! En l’occurence, nous n’avons aucune cabine commençant par la lettre T dans notre jeu de test.

C’est un véritable problème auquel nous allons donner une solution radicale dans ce cas ci : retirer carément la colonne Cabin_T !

Xtrain = dataprep(train)
# remove the Cabin with T value as this does not exist in the test dataset !
del Xtrain['Cabin_T']
Xtest = dataprep(test)

Entrainons notre Modèle

Pour ce premier test nous utiliserons un algorithme de Random Forest. Entrainons le :

y = train.Survived
rf = RandomForestClassifier(n_estimators=100, random_state=0, max_features=2)
rf.fit(Xtrain, y)
p_tr = rf.predict(Xtrain)
print ("Score Train -- ", round(rf.score(Xtrain, y) *100,2), " %")

Nous obtenons un score de 93,27%, ce qui parait plutot honorable n’est-ce pas ?

Appliquons maintenant notre modèle entrainé sur le jeu de test :

p_test = rf.predict(Xtest)

Formattage des données pour Kaggle

N’oublions pas que Kaggle attend le résultat de vos prédiction dans un format particulier. Il faut donc formatter et ecrire dans un fichier dans ce format :

  • Colonne 1 : PassengerId
  • Colonne 2 : Survived (1 ou 0)

La librairie Pandas vous facilite la vie ici :

result = pd.DataFrame(test['PassengerId'])
pred = pd.DataFrame(p_test, columns=['Survived'])
result = result.join(pred)
result.to_csv("./data/result.csv", columns=["PassengerId", "Survived"], index=False)

Allez maintenant sur kaggle.com et soumettez votre résultat en cliquant sur Submit Predictions :

Uploadez ensuite votre fichier result.csv (le nom du fichier n’a pas d’importance) et obtenez un score de démarrage de 0.75598 !

Maintenant c’est à vous de retravailler les données pour améliorer ce score 🙂

Partager cet article

4 Replies to “Kaggle : Commencer avec le Titanic ! (Partie 1)”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.