Menu
CoddyTech

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

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

Метод K-средних группирует по расстоянию, поэтому решающее значение имеют единицы измерения с наибольшим масштабом. Рассмотрим кошек из приюта: вес измеряется в граммах, а возраст — в годах: разница в 500 г перевешивает разницу в 10 лет.

Две диаграммы для 120 кошек из приюта: возраст в годах отложен по горизонтали, вес в граммах — по вертикали. Слева — кластеры без масштабирования: взрослые кошки разделились по весу, молодые и пожилые оказались в одних группах. Справа — кластеры после масштабирования: котята, взрослые и пожилые кошки разделились по возрасту

Сначала стандартизируйте, как для k-NN, чтобы каждый признак учитывался одинаково:

X_scaled = StandardScaler().fit_transform(X)
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X_scaled)

make_pipeline(StandardScaler(), KMeans(...)) выполняет оба действия в одной модели. Затем считай значения каждой группы в исходных единицах: вычисли среднее для её исходных строк: X[km.labels_ == c].mean(axis=0).

challenge icon

Задание

Легко

Приложение для поиска квартир группирует 100 объявлений по арендной плате и расстоянию до станции. Начальный вариант кластеризует необработанные столбцы, и все его группы находятся примерно в 3 км от станции: доллары перевешивают километры.

  1. Масштабируй два столбца с помощью StandardScaler.
  2. Вместо этого кластеризуй масштабированные строки. Сохрани отчёт: он показывает каждую группу в реальных единицах измерения.

Для другого города:

38 flats: $1820 a month, 0.9 km out
33 flats: $1130 a month, 4.2 km out
29 flats: $2760 a month, 1.5 km out

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

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Одна строка на квартиру: месячная аренда в долларах, расстояние до станции в km
flats = pd.read_csv("flats.csv")
X = flats[["rent", "station_km"]]

# Здесь кластеризация выполняется по исходным столбцам: исправьте это
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)

# Выведите данные по каждой группе в исходных единицах измерения, начиная с самой большой
sizes = pd.Series(km.labels_).value_counts()
for c in sizes.index:
    group = flats[km.labels_ == c]
    print(f"{sizes[c]} flats: ${round(group['rent'].mean())} a month, {group['station_km'].mean():.1f} km out")
quiz iconПроверьте себя

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

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

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