Accéder au contenu principal

Prétraitement en data science (partie 1) : centrage, mise à l'échelle et k-NN

Cet article explique l'importance du prétraitement dans le pipeline de machine learning en montrant comment le centrage et la mise à l'échelle peuvent améliorer les performances des modèles.
Actualisé 19 sept. 2026  · 11 min lire

Explorer avec l’IA

ChatGPTClaudePerplexity
\n
Le prétraitement des données est un terme générique qui englobe un ensemble d'opérations utilisées par les data scientists pour mettre les données dans une forme plus adaptée à l'usage envisagé. Par exemple, avant d'effectuer une analyse de sentiments sur des données Twitter, vous pouvez vouloir supprimer les balises HTML, les espaces superflus, développer les abréviations et découper les tweets en listes de mots. Lors de l'analyse de données spatiales, vous pouvez les mettre à l'échelle pour qu'elles soient indépendantes des unités, autrement dit pour que votre algorithme ne se soucie pas que les mesures d'origine soient en miles ou en centimètres. Cependant, le prétraitement ne se fait pas en vase clos. Autrement dit, c'est un moyen au service d'un objectif, sans règles immuables : il existe des pratiques standard, comme nous le verrons, et vous pouvez développer une intuition de ce qui fonctionne ; mais, au final, le prétraitement s'inscrit généralement dans un pipeline orienté résultats et ses performances doivent être évaluées dans leur contexte.
\n
\n
\n

Dans cet article, j'utiliserai l'exemple de la mise à l'échelle de données numériques (données numériques : données composées de nombres, par opposition aux catégories/chaînes ; mise à l'échelle : utilisation d'opérations arithmétiques simples pour modifier l'étendue des données ; plus de détails à suivre) pour montrer l'importance d'envisager le prétraitement comme une composante d'une structure plus large : le pipeline de machine learning (ML). À cette fin, nous verrons un cas d'usage réel dans lequel la mise à l'échelle peut améliorer les performances d'un modèle.

\n

Je présenterai d'abord les problèmes de classification en ML et k-Nearest Neighbors, l'un des algorithmes les plus simples dans ce cadre. Pour bien comprendre l'importance de la mise à l'échelle des données numériques dans ce contexte, j'introduirai des mesures de performance des modèles ainsi que les notions d'ensembles d'entraînement et de test. Vous verrez tous ces concepts et pratiques à l'œuvre sur un jeu de données où j'essaie de classer la qualité de vins rouges. Je veillerai également à placer le prétraitement là où il est le plus utile : au début d'un pipeline de data science itératif. Tous les exemples seront en Python. Si vous ne connaissez pas Python, vous pouvez consulter nos cours DataCamp ici. J'utiliserai les bibliothèques pandas pour la manipulation de dataframes et scikit-learn pour le machine learning.

\n

Voici la première partie d'un tutoriel en trois volets :

\n

Partie 2 : Centrage, mise à l'échelle et régression logistique

\n

Partie 3 : Mise à l'échelle de données synthétisées

\n
\n
\n
\n
\n
\n
\n

Brève introduction aux problèmes de classification en machine learning

\n
\n
\n
\n
\n
\n
\n

Classer et étiqueter les choses dans le monde phénoménal est un art ancien. Au IVe siècle av. J.-C., Aristote a élaboré un système de classification des êtres vivants qui a été utilisé pendant 2 000 ans. Aujourd'hui, la classification est couramment formulée comme une tâche de machine learning, en particulier une tâche d'apprentissage supervisé. Le principe de base de l'apprentissage supervisé est simple : nous disposons d'un lot de données composées de variables prédictives et d'une variable cible. L'objectif de l'apprentissage supervisé est de construire un modèle « performant » pour prédire la variable cible à partir des variables prédictives. Si la variable cible se compose de catégories (par ex. « clic » ou « non », tumeur « maligne » ou « bénigne »), on parle de tâche de classification. À l'inverse, si la cible est une variable continue (par ex. le prix d'une maison), c'est une tâche de régression.

\n

Un exemple illustratif aide beaucoup : considérez le jeu de données sur les maladies cardiaques, qui comporte 75 variables prédictives, comme l'âge, le sexe ou le statut fumeur, et une variable cible indiquant la présence d'une maladie cardiaque, allant de 0 (aucune) à 4. De nombreux travaux sur ce jeu de données se sont concentrés sur la distinction entre présence et absence de maladie cardiaque. C'est une tâche de classification. Si vous cherchiez à prédire la valeur exacte (0 à 4) de la variable cible, ce serait un problème de régression (car la variable cible est ordonnée). Je parlerai de régression dans le prochain article. Ici, j'examinerai l'un des algorithmes les plus simples pour la classification : l'algorithme des plus proches voisins (k-Nearest Neighbors).

\n
\n
\n
\n
\n
\n
\n

k-Nearest Neighbors pour la classification en machine learning

\n
\n
\n
\n
\n
\n
\n

Supposons que nous disposions de données étiquetées, par exemple des caractéristiques de vins rouges (teneur en alcool, densité, quantité d'acide citrique, pH, etc. ; ce sont les variables prédictives) avec une variable cible « Quality » et des étiquettes « good » et « bad ». Étant donné les caractéristiques d'un nouveau vin non étiqueté, la tâche de classification consiste à prédire sa « Quality ». Lorsque toutes les variables prédictives sont numériques (il existe aussi des moyens de traiter le cas catégoriel), on peut considérer chaque ligne/vin comme un point dans un espace à n dimensions et, dans ce cas, k-Nearest Neighbors (k-NN) est une méthode de classification simple sur le plan conceptuel et computationnel : pour chaque nouveau vin non étiqueté, on calcule, pour un entier k donné, ses k plus proches voisins dans l'espace des variables prédictives à n dimensions. On regarde ensuite les étiquettes de ces k voisins (« good » ou « bad ») et on attribue au nouveau vin l'étiquette majoritaire (par ex., si k = 5, 3 voisins votent « good » et 2 votent « bad », alors notre modèle étiquette le nouveau vin « good »). Notez qu'ici, entraîner le modèle consiste uniquement à stocker les points de données : il n'y a aucun paramètre à ajuster !

\n
\n
\n
\n
\n
\n
\n

Une description visuelle de k-Nearest Neighbors

\n
\n
\n
\n
\n
\n
\n

Dans l'image ci-dessous, voici un exemple de k-NN en 2D : comment classeriez-vous le point au centre ? Eh bien, si k=3, vous le classeriez en rouge et, si k=5, en vert.

\n
\n
\n
\n
\n
\n
\n
\n
 
\n
\"k-nn
\n
\n
\n
\n
\n
\n
\n
\n

Implémentation de k-NN en Python (scikit-learn)

\n
\n
\n
\n
\n
Voyons maintenant un exemple de k-NN en pratique. Pour cela, nous allons explorer le jeu de données sur la qualité des vins : nous l'importerons dans un dataframe pandas puis tracerons des histogrammes des variables prédictives pour prendre la mesure des données.
\n
\n
import pandas as pd%matplotlib inlineimport matplotlib.pyplot as pltplt.style.use('ggplot')df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv ' , sep = ';')X = df.drop('quality' , 1).values # drop target variabley1 = df['quality'].valuespd.DataFrame.hist(df, figsize = [15,15]);
\n
\n
\n
\n
\n
\n
\n
\"bar
\n
\n
\n
\n
\n
\n
\n
\n

Remarquez d'abord l'étendue des variables prédictives : « free sulfur dioxide » varie de 0 à ~70 et « volatile acidity » d'environ 0 à ~1,2. Plus précisément, la première a une plage deux ordres de grandeur supérieure à la seconde. Tout algorithme, tel que k-NN, qui s'appuie sur la distance entre points de données, risque donc de se focaliser de manière disproportionnée sur les variables à grande plage, comme « free sulfur dioxide », une variable qui, pour autant que l'on sache, peut ne contenir que du bruit. Cela motive la mise à l'échelle des données, à laquelle nous allons venir très vite.

\n

Ici, la variable cible est une note de « Quality » allant de 3 à 8. Pour simplifier l'exposition, transformons-la en variable binaire : « good » (note > 5) et « bad » (note <= 5). Nous tracerons également des histogrammes des deux formulations de la cible pour mieux comprendre la situation.

\n
y = y1 <= 5 # is the rating <= 5?# plot histograms of original target variable# and aggregated target variableplt.figure(figsize=(20,5));plt.subplot(1, 2, 1 );plt.hist(y1);plt.xlabel('original target value')plt.ylabel('count')plt.subplot(1, 2, 2);plt.hist(y)plt.xlabel('aggregated target value')plt.show()
\n\n
\n
\n
\n
\n
\n
\n
\n
\"bar
\n
\n
\n
\n
\n
\n
Nous sommes presque prêts à exécuter k-Nearest Neighbors. Avant cela, si nous voulons comparer les performances de notre modèle avec et sans prétraitement, il nous faut définir comment mesurer la « qualité » d'un modèle :
\n
\n
\n
\n
\n

k-Nearest Neighbors : quel niveau de performance ?

\n
\n
\n
\n
\n
Il existe plusieurs mesures de performance pour les problèmes de classification. Il est essentiel de comprendre que le choix de la mesure dépend fortement du domaine et de la question posée. Pour un jeu de données aux classes équilibrées (où toutes les valeurs cibles sont à peu près également représentées), on utilise couramment l'accuracy comme mesure de performance. En fait, comme nous le verrons, l'accuracy est la méthode de scoring par défaut pour k-Nearest Neighbors et la régression logistique dans scikit-learn. Qu'est-ce que l'accuracy ? C'est simplement le nombre de prédictions correctes divisé par le nombre total de prédictions :
\n
\n
$$\\text{Accuracy}=\\frac{\\text{Number of Correct Predictions}}{\\text{Total Number of Predictions}}.$$
\n
\n
\n
\n
\n
\n

Remarque : l'accuracy peut aussi se définir à partir d'une matrice de confusion et, pour la classification binaire, en termes de vrais positifs et faux négatifs. D'autres mesures courantes dérivées de la matrice de confusion sont la précision (true positives / [true positives + false positives]) et le rappel (true positives / [true positives + false negatives]) ; une autre mesure, le F1-score, est la moyenne harmonique de la précision et du rappel. Voir machine learning mastery pour une bonne présentation de ces mesures ; voir aussi Wikipédia sur la matrice de confusion et le F1 score.

\n
\n
\n
\n
\n

k-Nearest Neighbors : performance en pratique et séparation entraînement/test

\n
\n
\n
C'est bien d'avoir une mesure de performance comme l'accuracy, mais si nous ajustons le modèle sur l'ensemble de nos données, sur quel jeu allons-nous rapporter cette accuracy ? N'oubliez pas que nous voulons un modèle qui généralise bien à de nouvelles données. Ainsi, si nous entraînons notre modèle sur un jeu D, rapporter l'accuracy sur ce même jeu D peut donner l'illusion de meilleures performances qu'en réalité. C'est ce qu'on appelle le surapprentissage (overfitting). Pour y remédier, les data scientists entraînent généralement leur modèle sur un sous-ensemble des données, appelé jeu d'entraînement, et évaluent sa performance sur le reste, le jeu de test. C'est exactement ce que nous allons faire ! Une règle générale consiste à utiliser environ 80 % des données pour l'entraînement et 20 % pour le test. Séparons maintenant nos données sur la qualité des vins rouges :
\n
\n
from sklearn.cross_validation import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)We now build the k-NN model, make predictions on the test set and compare these predictions to the ground truth in order to get a measure of model performance:from sklearn import neighbors, linear_modelknn = neighbors.KNeighborsClassifier(n_neighbors = 5)knn_model_1 = knn.fit(X_train, y_train)print('k-NN accuracy for test set: %f' % knn_model_1.score(X_test, y_test))k-NN accuracy for test set: 0.612500
\n
\n
\n
\n
\n
\n
\n
\n

Il est utile de rappeler que la méthode de scoring par défaut pour k-NN dans scikit-learn est l'
accuracy. Une accuracy de 61 % n'est pas exceptionnelle, mais pour un modèle prêt à l'emploi sans prétraitement, ce n'est pas catastrophique non plus. Pour examiner d'autres métriques, utilisons également le classification report de scikit-learn :

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
from sklearn.metrics import classification_reporty_true, y_pred = y_test, knn_model_1.predict(X_test)print(classification_report(y_true, y_pred))
\n
\n
\n
\n
\n
\n
\n
\n
 
\n
\n
             precision    recall  f1-score   support      False       0.66      0.64      0.65       179       True       0.56      0.57      0.57       141avg / total       0.61      0.61      0.61       320
\n
\n
\n
\n
\n
\n
\n
\n
\n

Nous allons maintenant introduire la mise à l'échelle et le centrage, les méthodes de prétraitement les plus basiques pour les données numériques, et voir si, et comment, elles influencent la performance de notre modèle.

\n
\n
\n
\n
\n
\n
\n

Les mécanismes du prétraitement : mise à l'échelle et centrage

\n
\n
\n
\n
\n
\n
\n

Avant d'entraîner un modèle, qu'il s'agisse de régression (prédire une variable continue) ou de classification (prédire une variable discrète), vous voudrez presque toujours effectuer un prétraitement. Pour les variables numériques, il est courant de normaliser ou de standardiser les données. Que signifient ces termes ?

\n

La normalisation consiste à mettre à l'échelle un jeu de données pour que son minimum soit 0 et son maximum 1. Pour y parvenir, on transforme chaque point de donnée x en

\n$$x_{normalized} = \\frac{x-x_{min}}{x_{max}-x_{min}}.$$
\n

La standardisation est légèrement différente ; elle recentre les données autour de 0 et les met à l'échelle en fonction de l'écart type :

\n$$x_{standardized} = \\frac{x-\\mu}{\\sigma},$$
\n

où \\mu et \\sigma sont respectivement la moyenne et l'écart type du jeu de données. Notez d'abord que ces transformations ne changent que la plage des données, pas leur distribution. Vous souhaiterez peut-être ensuite appliquer d'autres transformations, comme une transformation logarithmique ou de Box-Cox, pour rendre vos données plus gaussiennes (en cloche). Mais avant d'aller plus loin, posons-nous les bonnes questions : pourquoi mettons-nous les données à l'échelle ? Dans quels cas est-ce plus pertinent ? Par exemple, est-ce plus important en classification qu'en régression ?

\n

Plongeons d'abord dans les problèmes de classification et voyons comment la mise à l'échelle affecte les performances de k-Nearest Neighbors :

\n
\n
\n
\n
\n
\n
\n

Prétraitement : mise à l'échelle en pratique

\n
\n
\n
\n
\n
\n
\n

Ci-dessous, je (i) mets les données à l'échelle, (ii) utilise k-Nearest Neighbors et (iii) évalue la performance du modèle. J'utiliserai la fonction scale de scikit-learn, qui standardise toutes les caractéristiques (colonnes) du tableau passé en entrée.

\n
from sklearn.preprocessing import scaleXs = scale(X)from sklearn.cross_validation import train_test_splitXs_train, Xs_test, y_train, y_test = train_test_split(Xs, y, test_size=0.2, random_state=42)knn_model_2 = knn.fit(Xs_train, y_train)print('k-NN score for test set: %f' % knn_model_2.score(Xs_test, y_test))print('k-NN score for training set: %f' % knn_model_2.score(Xs_train, y_train))y_true, y_pred = y_test, knn_model_2.predict(Xs_test)print(classification_report(y_true, y_pred))
\n
\n
\n
\n
\n
\n
 
\n
\n
\n
\n
\n
\n
 k-NN score for test set: 0.712500k-NN score for training set: 0.814699             precision    recall  f1-score   support      False       0.72      0.79      0.75       179       True       0.70      0.62      0.65       141avg / total       0.71      0.71      0.71       320
\n
\n
\n
\n
\n
\n
\n
\n
\n

Toutes ces mesures se sont améliorées d'environ 0,1, soit un gain de 16 % — significatif ! Comme suggéré plus haut, avant la mise à l'échelle, plusieurs variables prédictives avaient des ordres de grandeur très différents, ce qui signifie que l'une ou deux pouvaient dominer un algorithme basé sur les distances comme k-NN. Les deux raisons principales de mettre vos données à l'échelle sont :

\n
    \n
  1. Vos variables prédictives peuvent avoir des plages très différentes et, dans certaines situations, comme avec k-NN, il faut atténuer cet effet pour éviter qu'une caractéristique ne domine l'algorithme ;
  2. \n
  3. Vous souhaitez que vos caractéristiques soient indépendantes des unités de mesure : par exemple, vous pourriez mesurer une caractéristique en mètres et moi en centimètres. Si nous mettons chacun nos données à l'échelle, cette caractéristique deviendra comparable.
  4. \n
\n
\n
\n
\n
\n
\n
\n

Nous avons vu la place essentielle qu'occupe le prétraitement — sous forme de mise à l'échelle et de centrage — dans le pipeline de data science, et ce, pour encourager une approche holistique des défis du machine learning. Dans de prochains articles, j'espère étendre cette discussion à d'autres types de prétraitement, comme les transformations de données numériques et le prétraitement des données catégorielles, deux volets indispensables de la boîte à outils de tout data scientist. Avant cela, dans le prochain article, j'explorerai le rôle de la mise à l'échelle dans les approches de régression pour la classification. En particulier, j'examinerai la régression logistique et vous verrez que le résultat diffère fortement de celui observé avec k-Nearest Neighbors.

\n
\n
\n
\n
\n
\n
\n

Dans la fenêtre interactive ci-dessous, vous pouvez expérimenter vous-même avec les données. Commencez par modifier la variable n_neig, qui est le nombre de voisins utilisés par l'algorithme k-NN. Vous pouvez aussi mettre les données à l'échelle en définissant sc = True, si vous le souhaitez. Exécutez ensuite tout le script pour obtenir l'accuracy du modèle, ainsi qu'un classification report.

\n
import pandas as pdimport matplotlib.pyplot as pltfrom sklearn.cross_validation import train_test_splitfrom sklearn import neighborsfrom sklearn.preprocessing import scalefrom sklearn.metrics import classification_report # Set the the number of neighbors for k-NNn_neig = 5# Set sc = True if you want to scale your featuressc = False# Load datadf = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv ' , sep = ';')X = df.drop('quality' , 1).values# drop target variable# Here we scale, if desiredif sc == True: X = scale(X)# Target valuey1 = df['quality'].values# original target variabley = y1 <= 5# new target variable: is the rating <= 5?# Split the data into a test set and a training setX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# Train k-NN model and print performance on the test setknn = neighbors.KNeighborsClassifier(n_neighbors = n_neig)knn_model = knn.fit(X_train, y_train)y_true, y_pred = y_test, knn_model.predict(X_test)print('k-NN accuracy for test set: %f' % knn_model.score(X_test, y_test))print(classification_report(y_true, y_pred))
\n
\n
\n
\n

Glossaire

\n
\n
\n
\n

Apprentissage supervisé : la tâche qui consiste à déduire une variable cible à partir de variables prédictives. Par exemple, déduire la variable cible « présence d'une maladie cardiaque » à partir de variables prédictives comme l'âge, le sexe et le statut fumeur.

\n

Tâche de classification : une tâche d'apprentissage supervisé est une tâche de classification si la variable cible consiste en des catégories (par ex. « clic » ou « non », tumeur « maligne » ou « bénigne »).

\n

Tâche de régression : une tâche d'apprentissage supervisé est une tâche de régression si la variable cible est une variable continue (par ex. le prix d'une maison) ou une variable catégorielle ordonnée comme la « note de qualité d'un vin ».

\n

k-Nearest Neighbors : un algorithme pour les tâches de classification dans lequel un point de données reçoit l'étiquette décidée par le vote majoritaire de ses k plus proches voisins.

\n

Prétraitement : ensemble d'opérations utilisées par les data scientists pour mettre les données dans une forme plus adaptée à l'usage prévu. Par exemple, avant une analyse de sentiments sur Twitter, vous pouvez supprimer les balises HTML, les espaces superflus, développer les abréviations et découper les tweets en listes de mots.

\n

Centrage et mise à l'échelle : deux formes de prétraitement des données numériques, c'est‑à‑dire des données composées de nombres, par opposition aux catégories ou aux chaînes ; centrer une variable consiste à soustraire sa moyenne à chaque observation pour obtenir une nouvelle variable de moyenne nulle ; mettre à l'échelle une variable consiste à multiplier chaque observation par une constante afin de modifier la plage des données. Voir le corps de l'article pour l'importance de ces techniques et des exemples.

\n
\n
\n
\n
\n
\n
\n

Cet article a été généré à partir d'un notebook Jupyter. Vous pouvez télécharger le notebook ici.

\n
\n
\n
Sujets
Python
Science des données
Apprentissage automatique