Menu
CoddyTech

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 noir relié par des lignes pleines aux 8 points de son propre groupe, longueur moyenne a = 1.3, et par des lignes pointillées aux 8 points du groupe le plus proche, longueur moyenne b = 3.4. Sa silhouette est de 0.62

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.545

Il atteint son maximum pour le meilleur k, ici 3, où les points semblent le plus à leur place.

challenge icon

Défi

Facile

Deux 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.

  1. Évalue chaque k avec le coefficient silhouette, à 3 décimales.
  2. Affiche quel k convient le mieux.
  3. 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
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