Dans ce TD, nous allons essentiellement travailler sur le prétraitement des données :
#On commence par importer les bons modules :
import pandas as pa
#pour pouvoir charger les données :
titanic = pa.read_csv('https://www.labri.fr/~zemmari/datasets/titanic.csv')
#et voir quelques lignes du contenu :
titanic.head()
#On peut aussi, si le dataset est bien formaté, afficher des informations sur ce même dataset :
titanic.info()
On observe que :
Que peut-on faire pour traiter ces données monquantes ?
Supprimer toutes les lignes où on est des données manquantes
titanic.dropna(inplace=True)
#vérifions :
titanic.info()
On voit que :
On supprime les lignes où toutes les entrées sont manquantes (how='all'), ou encore où au moins 4 entrées sont manquantes, etc
titanic.dropna(thresh=4,inplace=True)
titanic.info()
On voit clairement que Cabin pose problème. On la supprime tout simplement :
titanic.drop(['Cabin'], axis=1,inplace=True)
titanic.info()
A présent, nous allons traiter les données monquantes :
Pour l'age, on va remplacer les données manquantes par la moyenne des ages :
titanic.Age.fillna(titanic.Age.mean(),inplace=True)
titanic.info()
Pour Embarked, il s'agit d'une donnée catégorielle (non numérique), donc on ne peut pas utiliser la même stratégie.
On remplace les données manquantes par la valeur la plus courante (ce n'est pas grave ici car on n'a que deux valeurs monquantes:
titanic.Embarked.fillna(titanic.Embarked.mode()[0], inplace=True)
titanic.info()
Note : cet exercice est une adaptation du document (plus complet) disponible à l'adresse :
https://mrmint.fr/data-preprocessing-feature-scaling-python
La plupart du temps, les données des datasets sont exprimées dans des grandeurs différentes. Cela peut affecter négativement les performances de pas mal d'algorithmes de machine learning. Pour palier à ce problème, on applique en général des techniques dites de mise à l'echelle. Nous en avons vu deux en cours : la normalisation et la standarisation.
Dans la suite, nous allons utiliser la bibliothèque sklearn pour pré-traiter les données. Nous allons utiliser le dataset computer hardware dont une description détaillée est disponible à l'adresse suivante :
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/cpu-performance/machine.data'
names= ['constructor','Model','MYCT','MMIN','MMAX','CACH','CHMIN','CHMAX','PRP','ERP']
dataset = pa.read_csv(url, names=names)
dataset.head()
Nous allons nous intéresser aux deux attributs :
Vous pouvez déjà observer que les unités de mesure sont très différentes
Commençons par visualiser les données avant transformation :
plt.figure(figsize=(8,6))
figure, axe = plt.subplots()
plt.grid()
axe.scatter(dataset['MYCT'], dataset['MMAX'])
axe.set_title('Données avant transformation')
axe.set_xlabel('MYCT')
axe.set_ylabel('MMAX')
from sklearn.preprocessing import MinMaxScaler
minmax_scale = MinMaxScaler().fit(dataset[['MYCT', 'MMAX']])
df_minmax = minmax_scale.transform(dataset[['MYCT', 'MMAX']])
#imprimer un retour à la ligne pour une meilleur clarete de lecture
print('\n********** Normalisation*********\n')
print('Moyenne apres le Min max Scaling :\nMYCT={:.2f}, MMAX={:.2f}'
.format(df_minmax[:,0].mean(), df_minmax[:,1].mean()))
print('\n')
print('Valeur minimale et maximale pour la feature MYCT apres min max scaling: \nMIN={:.2f}, MAX={:.2f}'
.format(df_minmax[:,0].min(), df_minmax[:,0].max()))
print('\n')
print('Valeur minimale et maximale pour la feature MMAX apres min max scaling : \nMIN={:.2f}, MAX={:.2f}'
.format(df_minmax[:,1].min(), df_minmax[:,1].max()))
Affichons les données après normalisation :
figure, axe = plt.subplots()
plt.grid()
axe.scatter(dataset['MYCT'], dataset['MMAX'])
axe.set_title('Données avant transformation')
axe.set_xlabel('MYCT')
axe.set_ylabel('MMAX')
Attention : penser à recharger les données (ré-executer la bonne cellule de votre notebook).
from sklearn.preprocessing import StandardScaler
# Z-Score standardisation
std_scaler = StandardScaler().fit(dataset[['MYCT', 'MMAX']])
df_std = std_scaler.transform(dataset[['MYCT', 'MMAX']])
print('\n********** Standardisation*********\n')
print('Moyenne et Ecart type apres la standardisation de la feature MYCT :\nMoyenne={:.2f}, Ecart Type={:.2f}'
.format(df_std[:,0].mean(), df_std[:,0].std()))
print('\n')
print('Moyenne et Ecart type apres la standardisation de la feature MYCT :\nMoyenne={:.2f}, Ecart Type={:.2f}'
.format(df_std[:,1].mean(), df_std[:,1].std()))
print('\n')
print('Valeur minimale et maximale pour la feature MYCT apres min max scaling: \nMIN={:.2f}, MAX={:.2f}'
.format(df_std[:,0].min(), df_std[:,0].max()))
print('\n')
print('Valeur minimal et maximal pour la feature MMAX apres min max scaling : \nMIN={:.2f}, MAX={:.2f}'
.format(df_std[:,1].min(), df_std[:,1].max()))
print('Affichage des valeurs apres scaling')
print(df_std)