Menu
CoddyTech

Agrupamentos como características

Parte da seção Aprendizado não supervisionado do Journey de Machine Learning da Coddy. Lição 40 de 51.

Um modelo de linha reta não consegue se curvar. O sinal de telefone em três vilarejos diminui com a distância em relação à antena de cada vilarejo, uma característica que apenas a posição não revela:

135 casas em três vilarejos, com leste na horizontal e norte para cima, cada vilarejo ao redor de uma cruz preta, seu centro de k-means. Linhas tracejadas ligam uma casa vermelha aos três centros: 4.9 km, 5.2 km e, o mais próximo, 1.0 km

k-means encontra as aldeias. km.transform fornece a distância de cada linha até todos os centros, e .min(axis=1) mantém o mais próximo:

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

Com essa coluna extra, o R ao quadrado de teste de um modelo linear sobe de 0.000 para 0.886.

Ajuste o k-means apenas às linhas de treinamento, como faria com um escalonador, e depois transforme os dois conjuntos.

challenge icon

Desafio

Médio

A equipe de som de um festival quer saber quão alto está o som onde as pessoas ficam. O código inicial divide crowd.csv, lê k e imprime a pontuação usando apenas a posição.

  1. Ajuste o k-means com k agrupamentos nas posições de treinamento.
  2. Adicione a distância de cada linha até seu centro mais próximo como uma terceira coluna, em ambos os conjuntos.
  3. Imprima o novo R quadrado de teste e o ganho, com 3 casas decimais.

Para outro festival e k = 4:

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

Experimente você mesmo

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 frequentadores do festival: onde estavam (m) e o nível sonoro naquele local (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())


# Ajusta uma regressão linear às colunas de treinamento e retorna seu R quadrado nas colunas de teste
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}")

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado não supervisionado

Pratique por conta própria: Compilador de Python online