Menu
CoddyTech

Mettre les voisins à l’échelle

Fait partie de la section Apprentissage supervisé du Journey Machine Learning de Coddy. Leçon 9 sur 58.

k-NN mesure la distance, donc une caractéristique exprimée par de grands nombres prend le dessus sur les autres, comme l’avertissait la section 2. Ici, la distance à la rivière, en mètres, éclipse l’altitude :

Deux cartes de 160 maisons, la distance à la rivière à l’horizontale et l’altitude à la verticale, inondées ou au sec. Données brutes : la carte est découpée en bandes verticales par la seule distance, précision de 0.6. Données mises à l’échelle : les maisons inondées se retrouvent dans le coin inférieur près de la rivière, précision de 0.925

Commence par mettre à l’échelle. Ajuste le transformateur uniquement sur les lignes d’entraînement, puis transforme les deux ensembles :

scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)
model = KNeighborsClassifier()
model.fit(X_train_s, y_train)
print(model.score(X_test_s, y_test))

Cette instruction affiche 0.925, contre 0.6 auparavant. Les lignes de test restent inconnues : le scaler n’en tire aucun apprentissage.

challenge icon

Défi

Facile

Un compteur intelligent devine quel appareil est en marche à partir de sa puissance (watts) et de sa durée de fonctionnement (minutes), dans meter.csv. Le code de départ lit k et affiche l’exactitude de k-NN sur les caractéristiques brutes.

  1. Ajuste un StandardScaler sur les lignes d’entraînement et transforme les deux ensembles.
  2. Ajuste un modèle k-NN avec le même k sur les lignes mises à l’échelle ; affiche son exactitude à 3 décimales.
  3. Affiche le gain.

Pour un autre foyer et k = 5 :

Unscaled accuracy: 0.65
Scaled accuracy: 0.875
Scaling gains 0.225

Essayez vous-même

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler

# Une ligne par utilisation d’un appareil : puissance en watts, durée de fonctionnement en minutes, appareil utilisé
meter = pd.read_csv("meter.csv")
X = meter[["watts", "minutes"]]
y = meter["appliance"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
k = int(input())

# k-NN sur les caractéristiques brutes
raw_model = KNeighborsClassifier(n_neighbors=k)
raw_model.fit(X_train, y_train)
raw = raw_model.score(X_test, y_test)
print(f"Unscaled accuracy: {round(raw, 3)}")

# É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 Apprentissage supervisé

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