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:
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 :
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:
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
data.isna().sum()
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
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:
2 commentaires