Menu
CoddyTech

I cluster come caratteristiche

Fa parte della sezione Apprendimento non supervisionato del percorso Machine Learning di Coddy. Lezione 40 di 51.

Un modello lineare non può curvarsi. Il segnale telefonico in tre villaggi si attenua con la distanza dal ripetitore di ciascun villaggio, una forma che la sola posizione non mostra:

135 abitazioni in tre villaggi, con l'est a destra e il nord in alto; ciascun villaggio è raccolto intorno a una croce nera, il suo centro k-means. Linee tratteggiate collegano un'abitazione rossa a tutti e tre i centri: 4.9 km, 5.2 km e, il più vicino, 1.0 km

k-means trova i villaggi. km.transform restituisce la distanza di ogni riga da ciascun centro e .min(axis=1) mantiene quella più vicina:

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

Con quell’unica colonna in più, il coefficiente R quadrato di test di un modello lineare sale da 0.000 a 0.886.

Adatta k-means solo alle righe di addestramento, come faresti con uno scaler, poi trasforma entrambi gli insiemi.

challenge icon

Sfida

Medio

Il team audio di un festival vuole sapere quanto è alto il volume nei punti in cui si trovano le persone. Il codice iniziale suddivide crowd.csv, legge k e stampa il punteggio basato solo sulla posizione.

  1. Adatta k-means con k cluster alle posizioni di training.
  2. Aggiungi la distanza di ogni riga dal centro più vicino come terza colonna, in entrambi gli insiemi.
  3. Stampa il nuovo R quadrato sul test e il guadagno, con 3 decimali.

Per un altro festival e k = 4:

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

Provalo tu

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 partecipanti al festival: dove si trovavano (m) e il livello sonoro in quel punto (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())


# Adatta una regressione lineare alle colonne di addestramento e restituisce il suo R al quadrato sulle colonne di test
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}")

# Scrivi il tuo codice qui sotto
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento non supervisionato

Esercitati da solo: Compilatore Python online