Menu
CoddyTech

Puntuaciones de silueta

Parte de la sección Aprendizaje no supervisado del Journey de Machine Learning de Coddy. Lección 8 de 51.

La inercia siempre mejora al aumentar k, así que necesita un codo. La silueta plantea a cada punto una pregunta más justa: ¿estoy más cerca de mi propio grupo que del siguiente?

Un punto negro con líneas continuas hacia los 8 puntos de su propio grupo, longitud media a = 1.3, y líneas discontinuas hacia los 8 puntos del grupo más cercano, longitud media b = 3.4. Su silueta es 0.62

Un punto obtiene una puntuación de (b - a) / max(a, b): cerca de 1, está bien integrado en su grupo; cerca de 0, está en un límite; por debajo de 0, está en el grupo equivocado. El promedio puntúa una agrupación:

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}")

Para las manzanas, esto imprime:

2 0.534
3 0.657
4 0.545

Alcanza su máximo en el mejor valor de k, aquí 3, donde los puntos parecen estar más cómodos.

challenge icon

Desafío

Fácil

Dos pronosticadores no están de acuerdo sobre cuántos tipos de tormenta azotan su costa. El código inicial contiene 150 tormentas, el viento máximo y la lluvia, y lee primero la k de Ana y luego la de Ben.

  1. Calcula la puntuación de cada k mediante el coeficiente de silueta, con 3 decimales.
  2. Imprime cuál k se ajusta mejor.
  3. Imprime la mejor k entre 2 y 8, con su puntuación.

Para otra costa:

Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)

Pruébalo tú mismo

import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# No cambies las líneas siguientes
rng = np.random.default_rng(6)
# Cuatro tipos de tormenta: viento y lluvia típicos, y cuántas hay de cada tipo
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 tormentas en una costa, una por fila: viento máximo (m/s) y lluvia (mm por hora)
storms = np.round(np.concatenate(parts), 1)

# Los números de tipos de tormenta estimados por los dos meteorólogos
k_ana = int(input())
k_ben = int(input())

# Escribe tu código a continuación
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje no supervisado

Practica por tu cuenta: Compilador de Python online