Menu
CoddyTech

Normalizzare le scale per i vicini

Fa parte della sezione Apprendimento supervisionato del percorso Machine Learning di Coddy. Lezione 9 di 58.

k-NN misura la distanza, quindi una caratteristica con valori grandi prevale sulle altre, come avvertito nella sezione 2. Qui la distanza dal fiume, in metri, sovrasta l'altitudine:

Due mappe di 160 case, con la distanza dal fiume sull'asse orizzontale e l'altitudine su quello verticale, allagate o asciutte. Dati grezzi: la mappa è divisa in strisce verticali basate solo sulla distanza, accuratezza 0.6. Dati scalati: le case allagate si trovano nell'angolo in basso vicino al fiume, accuratezza 0.925

Scala prima. Adatta il ridimensionatore solo sulle righe di addestramento, poi trasforma entrambi i set:

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))

Questo stampa 0.925, in aumento rispetto a 0.6. Le righe di test restano inedite: lo scaler non apprende nulla da esse.

challenge icon

Sfida

Facile

Un contatore intelligente indovina quale elettrodomestico è in funzione in base alla sua potenza (watt) e alla durata di funzionamento (minuti), in meter.csv. Il codice iniziale legge k e stampa l'accuratezza di k-NN sulle caratteristiche non scalate.

  1. Adatta uno StandardScaler alle righe di addestramento e trasformale entrambe.
  2. Adatta un modello k-NN con lo stesso valore di k alle righe scalate; stampa la sua accuratezza con 3 decimali.
  3. Stampa il miglioramento.

Per un'altra casa e k = 5:

Unscaled accuracy: 0.65
Scaled accuracy: 0.875
Scaling gains 0.225

Provalo tu

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

# Una riga per ogni ciclo di funzionamento di un elettrodomestico: potenza in watt, durata in minuti, elettrodomestico utilizzato
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 sulle caratteristiche grezze
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)}")

# Scrivi il tuo codice qui sotto
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento supervisionato

Esercitati da solo: Compilatore Python online