typestar

Clases desbalanceadas en Python

Cuando una clase es rara, la exactitud miente y hay que declarar los pesos.

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import recall_score
from sklearn.utils.class_weight import compute_class_weight

rng = np.random.default_rng(0)
X = rng.normal(size=(200, 2))
y = (rng.random(200) < 0.1).astype(int)

pesos = compute_class_weight("balanced", classes=np.array([0, 1]), y=y)
print(pesos.round(2))

simple = LogisticRegression().fit(X, y)
ponderado = LogisticRegression(class_weight="balanced").fit(X, y)
print(f"recall simple    {recall_score(y, simple.predict(X)):.3f}")
print(f"recall ponderado {recall_score(y, ponderado.predict(X)):.3f}")

Cómo funciona

  1. Poner class_weight en balanced escala la pérdida por frecuencia.
  2. compute_class_weight muestra los números que usa.
  3. Evalúa un modelo así con recall o AUC, no con exactitud.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
16
Caracteres a escribir
614
Tokens
172
Ritmo de tres estrellas
115 tpm

Al ritmo de tres estrellas de 115 tokens por minuto, este intento toma unos 90 segundos.

Escribe este fragmento

Paso 2 de 3 en Más allá de lo básico; paso 23 de 25 en Machine learning con scikit-learn.

← Anterior Siguiente →