Menu
CoddyTech

StandardScaler

Fait partie de la section Statistiques pour le ML du Journey Machine Learning de Coddy. Leçon 50 sur 64.

Un modèle doit mettre à l’échelle chaque nouvel échantillon exactement comme il a mis à l’échelle ses données d’entraînement. Le StandardScaler de scikit-learn standardise les données et mémorise comment il le fait :

Un schéma : les 4 anciens chantiers d’un laveur de vitres, X_train, passent par fit et arrivent dans un scaler qui mémorise mean_ 8 et 22 ainsi que scale_ 4.47 et 9.72. Un nouveau chantier, 8 et 30, passe par transform, qui utilise ces nombres, et ressort avec les valeurs 0.00 et 0.82

Dans le code, chaque tâche est représentée par le nombre de fenêtres nettoyées et le nombre de minutes nécessaires :

from sklearn.preprocessing import StandardScaler

X_train = np.array([[2, 8], [10, 25], [6, 20], [14, 35]])
scaler = StandardScaler()
scaler.fit(X_train)
X_new = np.array([[8, 30]])  # un échantillon : un tableau avec une seule ligne
print(np.round(scaler.transform(X_new), 2))

Cela affiche :

[[0.   0.82]]

fit apprend la moyenne et l’écart-type de chaque colonne (en divisant par n, comme np.std), conservés dans scaler.mean_ et scaler.scale_. transform les applique.

N’ajuste jamais le modèle sur de nouvelles données : l’ensemble aurait sa propre moyenne et deviendrait [[0. 0.]]. Sur les données d’entraînement, fit_transform effectue les deux opérations en un seul appel.

challenge icon

Défi

Moyen

Un trieur a appris à partir des avocats de X_train : leur poids, leur fermeté et le nombre de jours depuis la récolte. Le programme lit un nouvel avocat dans le tableau à une ligne new_avocado, mais la mise à l’échelle du code de départ affiche [[0. 0. 0.]] pour chaque avocat.

  1. Corrige ça : mets le nouvel avocat à l’échelle à l’aide des moyennes et des écarts-types de l’ensemble d’entraînement.
  2. Compte ses mesures qui s’écartent de plus de 2 écarts-types de la moyenne de l’ensemble d’entraînement, dans un sens ou dans l’autre, et affiche le résultat comme ci-dessous.

Pour un autre lot :

New avocado: [[2.98 0.   0.09]]
1 of 3 measurements are more than 2 std from the training avocados

Essayez vous-même

import numpy as np
from sklearn.preprocessing import StandardScaler

# Avocats d'entraînement, une ligne par avocat : poids en grammes, fermeté de 1 à 10, jours depuis la récolte
X_train = np.array([[210, 8, 2],
                    [185, 5, 6],
                    [240, 7, 3],
                    [170, 3, 9],
                    [225, 6, 5],
                    [195, 4, 7]])
# Un nouvel avocat sur le tapis roulant
weight = float(input())
firmness = float(input())
days = float(input())
new_avocado = np.array([[weight, firmness, days]])

# Ceci affiche [[0. 0. 0.]] pour chaque avocat : corrigez ce problème
scaler = StandardScaler()
scaled = scaler.fit_transform(new_avocado)
print("New avocado:", np.round(scaled, 2))

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Statistiques pour le ML

Entraînez-vous par vous-même : Compilateur Python en ligne