Les méthodes de normalisation avec Scikit-Learn

 


Le data pré-processing ou pré-traitement des données est une étape très importante dans le développement de modèles de machine learning performants.



Les algorithmes de machine learning apprennent des données que nous leur fournissons. Ainsi, si ces données sont de mauvaise qualité, nous aurons de mauvais modèles car ils apprendrons de ce qu’ils verront dans les données. Il est donc très important de bien préparer nos données avant l’implémentation des modèles. C’est pour cela que dans cet article, nous nous attarderons sur la NORMALISATION.

Qu’est-ce que la normalisation?

La normalisation est une opération du pré-traitement de données qui a pour but de mettre sur une même échelle toutes les variables quantitatives. Supposons qu’on ait à comparer les variables taille et âge. Ces deux variables n’étant pas sur une même échelle de grandeur, la comparaison n’aura pas véritablement de sens. Une mise à échelle est nécessaire pour mettre nos variables sur la même échelle, c’est ce qui facilitera la comparaison et lui donnera du sens.

Avons-nous un intérêt à normaliser les variables quantitatives ?
  • La normalisation facilite l’apprentissage des modèles de Machine Learning qui sont basés sur la descente du gradient, les calculs de distance ou les calculs de variance.
  • La normalisation égalise le poids de chaque dimension dans le but d’éviter que les variables ayant de grandes valeurs  soient considérées plus importantes que les variables ayant des valeurs moins grandes, d’où l’importance de l’application au préalable de certains algorithmes de clustering.
  • La normalisation standardise la moyenne et l’écart-type de tout type de distribution de données, ce qui permet de simplifier le problème d’apprentissage en s’affranchissant de ces deux paramètres.
Les différents types de normalisation

Les mots normalisation et standardisation sont souvent utilisés pour décrire un ensemble de méthodes permettant d’effectuer une mise à échelle, mais ils sont aussi utilisés pour décrire une technique bien précise de redimensionnement de variables. Nous utilisons normalisation pour décrire l’ensemble des méthodes.
Nous verrons 3 types de normalisation : normalisation Min-Max, Standardisation (normalisation standard) et Robuste.

Normalisation Min-Max

Le procédé de normalisation Min-Max utilise le minimum et le maximum de la variable. L’idée est de ramener toutes les valeurs de la variable dans l’intervalle [0;1], tout en conservant le rapport des distances entre les valeurs. Pour le réaliser on utilise la formule suivante:

    \[X_{norm} = \frac{X-X_{min}}{X_{max} -X_{min}}\]

Standardisation

Pour ce qui est de la standardisation, la transformation a pour but de ramener la moyenne μ à 0 et l’écart-type σ à 1. Encore une fois, le procédé est simple si on a à notre disposition la moyenne μ et l’écart-type σ de la variable, la formule pour le faire est la suivante :

    \[X_{stand} = \frac{X-\mu}{\sigma}\]

 

Ces deux techniques sont sensibles aux valeurs aberrantes, donc moins efficaces. Pour des variables ayant des valeurs aberrantes, il est préférable d’utiliser la normalisation robuste qui est peu sensible aux valeurs aberrantes.

Robuste
Cette technique transforme chaque variable en étant peu sensible aux outliers (valeurs aberrantes). Le procédé est le suivant: on soustrait aux valeurs de la variable la médiane (la médiane est une valeur de la variable qui permet de séparer ses valeurs en deux parties égales) et on divise par l’écart interquartile IQR (IQR est une mesure de dispersion qui s’obtient en faisant la différence entre le troisième et le premier quartile) la formule est la suivante:

    \[X_{rob} = \frac{X - mediane}{IQR}\]

 

Les algorithmes concernés

Les algorithmes pour lesquels la normalisation s’avère nécessaire, sont ceux pour lesquels il faudra calculer un vecteur de poids, calculer des distances pour déduire le dégré de similarité de deux variables. Certains algorithmes de Clustering, pour lesquels il faudra procéder à la normalisation sont ( liste non exhaustive ) : Régression Logistique, Régression polynomiale, Régression multivariée, Support Vector Machines (SVM), K-Nearest Neighbors (KNN), K-Means. Enfin la normalisation semble ne pas avoir d’impact sur certains algorithmes basés sur des seuils.

Manipulation de donnée

Dans cette partie, il est question de montrer l’importance de la normalisation en comparant le score d’un modèle avant normalisation et après normalisation. Nous allons l’illustrer par le modèle de régression linéaire. Le jeu de données choisi est relatif à l’assurance. La variable à expliquer est la variable ‘charge’ et les variables explicatives sont: ‘region’,’sex’,’smoker'(variables catégorielles), ‘age’,’bmi’,’children’ (variables qualitatives).

Les variables age et sex représentent respectivement l’âge et le sexe des assurés, la variable children prend en compte le nombre d’enfant des assurés. la variable smoker indique si l’assuré est fumeur ou non, la variable region représente la région où vit l’assuré, la variable bmi représente l’indice de masse corporelle (IMC) et charges représente le montant à la charge de l’assuré.

import numpy as np
import pandas as pd  # pour l'importation et manipulation  des données
from sklearn.preprocessing import OneHotEncoder #pour le recodage des variables catégorielles 
from sklearn.linear_model import LinearRegression #le modèle 
from sklearn.preprocessing import MinMaxScaler # pour effectuer la normalisations min-max
from sklearn.compose import make_column_transformer # Applique des transformateurs aux colonnes d'un tableau
from sklearn.pipeline import make_pipeline #  une fonction utilitaire qui est un raccourci pour construire des pipelines  

#importation des données 
data =  pd.read_csv (r'C:\Users\marcel.anee\Downloads\insurance.csv')
data.head(5) # vérifions que nos données ont été importé dans le bon format
exercice alliage

 

data.isna().sum()
exercice alliage

 

Comme on peut le constater nous n’avons pas de valeurs manquantes dans notre jeu de données.
Pour pouvoir utiliser les variables catégorielles dans les modèles, nous les recoderons avec la fonction OneHotEncoder. Nous utilisons la fonction make_column_transformer qui nous vient du module sklearn.compose qui à but d’appliquer des transformateurs aux colonnes d’un tableau ou de pandas DataFrame.

Y = data['charges']
X = data.drop('charges',axis=1)
categoriel = ['region','sex','smoker'] # sélection des variables catégorielles 

transformer = make_column_transformer((OneHotEncoder(),categoriel))

Modèle sans normalisation des variables quantitatives

model = make_pipeline(transformer,LinearRegression() 
model.fit(X,Y)
print('le score du modèle est:',model.score(X,Y))

Le score du modèle est: 0.6203218572730024

Nous allons maintenant normaliser nos variables numériques.

numeric = ["age","bmi","children"] #sélection des variables à normaliser
transformer2 = make_column_transformer((MinMaxScaler(),numeric),(OneHotEncoder(),categoriel))
transformer2.fit_transform(X)

Modèle effectué avec des variables normalisées

model1 = make_pipeline(tansformer2,LinearRegression())
model1.fit(X,Y)
print('le score du modèle est :', model1.score(X,Y))

Les scores du modèle est : 0.7509130345985207

data0 = pd.DataFrame(np.array([ 0.7509130345985207,0.6203218572730024]),index= ('Normalisé', 'Non Normalisé'),columns =['score'])
data0
exercice alliage

Après comparaison, on peut constater que la normalisation permet d’améliorer le score de notre modèle.

A retenir
  • La normalisation ne s’effectue généralement que sur des variables quantitatives.
  • En général, la normalisation impacte les modèles basés sur la descente du gradient, le calcul de distance ou de variance.
  • L’effet de la normalisation sur certains algorithmes basés sur les seuils (arbres de décisions) semble être négligeable.

Quelques sites qui abordent le même sujet:

Inside machine learning
Data analytics post
Data scientest