Menu
CoddyTech

Кластеры как признаки

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

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

135 домов в трёх деревнях, восток направо, север вверх; вокруг каждой деревни чёрный крест — центр k-средних. Пунктирные линии соединяют один красный дом со всеми тремя центрами: 4.9 km, 5.2 km и, ближе всего, 1.0 km

k-means находит деревни. km.transform вычисляет расстояние от каждой строки до каждого центра, а .min(axis=1) оставляет ближайший:

km = KMeans(n_clusters=3, n_init=10, random_state=0).fit(X_train)
near_train = km.transform(X_train).min(axis=1)
near_test = km.transform(X_test).min(axis=1)
X_train2 = np.column_stack([X_train, near_train])
X_test2 = np.column_stack([X_test, near_test])

С этим дополнительным столбцом тестовый R-квадрат линейной модели вырос с 0.000 до 0.886.

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

challenge icon

Задание

Средне

Команда фестиваля, отвечающая за звук, хочет знать, насколько громко там, где стоят люди. В стартовом коде данные из crowd.csv разделяются на наборы, считывается k и выводится оценка только по положению.

  1. Обучи k-means с k кластерами на координатах из обучающего набора.
  2. Добавь расстояние от каждой строки до ближайшего центра в качестве третьего столбца в обоих наборах.
  3. Выведи новое значение R-квадрат на тестовом наборе и прирост с точностью до 3 десятичных знаков.

Для другого фестиваля и k = 4:

Position only: R squared 0.097
With the nearest of 4 centers: R squared 0.734
Gain: 0.637

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

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.cluster import KMeans

# 250 посетителей фестиваля: где они стояли (m) и уровень звука в этих местах (dB)
crowd = pd.read_csv("crowd.csv")
X = crowd[["x_m", "y_m"]].to_numpy()
y = crowd["sound_db"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
k = int(input())


# Обучает линейную регрессию на обучающих столбцах и возвращает её R-квадрат на тестовых столбцах
def test_r2(A_train, A_test):
    model = LinearRegression().fit(A_train, y_train)
    return model.score(A_test, y_test)


before = test_r2(X_train, X_test)
print(f"Position only: R squared {before:.3f}")

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

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

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

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