Menu
CoddyTech

Skalowanie dla sąsiadów

Część sekcji Uczenie nadzorowane ścieżki Machine Learning w Coddy. Lekcja 9 z 58.

k-NN mierzy odległość, więc cecha o dużych wartościach przyćmiewa pozostałe, jak ostrzeżono w sekcji 2. Tutaj odległość od rzeki, mierzona w metrach, przyćmiewa wysokość nad poziomem morza:

Dwie mapy 160 domów: odległość od rzeki w poziomie, wysokość nad poziomem morza w pionie, zalane lub suche. Bez skalowania: mapa jest podzielona na pionowe pasy wyłącznie według odległości, dokładność 0.6. Po skalowaniu: zalane domy trafiają do niskiego narożnika przy rzece, dokładność 0.925

Najpierw przeskaluj dane. Dopasuj skalowanie wyłącznie do wierszy treningowych, a następnie przekształć oba zestawy:

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

Wypisuje to 0.925, czyli więcej niż 0.6. Wiersze testowe pozostają niewidziane: skalowanie nie uczy się niczego na ich podstawie.

challenge icon

Wyzwanie

Łatwy

Inteligentny licznik przewiduje, które urządzenie działa, na podstawie jego mocy (w watach) i czasu pracy (w minutach), w pliku meter.csv. Kod początkowy odczytuje k i wypisuje dokładność k-NN dla nieprzeskalowanych cech.

  1. Dopasuj StandardScaler do wierszy treningowych i przekształć oba zbiory.
  2. Dopasuj model k-NN z tą samą wartością k do przeskalowanych wierszy; wypisz jego dokładność z dokładnością do 3 miejsc po przecinku.
  3. Wypisz wzrost dokładności.

Dla innego domu i k = 5:

Unscaled accuracy: 0.65
Scaled accuracy: 0.875
Scaling gains 0.225

Spróbuj swoich sił

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

# Jeden wiersz dla każdego uruchomienia urządzenia: moc w watach, czas pracy w minutach, rodzaj urządzenia
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 na nieprzeskalowanych cechach
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)}")

# Napisz swój kod poniżej
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uczenie nadzorowane

Poćwicz samodzielnie: Kompilator Python online