Menu
CoddyTech

Les clusters comme caractéristiques

Fait partie de la section Apprentissage non supervisé du Journey Machine Learning de Coddy. Leçon 40 sur 51.

Un modèle linéaire ne peut pas se courber. Le signal téléphonique dans trois villages s’affaiblit à mesure que l’on s’éloigne du relais de chaque village, une forme que la position seule ne permet pas de représenter :

135 maisons dans trois villages, vers l’est à l’horizontale et vers le nord en haut, chaque village autour d’une croix noire, son centre k-means. Des lignes pointillées relient une maison rouge aux trois centres : 4.9 km, 5.2 km et, le plus proche, 1.0 km

k-means trouve les villages. km.transform donne la distance de chaque ligne à chaque centre, et .min(axis=1) conserve le plus proche :

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

Avec cette colonne supplémentaire, le R carré de test d’un modèle linéaire passe de 0.000 à 0.886.

Ajuste k-means uniquement sur les lignes d’entraînement, comme un scaler, puis transformez les deux ensembles.

challenge icon

Défi

Moyen

L’équipe son d’un festival veut savoir quel est le niveau sonore là où les gens se tiennent. Le code de départ sépare crowd.csv, lit k et affiche le score obtenu en utilisant uniquement la position.

  1. Ajuste un modèle k-means avec k clusters sur les positions d’entraînement.
  2. Ajoute la distance de chaque ligne à son centre le plus proche comme troisième colonne, dans les deux ensembles.
  3. Affiche le nouveau R² de test et le gain, avec 3 décimales.

Pour un autre festival et k = 4 :

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

Essayez vous-même

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 festivaliers : leur position (m) et le niveau sonore à cet endroit (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())


# Ajuste une régression linéaire sur les colonnes d’entraînement et renvoie son R carré sur les colonnes de 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}")

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Apprentissage non supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne