Code source de KaggleModel

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
""" Transformation des données.

Ce script permet de lire les données des deux fichiers
`train.csv <../../train.csv>`_, `test.csv <../../test.csv>`_
et de les transformer en matrics de flottants.

Conversion
----------
Les données lues depuis ces deux fichiers sont sous formes
de numpy.array de **strings**.
On doit les convertir en **float** pour apprendre.

Les deux difficultés sont pour le port d'embarcation et le genre.
On convertit : 'male' et 'female' en nombre (1 ou 0).

Seulement, pour ces attributs, le problème sous-jacent est de la
classification (un passager est un homme **OU** une femme),
pas de régression (un passager n'est pas 71% une femme...).

Malgré ça, le fait qu'il y a de nombreux autres attributs
fait qu'on pourra quand même passer nos données à notre algorithme
de classification,
sans que la présence de deux attributs "catégoricaux" et non numériques
ne le perturbe.

:Source: `doc de scikit-learn <http://scikit-learn.org/>`_

Complétion
----------
Le problème principal est le manque de certaines données.

Par exemple, 20% des passengers n'ont pas d'âge dans l'ensemble
d'apprentissage.

Et quelques passengers n'ont pas de "prix de tickets" dans l'ensemble
de test.

On completera donc simplement par la *valeur moyenne* de cet
attribut. Cette valeur est calculée dans le script `Kaggle <Kaggle.html>`_.
"""
__author__	= 'Lilian BESSON (mailto:lilian.besson[AT]normale.fr)'

from Kaggle import *
from sklearn.utils import shuffle

################################################################################
#: Load in the csv file
print("Opening the file 'train.csv' and 'test.csv'...")
csv_file_object = csv.reader(open('train.csv', 'rb')) 
test_file_object = csv.reader(open('test.csv', 'rb'))

#: Skip the fist line as it is a header
header = csv_file_object.next()
header = test_file_object.next()

#: Table of translation: strings -> float, for the gender
table_sex = {'male':1, 'female':0}
#: Table of translation: strings -> float, for the port
table_embarked = {'C':0, 'S':1, 'Q':2}

# Building the train dataset
train_data = []
for row in csv_file_object:
    row_dict = {}
    row_dict[survived] = int(row[survived])
    for attr in [pclass, sibsp, parch]:
     row_dict[attr] = int(row[attr])

    row_dict[fare] = float(row[fare])/float(fare_max) if row[fare]!='' else fare_mean/fare_max
    row_dict[embarked] = table_embarked[row[embarked]] if row[embarked]!='' else table_embarked['S']
    row_dict[age] = float(row[age])/float(age_max) if row[age]!='' else age_mean/age_max
    row_dict[sex] = table_sex[row[sex]] if row[sex]!='' else table_sex['male']

    train_data.append(row_dict.values()) # adding each row to the data variable

#data_attributes = ['pclass', 'sibsp', 'parch', 'fare', 'embarked', 'age', 'sex']
data_attributes = [ names_columns_train[i] for i in row_dict.keys() ]

#: Then convert from a list to an array of float numbers !
train_data = np.array(train_data)#.astype(np.float)
train_data = shuffle(train_data) # Bizarre: semble pas changer grand chose, meme pour l'affichage.

# Building the test dataset
test_data = []
for row in test_file_object:
    row_dict = {}
    for attr in [pclass, sibsp, parch]:
     row_dict[attr] = int(row[attr-1])

    row_dict[fare] = float(row[fare-1])/float(fare_max) if row[fare-1]!='' else fare_mean/fare_max
    row_dict[embarked] = table_embarked[row[embarked-1]] if row[embarked-1]!='' else table_embarked['S']
    row_dict[age] = float(row[age-1])/float(age_max) if row[age-1]!='' else age_mean/age_max
    row_dict[sex] = table_sex[row[sex-1]] if row[sex-1]!='' else table_sex['male']

    test_data.append(row_dict.values())

#: Then convert from a list to an array of float numbers !
test_data = np.array(test_data)#.astype(np.float)

# Now the dataset is converted to floats and filled !