In [59]:
% matplotlib inline
from __future__ import print_function

Traitement de données classique

Nous allons voir dans cet exemple comment utiliser la bibliothèque numpy pour récupérer des valeurs dans un fichier csv et commencer à les traiter. Nous allons utiliser le module csv qui permet de lire un fichier csv et d'en extraire les valeurs lignes par lignes.

Nous allons travailler sur le fichier de données d'entraînement du Titanic. Le but est de prédire les chance de survie à bord du bateau. Il faut récupérer le fichier train.csv (voir le premier cours ou téléchargez le depuis https://www.kaggle.com/c/titanic-gettingStarted/data ) et le sauvegarder dans le répertoire dans lequel le notebook s'éxecute. Vous pouvez utiliser la commande pwd pour connaître ce répertoire. Sinon, vous pouvez déplacer le répertoire courant pour rejoindre l'endroit où vous avez sauvegardé votre fichier avec la commande cd.


In [61]:
import csv
import numpy as np

fichier_csv = csv.reader(open('train.csv', 'r'))
entetes = fichier_csv.__next__()  # on récupère la première ligne qui contient les entetes
donnees = list()              # on crée la liste qui va servir à récupérer les données

for ligne in fichier_csv:     # pour chaque ligne lue dans le fichier csv
    donnees.append(ligne)     # on ajoute les valeurs lues dans le tableau donness
#entete = donnees[0]
#donnees[0] = []
donnees = np.array(donnees)   # le tableau donnees est transformé en numpy array

Regardons comment sont stockées les données en mémoire:


In [62]:
print (donnees)


[['1' '0' '3' ..., '7.25' '' 'S']
 ['2' '1' '1' ..., '71.2833' 'C85' 'C']
 ['3' '1' '3' ..., '7.925' '' 'S']
 ..., 
 ['889' '0' '3' ..., '23.45' '' 'S']
 ['890' '1' '1' ..., '30' 'C148' 'C']
 ['891' '0' '3' ..., '7.75' '' 'Q']]

Regardons maintenant la colonne de l'âge, n'affichons que les 15 premières valeurs:


In [63]:
print (donnees[1:15, 5])


['38' '26' '35' '35' '' '54' '2' '27' '14' '4' '58' '20' '39' '14']

On peut donc remarquer que les âges sont stockés comme des chaîne de caractères. Transformons les en réels :


In [76]:
donnees[1:15, 5].astype(np.int)


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-76-be34d37a487c> in <module>()
----> 1 donnees[1:15, 5].astype(np.int)

ValueError: invalid literal for int() with base 10: ''

Numpy ne sait pas convertir la chaîne de caractère vide '' (en 6e position dans notre liste) en réels. Pour traiter ces données, il faudrait écrire un petit algorithme. Nous allons voir comment on peut utiliser pandas pour faire ces traitements beaucoup plus facilement.

Traiter et manipuler les données avec pandas


In [14]:
import pandas as pd
import numpy as np

Pour lire le fichier csv nous allons utiliser la fonction read_csv


In [15]:
df = pd.read_csv('train.csv')

Pour vérifier si cela a bien fonctionné, affichons les premières valeurs. On voit apparaître l'identifiant du passager, s'il a survécu, sa classe, son nom, son sexe, son âge, le nombre de frères/soeurs/époux/épouse sur le bâteau, le nombre de parents ou d'enfants, le numéro de ticket, le prix, le numéro de cabine et le port d'embarquement.


In [16]:
df.head(6)


Out[16]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q

Comparons le type de donnees, obtenu précédemment. C'est un numpy array. Le type de df est un objet spécifique à pandas.


In [17]:
type(donnees)


Out[17]:
numpy.ndarray

In [18]:
type(df)


Out[18]:
pandas.core.frame.DataFrame

Nous avions vu qu'avec numpy, toutes les valeurs importées étaient des chaînes de caractères. Vérifions ce qu'il en est avec pandas


In [19]:
df.dtypes


Out[19]:
PassengerId      int64
Survived         int64
Pclass           int64
Name            object
Sex             object
Age            float64
SibSp            int64
Parch            int64
Ticket          object
Fare           float64
Cabin           object
Embarked        object
dtype: object

On peut voir que Pandas a détecté automatiquement le types des données de notre fichier csv: soit des entiers, soit des réels, soit des objets (chaînes de caractères). Il y a deux commandes importantes à connaître, c'est df.info() et df.describe()


In [20]:
df.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB

L'âge n'est pas renseigné pour tous les passagers, seulement pour 714 passagers sur 891. Idem pour le numéro de cabine et le port d'embarquement. On peut également utiliser describe() pour calculer plusieurs indicateurs statistiques utiles.


In [21]:
df.describe()


Out[21]:
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200

On peut voir que pandas a calculé automatiquement les indicateurs statistiques en tenant compte uniquement des données renseignées. Par exemple, il a calculé la moyenne d'âge uniquement sur les 714 valeurs connues. pandas a laissé de coté les valeurs non-numériques (nom, sexe, ticket, cabine, port d'embarquement).

Pour aller un peu plus loin avec pandas

Référencement et filtrage

Pour afficher uniquement les 15 premières valeurs de la colonne âge :


In [22]:
df['Age'][0:15]


Out[22]:
0     22.0
1     38.0
2     26.0
3     35.0
4     35.0
5      NaN
6     54.0
7      2.0
8     27.0
9     14.0
10     4.0
11    58.0
12    20.0
13    39.0
14    14.0
Name: Age, dtype: float64

On peut également utiliser la syntaxe


In [23]:
df.Age[0:15]


Out[23]:
0     22.0
1     38.0
2     26.0
3     35.0
4     35.0
5      NaN
6     54.0
7      2.0
8     27.0
9     14.0
10     4.0
11    58.0
12    20.0
13    39.0
14    14.0
Name: Age, dtype: float64

On peut calculer des critères statistiques directement sur les colonnes


In [24]:
df.Age.mean()


Out[24]:
29.69911764705882

On peut voir que c'est la même valeur que celle affichée dans describe. Cette syntaxe permet d'utiliser facilement la valeur de la moyenne dans des calculs ou des algorithmes.

Pour filtrer les données, on va passer la liste de colonnes désirées:


In [25]:
colonnes_interessantes = ['Sex', 'Pclass', 'Age']
df[ colonnes_interessantes ]


Out[25]:
Sex Pclass Age
0 male 3 22.0
1 female 1 38.0
2 female 3 26.0
3 female 1 35.0
4 male 3 35.0
5 male 3 NaN
6 male 1 54.0
7 male 3 2.0
8 female 3 27.0
9 female 2 14.0
10 female 3 4.0
11 female 1 58.0
12 male 3 20.0
13 male 3 39.0
14 female 3 14.0
15 female 2 55.0
16 male 3 2.0
17 male 2 NaN
18 female 3 31.0
19 female 3 NaN
20 male 2 35.0
21 male 2 34.0
22 female 3 15.0
23 male 1 28.0
24 female 3 8.0
25 female 3 38.0
26 male 3 NaN
27 male 1 19.0
28 female 3 NaN
29 male 3 NaN
... ... ... ...
861 male 2 21.0
862 female 1 48.0
863 female 3 NaN
864 male 2 24.0
865 female 2 42.0
866 female 2 27.0
867 male 1 31.0
868 male 3 NaN
869 male 3 4.0
870 male 3 26.0
871 female 1 47.0
872 male 1 33.0
873 male 3 47.0
874 female 2 28.0
875 female 3 15.0
876 male 3 20.0
877 male 3 19.0
878 male 3 NaN
879 female 1 56.0
880 female 2 25.0
881 male 3 33.0
882 female 3 22.0
883 male 2 28.0
884 male 3 25.0
885 female 3 39.0
886 male 2 27.0
887 female 1 19.0
888 female 3 NaN
889 male 1 26.0
890 male 3 32.0

891 rows × 3 columns

En analyse, on est souvent intéressé par filtrer les données en fonction de certains critères. Par exemple, l'âge maximum est 80 ans. On peut examiner les informations relatives aux personnes âgées :


In [26]:
df[df['Age'] > 60]


Out[26]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
33 34 0 2 Wheadon, Mr. Edward H male 66.0 0 0 C.A. 24579 10.5000 NaN S
54 55 0 1 Ostby, Mr. Engelhart Cornelius male 65.0 0 1 113509 61.9792 B30 C
96 97 0 1 Goldschmidt, Mr. George B male 71.0 0 0 PC 17754 34.6542 A5 C
116 117 0 3 Connors, Mr. Patrick male 70.5 0 0 370369 7.7500 NaN Q
170 171 0 1 Van der hoef, Mr. Wyckoff male 61.0 0 0 111240 33.5000 B19 S
252 253 0 1 Stead, Mr. William Thomas male 62.0 0 0 113514 26.5500 C87 S
275 276 1 1 Andrews, Miss. Kornelia Theodosia female 63.0 1 0 13502 77.9583 D7 S
280 281 0 3 Duane, Mr. Frank male 65.0 0 0 336439 7.7500 NaN Q
326 327 0 3 Nysveen, Mr. Johan Hansen male 61.0 0 0 345364 6.2375 NaN S
438 439 0 1 Fortune, Mr. Mark male 64.0 1 4 19950 263.0000 C23 C25 C27 S
456 457 0 1 Millet, Mr. Francis Davis male 65.0 0 0 13509 26.5500 E38 S
483 484 1 3 Turkula, Mrs. (Hedwig) female 63.0 0 0 4134 9.5875 NaN S
493 494 0 1 Artagaveytia, Mr. Ramon male 71.0 0 0 PC 17609 49.5042 NaN C
545 546 0 1 Nicholson, Mr. Arthur Ernest male 64.0 0 0 693 26.0000 NaN S
555 556 0 1 Wright, Mr. George male 62.0 0 0 113807 26.5500 NaN S
570 571 1 2 Harris, Mr. George male 62.0 0 0 S.W./PP 752 10.5000 NaN S
625 626 0 1 Sutton, Mr. Frederick male 61.0 0 0 36963 32.3208 D50 S
630 631 1 1 Barkworth, Mr. Algernon Henry Wilson male 80.0 0 0 27042 30.0000 A23 S
672 673 0 2 Mitchell, Mr. Henry Michael male 70.0 0 0 C.A. 24580 10.5000 NaN S
745 746 0 1 Crosby, Capt. Edward Gifford male 70.0 1 1 WE/P 5735 71.0000 B22 S
829 830 1 1 Stone, Mrs. George Nelson (Martha Evelyn) female 62.0 0 0 113572 80.0000 B28 NaN
851 852 0 3 Svensson, Mr. Johan male 74.0 0 0 347060 7.7750 NaN S

Comme on a trop d'informations, on peut les filtrer:


In [27]:
df[df['Age'] > 60][['Pclass', 'Sex', 'Age', 'Survived']]


Out[27]:
Pclass Sex Age Survived
33 2 male 66.0 0
54 1 male 65.0 0
96 1 male 71.0 0
116 3 male 70.5 0
170 1 male 61.0 0
252 1 male 62.0 0
275 1 female 63.0 1
280 3 male 65.0 0
326 3 male 61.0 0
438 1 male 64.0 0
456 1 male 65.0 0
483 3 female 63.0 1
493 1 male 71.0 0
545 1 male 64.0 0
555 1 male 62.0 0
570 2 male 62.0 1
625 1 male 61.0 0
630 1 male 80.0 1
672 2 male 70.0 0
745 1 male 70.0 0
829 1 female 62.0 1
851 3 male 74.0 0

On peut voir que parmis les persones âges, il y a principalement des hommes. Les personnes qui ont survécues était principalement des femmes.

Nous allons maintenant voir comment traiter les valeurs manquantes pour l'âge. Nous allons filtrer les données pour afficher uniquement les valeurs manquantes


In [28]:
df[df.Age.isnull()][['Sex', 'Pclass', 'Age']]


Out[28]:
Sex Pclass Age
5 male 3 NaN
17 male 2 NaN
19 female 3 NaN
26 male 3 NaN
28 female 3 NaN
29 male 3 NaN
31 female 1 NaN
32 female 3 NaN
36 male 3 NaN
42 male 3 NaN
45 male 3 NaN
46 male 3 NaN
47 female 3 NaN
48 male 3 NaN
55 male 1 NaN
64 male 1 NaN
65 male 3 NaN
76 male 3 NaN
77 male 3 NaN
82 female 3 NaN
87 male 3 NaN
95 male 3 NaN
101 male 3 NaN
107 male 3 NaN
109 female 3 NaN
121 male 3 NaN
126 male 3 NaN
128 female 3 NaN
140 female 3 NaN
154 male 3 NaN
... ... ... ...
718 male 3 NaN
727 female 3 NaN
732 male 2 NaN
738 male 3 NaN
739 male 3 NaN
740 male 1 NaN
760 male 3 NaN
766 male 1 NaN
768 male 3 NaN
773 male 3 NaN
776 male 3 NaN
778 male 3 NaN
783 male 3 NaN
790 male 3 NaN
792 female 3 NaN
793 male 1 NaN
815 male 1 NaN
825 male 3 NaN
826 male 3 NaN
828 male 3 NaN
832 male 3 NaN
837 male 3 NaN
839 male 1 NaN
846 male 3 NaN
849 female 1 NaN
859 male 3 NaN
863 female 3 NaN
868 male 3 NaN
878 male 3 NaN
888 female 3 NaN

177 rows × 3 columns

Pour combiner des filtres, on peut utiliser '&'. Affichons le nombre d'hommes dans chaque classe


In [34]:
for i in range(1, 4):
    print ("Dans la classe", i, ", il y a", len( df[ (df['Sex'] == 'male') & (df['Pclass'] == i) ]), "hommes")
    print ("Dans la classe", i, ", il y a", len( df[ (df['Sex'] == 'female') & (df['Pclass'] == i) ]), "femmes")


Dans la classe 1 , il y a 122 hommes
Dans la classe 1 , il y a 94 femmes
Dans la classe 2 , il y a 108 hommes
Dans la classe 2 , il y a 76 femmes
Dans la classe 3 , il y a 347 hommes
Dans la classe 3 , il y a 144 femmes

Visualisons maintenant l'histogramme de répartition des âges.


In [32]:
df.Age.hist(bins=20, range=(0,80))


Out[32]:
<matplotlib.axes._subplots.AxesSubplot at 0x113919a90>

Créations et modifications des colonnes

Pour pouvoir exploiter les informations sur le sexe des personnes, nous allons ajouter une nouvelle colonne, appellée genre, qui vaudra 1 pour les hommes et 0 pour les femmes.


In [35]:
df['Gender'] = 4 # on ajoute une nouvelle colonne dans laquelle toutes les valeurs sont à 4
df.head()


Out[35]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Gender
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 4
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 4
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 4
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 4
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 4

In [36]:
df['Gender'] = df['Sex'].map( {'female': 0, 'male': 1} ) # la colonne Gender prend 0 pour les femmes et 1 pour les hommes
df.head()


Out[36]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Gender
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 1
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 0
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 0
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 0
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 1

Pour créer et renommer de nouvelles colonnes, on peut également agréger des informations issues de différentes colonnes. Créons par exemple une colonne pour stocker les nombre de personnes de la même famille à bord du Titanic.


In [37]:
df['FamilySize'] = df.SibSp + df.Parch
df.head()


Out[37]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Gender FamilySize
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 1 1
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 0 1
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 0 0
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 0 1
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 1 0

Nous allons remplir les valeurs manquantes de l'âge avec la valeur médiane dépendant de la classe et du sexe.


In [38]:
ages_medians = np.zeros((2, 3))
ages_medians


Out[38]:
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

In [39]:
for i in range(0,2):
    for j in range(0,3):
        ages_medians[i,j] = df[ (df['Gender'] == i) & (df['Pclass'] == j+1) ]['Age'].median()
        
ages_medians


Out[39]:
array([[ 35. ,  28. ,  21.5],
       [ 40. ,  30. ,  25. ]])

On va créer une nouvelle colonne AgeFill qui va utiliser ces âges médians


In [40]:
for i in range(0, 2):
    for j in range (0, 3):
        df.loc[ (df.Age.isnull()) & (df.Gender == i) & (df.Pclass == j+1), 'AgeFill'] = ages_medians[i,j]

# pour afficher les 10 premières valeurs qui sont complétées
df [df.Age.isnull()][['Gender', 'Pclass', 'Age', 'AgeFill']].head(10)


Out[40]:
Gender Pclass Age AgeFill
5 1 3 NaN 25.0
17 1 2 NaN 30.0
19 0 3 NaN 21.5
26 1 3 NaN 25.0
28 0 3 NaN 21.5
29 1 3 NaN 25.0
31 0 1 NaN 35.0
32 0 3 NaN 21.5
36 1 3 NaN 25.0
42 1 3 NaN 25.0

Pour sauvegarder votre travail, vous pouvez utiliser le module pickle qui compresse et sauvegarde vos données :


In [56]:
import pickle

f = open('masauvegarde.pck', 'wb')
pickle.dump(df, f)
f.close()

Pour récuperer votre travail, on utilise l'opération inverse, toujours avec pickle


In [58]:
with open('masauvegarde.pck', 'rb') as f:
    dff = pickle.load(f)

Retour à numpy pour l'apprentissage

Pour faire de l'apprentissage, et prédire la survie des passagers du Titanic, on peut utiliser scikit-learn. Ce dernier prend en entrée des données sous forme de numpy array, la conversion se fait simplement :


In [43]:
ex = df[ ['Gender', 'Pclass'] ] # on choisit seulement quelques features.
X = ex.as_matrix() # on convertit en numpy array
print(ex.head(5))
print(X[:5,:])


   Gender  Pclass
0       1       3
1       0       1
2       0       3
3       0       1
4       1       3
[[1 3]
 [0 1]
 [0 3]
 [0 1]
 [1 3]]

On cherche à prévoir la survie, on extrait donc l'information utile :


In [44]:
y = df['Survived'].as_matrix()
print (y[:5])


[0 1 1 1 0]

In [45]:
from sklearn import svm

clf = svm.SVC()
clf.fit(X,y)


Out[45]:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)

L'apprentissage du classifieur est fait, c'est-à-dire que nous avons entraîné une SVM sur nos données $X$ pour qu'elle soit capable de prédire la survie $y$. Pour vérifier que notre SVM a bien appris à prédire la survie des passagers, nous pouvons utiliser la méthode predict() et comparer visuellement pour les dix premières valeurs prédite par la SVM et la survie réelle des passagers.


In [46]:
print(clf.predict(X[:10,:]))
print (y[:10])


[0 1 1 1 0 0 0 0 1 1]
[0 1 1 1 0 0 0 0 1 1]

La SVM a bien appris à prédire ce que nous lui avons montré. Cela ne permet pas cependant d'évaluer sa capacité à généraliser à des cas qu'elle n'a pas vu. Pour ce faire, une approche classique est de faire de la validation croisée, c'est à dire qu'on entraîne le classifieur sur une partie des données et qu'on le teste sur une autre. Scikit-learn en donne une implémentation très simple d'utilisation.


In [51]:
from sklearn import cross_validation

scores = cross_validation.cross_val_score(clf, X, y, cv=7)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))


Accuracy: 0.77 (+/- 0.04)

Sur les 7 partitions de nos données, la SVM prédit la survie des passagers dans 77% des cas, avec un écart-type de 0,04.

Pour améliorer les résultats, nous pouvons rajouter l'âge dans les features. Il faut cependant faire attention aux valeurs non-renseignées NaN, nous allons donc utiliser une nouvelle colonne AgeFilled avec l'âge ou la médiane.


In [52]:
df['AgeFilled'] = df.Age # on recopie la colonne Age
df.loc[df.AgeFilled.isnull(), 'AgeFilled'] = df[df.Age.isnull()]['AgeFill'] # on met l'age médian pour les valeurs non renseignées

Nous pouvons maintenant créer un nouveau $X$ incluant l'âge, en plus du sexe et de la classe, et vérifier si cela améliore les performances de la SVM.


In [54]:
X = df[['Gender', 'Pclass', 'AgeFilled']].as_matrix()

scores = cross_validation.cross_val_score(svm.SVC(), X, y, cv=7)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))


Accuracy: 0.79 (+/- 0.08)

Nous pouvons constater que les performances sont légèrement meilleures. Mais comme l'écart-type a également grandi, il n'est pas possible de conclure sur la significativité de cet apport. Il est facilement possible d'améliorer ce score de prédiction, n'hésitez pas à consulter la page kaggle qui y est consacrée.

Une analyse intéressante, avec de bons résultats en prédiction est disponible ici

Ce notebook est une adaptation de celui proposé sur la page kaggle : https://www.kaggle.com/c/titanic-gettingStarted/details/getting-started-with-python-ii