Menu
CoddyTech

Масштабирование признаков для поиска соседей

Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 9 из 58.

k-NN измеряет расстояние, поэтому признак с большими числовыми значениями перевешивает остальные, как предупреждалось в разделе 2. Здесь расстояние до реки в метрах затмевает высоту над уровнем моря:

Две карты 160 домов: расстояние до реки отложено по горизонтали, высота над уровнем моря — по вертикали; дома затоплены или сухие. Без масштабирования: карта разделена на вертикальные полосы только по расстоянию, точность 0.6. После масштабирования: затопленные дома попадают в нижний угол рядом с рекой, точность 0.925

Сначала выполните масштабирование. Обучите масштабировщик только на обучающих строках, затем преобразуйте оба набора:

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

Это выводит 0.925, что больше, чем 0.6. Тестовые строки остаются невиданными: масштабировщик ничего у них не узнаёт.

challenge icon

Задание

Легко

Умный счётчик определяет работающий электроприбор по его мощности (в ваттах) и времени работы (в минутах), используя meter.csv. Стартовый код считывает k и выводит точность k-NN на необработанных признаках.

  1. Обучи StandardScaler на строках обучающей выборки и преобразуй обе выборки.
  2. Обучи модель k-NN с тем же k на масштабированных строках; выведи её точность с точностью до 3 знаков после запятой.
  3. Выведи прирост.

Для другого дома и k = 5:

Unscaled accuracy: 0.65
Scaled accuracy: 0.875
Scaling gains 0.225

Попробуйте сами

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

# Одна строка на каждый запуск прибора: мощность в ваттах, время работы в минутах, тип прибора
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 на исходных признаках
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)}")

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение с учителем

Потренируйтесь самостоятельно: Онлайн-компилятор Python