Master 2 MIAGE, Université de Bordeaux

IA & données

TD 2 : Preprocessing

Dans ce TD, nous allons essentiellement travailler sur le prétraitement des données :

  • charger les données,
  • explorer les données,
  • traiter les données monquantes,
  • faire de "feature scalling" sur les données

Traitement des données monquantes

In [3]:
#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()
Out[3]:
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
In [2]:
#On peut aussi, si le dataset est bien formaté, afficher des informations sur ce même dataset :
titanic.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.7+ KB

On observe que :

Age, Cabin et Embarked ont des données manquantes ... En particulier, Cabin dont le nombre de données manquantes est trop grand.

Que peut-on faire pour traiter ces données monquantes ?

Option 1 :

Supprimer toutes les lignes où on est des données manquantes

In [3]:
titanic.dropna(inplace=True)    
In [4]:
#vérifions : 
titanic.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 183 entries, 1 to 889
Data columns (total 12 columns):
PassengerId    183 non-null int64
Survived       183 non-null int64
Pclass         183 non-null int64
Name           183 non-null object
Sex            183 non-null object
Age            183 non-null float64
SibSp          183 non-null int64
Parch          183 non-null int64
Ticket         183 non-null object
Fare           183 non-null float64
Cabin          183 non-null object
Embarked       183 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 18.6+ KB

On voit que :

on a supprimé trop de données ...

Option 2 :

On supprime les lignes où toutes les entrées sont manquantes (how='all'), ou encore où au moins 4 entrées sont manquantes, etc

In [5]:
titanic.dropna(thresh=4,inplace=True)
titanic.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 183 entries, 1 to 889
Data columns (total 12 columns):
PassengerId    183 non-null int64
Survived       183 non-null int64
Pclass         183 non-null int64
Name           183 non-null object
Sex            183 non-null object
Age            183 non-null float64
SibSp          183 non-null int64
Parch          183 non-null int64
Ticket         183 non-null object
Fare           183 non-null float64
Cabin          183 non-null object
Embarked       183 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 18.6+ KB

On voit clairement que Cabin pose problème. On la supprime tout simplement :

In [6]:
titanic.drop(['Cabin'], axis=1,inplace=True)
titanic.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 183 entries, 1 to 889
Data columns (total 11 columns):
PassengerId    183 non-null int64
Survived       183 non-null int64
Pclass         183 non-null int64
Name           183 non-null object
Sex            183 non-null object
Age            183 non-null float64
SibSp          183 non-null int64
Parch          183 non-null int64
Ticket         183 non-null object
Fare           183 non-null float64
Embarked       183 non-null object
dtypes: float64(2), int64(5), object(4)
memory usage: 17.2+ KB

A présent, nous allons traiter les données monquantes :

Imputation des données monquantes :

Pour l'age, on va remplacer les données manquantes par la moyenne des ages :

In [7]:
titanic.Age.fillna(titanic.Age.mean(),inplace=True)
titanic.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 183 entries, 1 to 889
Data columns (total 11 columns):
PassengerId    183 non-null int64
Survived       183 non-null int64
Pclass         183 non-null int64
Name           183 non-null object
Sex            183 non-null object
Age            183 non-null float64
SibSp          183 non-null int64
Parch          183 non-null int64
Ticket         183 non-null object
Fare           183 non-null float64
Embarked       183 non-null object
dtypes: float64(2), int64(5), object(4)
memory usage: 17.2+ KB

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:

In [8]:
titanic.Embarked.fillna(titanic.Embarked.mode()[0], inplace=True)
titanic.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 183 entries, 1 to 889
Data columns (total 11 columns):
PassengerId    183 non-null int64
Survived       183 non-null int64
Pclass         183 non-null int64
Name           183 non-null object
Sex            183 non-null object
Age            183 non-null float64
SibSp          183 non-null int64
Parch          183 non-null int64
Ticket         183 non-null object
Fare           183 non-null float64
Embarked       183 non-null object
dtypes: float64(2), int64(5), object(4)
memory usage: 17.2+ KB

Feature scalling

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 :

https://archive.ics.uci.edu/ml/datasets/Computer+Hardware

In [19]:
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)
In [5]:
dataset.head()
Out[5]:
constructor Model MYCT MMIN MMAX CACH CHMIN CHMAX PRP ERP
0 adviser 32/60 125 256 6000 256 16 128 198 199
1 amdahl 470v/7 29 8000 32000 32 8 32 269 253
2 amdahl 470v/7a 29 8000 32000 32 8 32 220 253
3 amdahl 470v/7b 29 8000 32000 32 8 32 172 253
4 amdahl 470v/7c 29 8000 16000 32 8 16 132 132

Nous allons nous intéresser aux deux attributs :

  • MYCT : Machine Cycle time in nanoseconds
  • MMAX : Maximum Main Memory in Kilobytes

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 :

In [20]:
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')
Out[20]:
Text(0, 0.5, 'MMAX')
<Figure size 576x432 with 0 Axes>

Normalisation des données :

In [21]:
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()))
********** Normalisation*********

Moyenne apres le Min max Scaling :
MYCT=0.13, MMAX=0.18


Valeur minimale et maximale pour la feature MYCT apres min max scaling: 
MIN=0.00, MAX=1.00


Valeur minimale et maximale pour la feature MMAX apres min max scaling : 
MIN=0.00, MAX=1.00

Affichons les données après normalisation :

In [22]:
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')
Out[22]:
Text(0, 0.5, 'MMAX')

Standarisation des données :

Attention : penser à recharger les données (ré-executer la bonne cellule de votre notebook).

In [17]:
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)
********** Standardisation*********

Moyenne et Ecart type apres la standardisation de la feature MYCT :
Moyenne=-0.00, Ecart Type=1.00


Moyenne et Ecart type apres la standardisation de la feature MYCT :
Moyenne=0.00, Ecart Type=1.00


Valeur minimale et maximale pour la feature MYCT apres min max scaling: 
MIN=-0.72, MAX=4.99


Valeur minimal et maximal pour la feature MMAX apres min max scaling : 
MIN=-1.00, MAX=4.46
Affichage des valeurs apres scaling
[[-3.03586142e-01 -4.95462207e-01]
 [-6.73329517e-01  1.72704937e+00]
 [-6.73329517e-01  1.72704937e+00]
 [-6.73329517e-01  1.72704937e+00]
 [-6.73329517e-01  3.59349937e-01]
 [-6.84883997e-01  1.72704937e+00]
 [-6.96438478e-01  1.72704937e+00]
 [-6.96438478e-01  1.72704937e+00]
 [-6.96438478e-01  4.46244823e+00]
 [-6.96438478e-01  4.46244823e+00]
 [ 7.55574567e-01 -7.51905850e-01]
 [ 7.55574567e-01 -7.09165243e-01]
 [-5.53933219e-01 -3.24499778e-01]
 [-5.92448153e-01  3.59349937e-01]
 [ 5.62999892e-01 -1.00287870e+00]
 [-1.47241306e-02  3.59349937e-01]
 [-1.41823416e-01 -8.37387064e-01]
 [-2.34259259e-01 -5.80943421e-01]
 [-2.34259259e-01 -8.37387064e-01]
 [-3.61358544e-01 -5.80943421e-01]
 [-2.34259259e-01 -4.69817842e-01]
 [-2.34259259e-01 -4.78365964e-01]
 [-2.34259259e-01 -4.78365964e-01]
 [-3.61358544e-01 -4.78365964e-01]
 [ 4.47455088e-01 -4.95462207e-01]
 [ 4.47455088e-01 -8.37387064e-01]
 [ 4.47455088e-01 -4.95462207e-01]
 [ 4.47455088e-01 -7.51905850e-01]
 [ 4.47455088e-01 -5.80943421e-01]
 [ 4.47455088e-01 -5.80943421e-01]
 [-6.88735491e-01 -7.84388711e-01]
 [-6.88735491e-01 -7.84388711e-01]
 [-5.92448153e-01 -1.12506366e-01]
 [-5.92448153e-01 -1.12506366e-01]
 [-5.69339193e-01  7.84191573e-01]
 [-5.38527245e-01  7.84191573e-01]
 [-5.92448153e-01 -8.37387064e-01]
 [-5.92448153e-01 -6.66424636e-01]
 [-5.92448153e-01 -3.24499778e-01]
 [-5.92448153e-01 -6.66424636e-01]
 [-5.92448153e-01 -3.24499778e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-2.72774194e-01  1.74250797e-02]
 [-2.72774194e-01 -3.24499778e-01]
 [ 2.33468690e+00 -9.64583111e-01]
 [ 2.33468690e+00 -5.80943421e-01]
 [ 4.47455088e-01 -3.24499778e-01]
 [-1.47241306e-02 -3.24499778e-01]
 [ 1.91102261e+00 -3.24499778e-01]
 [ 1.91102261e+00 -8.37387064e-01]
 [-2.45813740e-01  3.59349937e-01]
 [-1.47241306e-02 -3.24499778e-01]
 [-3.61358544e-01 -6.66424636e-01]
 [-3.61358544e-01  1.74250797e-02]
 [ 6.23057391e-02 -3.24499778e-01]
 [ 2.29617196e+00 -3.24499778e-01]
 [ 2.29617196e+00 -3.24499778e-01]
 [ 2.29617196e+00 -3.24499778e-01]
 [ 2.29617196e+00 -3.24499778e-01]
 [ 2.29617196e+00 -3.24499778e-01]
 [-3.03586142e-01 -9.22868279e-01]
 [-4.96160816e-01 -3.24499778e-01]
 [-4.96160816e-01  3.59349937e-01]
 [-4.96160816e-01  3.59349937e-01]
 [-4.38388414e-01 -9.22868279e-01]
 [-3.80616012e-01 -8.37387064e-01]
 [-3.80616012e-01 -6.66424636e-01]
 [-3.80616012e-01 -6.66424636e-01]
 [-4.96160816e-01 -3.24499778e-01]
 [-4.96160816e-01 -3.24499778e-01]
 [-1.11011468e-01 -8.37387064e-01]
 [ 3.70425218e-01 -7.51905850e-01]
 [ 3.70425218e-01 -7.51905850e-01]
 [ 3.70425218e-01  1.74250797e-02]
 [ 3.70425218e-01 -6.23684028e-01]
 [ 3.70425218e-01  1.74250797e-02]
 [ 3.70425218e-01 -9.42699921e-01]
 [-9.17540003e-02  1.74250797e-02]
 [ 4.85970023e-01 -7.51905850e-01]
 [ 3.70425218e-01 -6.66424636e-01]
 [ 3.70425218e-01  3.59349937e-01]
 [ 4.85970023e-01 -8.37387064e-01]
 [ 4.85970023e-01 -6.66424636e-01]
 [-2.45813740e-01 -6.66424636e-01]
 [-2.45813740e-01 -6.66424636e-01]
 [-2.45813740e-01 -6.66424636e-01]
 [-2.45813740e-01  1.72704937e+00]
 [-2.45813740e-01 -3.24499778e-01]
 [-2.45813740e-01  1.72704937e+00]
 [-2.45813740e-01  1.72704937e+00]
 [-2.45813740e-01 -6.66424636e-01]
 [-5.65487699e-01  3.59349937e-01]
 [-5.65487699e-01  1.04319965e+00]
 [-6.84883997e-01  1.72704937e+00]
 [-6.84883997e-01  1.72704937e+00]
 [-6.84883997e-01  1.72704937e+00]
 [-6.84883997e-01  3.59349937e-01]
 [ 1.06369405e+00 -9.64583111e-01]
 [-3.16965014e-03 -8.37387064e-01]
 [-3.42101077e-01 -4.95462207e-01]
 [ 3.45162001e+00 -8.80127672e-01]
 [ 3.45162001e+00 -8.37387064e-01]
 [ 1.52587326e+00 -8.37387064e-01]
 [ 7.55574567e-01 -6.66424636e-01]
 [ 7.55574567e-01 -3.24499778e-01]
 [ 2.68132131e+00 -9.22868279e-01]
 [ 2.68132131e+00 -9.22868279e-01]
 [ 2.68132131e+00 -6.66424636e-01]
 [ 2.68132131e+00 -6.66424636e-01]
 [ 2.68132131e+00 -6.66424636e-01]
 [ 8.15632065e-02 -6.66424636e-01]
 [ 8.15632065e-02 -6.66424636e-01]
 [-9.17540003e-02 -3.24499778e-01]
 [-7.24965329e-02  3.59349937e-01]
 [-9.17540003e-02  3.59349937e-01]
 [ 8.15632065e-02 -6.66424636e-01]
 [-6.88735491e-01  1.74250797e-02]
 [-6.88735491e-01  1.74250797e-02]
 [-7.19547438e-01  3.59349937e-01]
 [-7.19547438e-01  3.59349937e-01]
 [ 4.99221740e+00 -9.22868279e-01]
 [ 4.99221740e+00 -8.37387064e-01]
 [ 2.29617196e+00 -8.37387064e-01]
 [-5.92448153e-01 -6.66424636e-01]
 [-5.92448153e-01 -3.24499778e-01]
 [-5.92448153e-01 -3.24499778e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-3.99873479e-01 -3.24499778e-01]
 [-3.99873479e-01 -3.24499778e-01]
 [-3.99873479e-01 -3.24499778e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-2.07298805e-01 -6.66424636e-01]
 [-3.42101077e-01 -3.24499778e-01]
 [-3.42101077e-01 -6.66424636e-01]
 [-4.30685427e-01 -3.24499778e-01]
 [-4.30685427e-01 -3.24499778e-01]
 [-4.30685427e-01 -3.24499778e-01]
 [-4.96160816e-01  3.59349937e-01]
 [-5.53933219e-01  3.59349937e-01]
 [-5.53933219e-01  3.59349937e-01]
 [-5.53933219e-01  3.59349937e-01]
 [-5.92448153e-01  3.59349937e-01]
 [-5.07715297e-01  3.59349937e-01]
 [-5.07715297e-01 -3.24499778e-01]
 [-6.30963088e-01  3.59349937e-01]
 [-6.30963088e-01  1.72704937e+00]
 [-6.50220556e-01  1.72704937e+00]
 [-6.38666075e-01  1.72704937e+00]
 [-6.00151140e-01  1.04319965e+00]
 [-6.38666075e-01  1.72704937e+00]
 [-6.69478023e-01  1.72704937e+00]
 [-3.53655557e-01 -9.22868279e-01]
 [-4.61497375e-01 -8.37387064e-01]
 [-5.69339193e-01 -6.66424636e-01]
 [-5.69339193e-01 -4.95462207e-01]
 [-5.69339193e-01 -3.24499778e-01]
 [-5.69339193e-01 -3.24499778e-01]
 [-5.69339193e-01  1.74250797e-02]
 [-5.69339193e-01  3.59349937e-01]
 [-6.38666075e-01 -3.24499778e-01]
 [-6.38666075e-01 -3.24499778e-01]
 [-6.38666075e-01  3.59349937e-01]
 [-6.38666075e-01  1.04319965e+00]
 [-6.38666075e-01  3.59349937e-01]
 [-1.47241306e-02 -8.37387064e-01]
 [-1.47241306e-02 -6.66424636e-01]
 [-1.47241306e-02 -3.24499778e-01]
 [ 1.77850544e-01 -6.66424636e-01]
 [ 1.77850544e-01 -6.66424636e-01]
 [ 1.77850544e-01  3.59349937e-01]
 [-1.68783870e-01 -6.66424636e-01]
 [-1.68783870e-01 -8.37387064e-01]
 [-1.68783870e-01 -6.66424636e-01]
 [-1.68783870e-01 -3.24499778e-01]
 [-1.68783870e-01 -3.24499778e-01]
 [ 1.39335609e-01 -9.22868279e-01]
 [ 1.39335609e-01 -8.37387064e-01]
 [-3.80616012e-01 -6.66424636e-01]
 [-3.80616012e-01 -4.95462207e-01]
 [-3.80616012e-01 -3.24499778e-01]
 [-5.84745166e-01  3.59349937e-01]
 [-5.15418284e-01  1.74250797e-02]
 [-5.57784712e-01  1.74250797e-02]
 [-5.57784712e-01  3.59349937e-01]
 [-6.84883997e-01  1.04319965e+00]
 [-6.84883997e-01  1.72704937e+00]
 [-6.84883997e-01  1.72704937e+00]
 [-3.38249583e-01 -3.24499778e-01]
 [-5.92448153e-01  1.72704937e+00]
 [-5.92448153e-01  1.72704937e+00]
 [-5.92448153e-01  1.72704937e+00]
 [-5.92448153e-01  1.72704937e+00]
 [-6.69478023e-01  4.46244823e+00]
 [-6.69478023e-01  4.46244823e+00]
 [-9.17540003e-02 -6.66424636e-01]
 [-9.17540003e-02 -6.66424636e-01]
 [-9.17540003e-02 -6.66424636e-01]
 [-9.17540003e-02 -6.66424636e-01]
 [-3.07437636e-01 -3.24499778e-01]
 [-4.07576466e-01 -3.24499778e-01]
 [-3.03586142e-01 -3.24499778e-01]
 [ 1.06369405e+00 -3.24499778e-01]
 [ 1.06369405e+00 -6.66424636e-01]]
In [ ]: