Scores de silhouette
Fait partie de la section Apprentissage non supervisé du Journey Machine Learning de Coddy. Leçon 8 sur 51.
L’inertie s’améliore toujours avec k, il faut donc trouver un coude. La silhouette pose une question plus juste à chaque point : suis-je plus proche de mon propre groupe que du suivant ?
Un point obtient le score (b - a) / max(a, b) : proche de 1 lorsqu’il est bien intégré à son groupe, proche de 0 à la frontière, inférieur à 0 dans le mauvais groupe. La moyenne des scores évalue un regroupement :
from sklearn.metrics import silhouette_score
for k in [2, 3, 4]:
km = KMeans(n_clusters=k, n_init=10, random_state=0)
km.fit(X)
print(k, f"{silhouette_score(X, km.labels_):.3f}")Pour les pommes, cela affiche :
2 0.534
3 0.657
4 0.545Il atteint son maximum pour le meilleur k, ici 3, où les points semblent le plus à leur place.
Défi
FacileDeux prévisionnistes ne sont pas d’accord sur le nombre de types de tempêtes qui frappent leur côte. Le code de départ contient 150 tempêtes, avec le vent maximal et les précipitations, et lit le k d’Ana, puis celui de Ben.
- Évalue chaque k avec le coefficient silhouette, à 3 décimales.
- Affiche quel k convient le mieux.
- Affiche le meilleur k de 2 à 8, avec son score.
Pour une autre côte :
Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)Essayez vous-même
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# Ne modifiez pas les lignes ci-dessous
rng = np.random.default_rng(6)
# Quatre types de tempêtes : vent et pluie habituels, et nombre de tempêtes pour chaque type
kinds = [(30, 8, 40), (12, 34, 35), (21, 21, 30), (11, 9, 45)]
parts = []
for w, r, n in kinds:
parts.append(np.column_stack([rng.normal(w, 2.5, n), rng.normal(r, 3, n)]))
# 150 tempêtes sur une même côte, une par ligne : vitesse maximale du vent (m/s) et précipitations (mm par heure)
storms = np.round(np.concatenate(parts), 1)
# Les nombres de types de tempêtes estimés par les deux prévisionnistes
k_ana = int(input())
k_ben = int(input())
# Écrivez votre code ci-dessous
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é
1Découvrir des groupes
Apprendre sans étiquettesMesurer la similaritéK-Means à la mainK-Means avec scikit-learnRécapitulatif : les membres de la salle de sport4Classification hiérarchique
Fusion étape par étapeModèles agglomératifsDendrogrammesRécapitulatif : races de chiens7L’ACP en pratique
Visualiser 64 dimensionsLes composantes comme motifsCompresser et reconstruireL’ACP avant un modèleRécapitulatif : scanner de visages10Projet : Explorateur de chiffres
Observer les chiffresRéduire avec la PCARegrouper les chiffresNommer les groupesRepérer les intrus2Choisir k
InertieLa méthode du coudeScores de silhouetteMettre à l’échelle avant le clusteringRécapitulatif : zones de livraisonEntraînez-vous par vous-même : Compilateur Python en ligne