Кластеры как признаки
Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 40 из 51.
Линейная модель не может изгибаться. Сигнал телефона в трёх деревнях ослабевает по мере удаления от вышки каждой деревни — форму, которую невозможно увидеть только по положению:
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 только на обучающих строках, как и масштабировщик, а затем преобразуйте оба набора.
Задание
СреднеКоманда фестиваля, отвечающая за звук, хочет знать, насколько громко там, где стоят люди. В стартовом коде данные из crowd.csv разделяются на наборы, считывается k и выводится оценка только по положению.
- Обучи k-means с
kкластерами на координатах из обучающего набора. - Добавь расстояние от каждой строки до ближайшего центра в качестве третьего столбца в обоих наборах.
- Выведи новое значение 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}")
# Напишите свой код ниже
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Обучение без учителя
1Поиск групп
Обучение без метокИзмерение сходстваK-Means вручнуюK-Means в scikit-learnПовторение: участники спортзала4Иерархическая кластеризация
Пошаговое объединениеАгломеративные моделиДендрограммыПовторение: породы собак2Выбор k
ИнерцияМетод локтяОценки силуэтаМасштабирование перед кластеризациейПовторение: зоны доставки3Анализ кластеров
Профилирование кластеровЦентры в реальных единицахКластеры и известные меткиКогда K-Means не справляетсяПовторение: дегустация чая9Кластеры в работе
Сегменты клиентовКластеры как признакиЦвета изображенийПовторение: настроение плейлистовПотренируйтесь самостоятельно: Онлайн-компилятор Python