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
- Poner
class_weighten balanced escala la pérdida por frecuencia. compute_class_weightmuestra los números que usa.- Evalúa un modelo así con recall o AUC, no con exactitud.
Palabras clave y builtins usados aquí
asintprint
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.
Paso 2 de 3 en Más allá de lo básico; paso 23 de 25 en Machine learning con scikit-learn.