Saltar al contenido

# fundamentos-de-scikit-learn

Fundamentos de Scikit-learn

Volver a la portada del curso
Lectura (Markdown)

Métricas de Evaluación

Sección 4 · Evaluación de Modelos

Métricas de evaluación

El modelo de PyEnvíos acierta en 88.8 % de las entregas de test. Suena bien hasta que se compara con un DummyClassifier que responde siempre «a tiempo»: ese acierta en 73.2 % sin mirar ningún dato, porque el 73.2 % de las entregas llegan a tiempo. Una sola cifra no dice si el modelo sirve. Esta lectura recorre las métricas de sklearn.metrics que sí lo dicen, todas con el pipeline de regresión logística de la lección anterior.

La matriz de confusión

Todo empieza por contar aciertos y errores por tipo. En scikit-learn las filas son la clase real y las columnas la predicha, en el orden 0, 1:

from sklearn.metrics import confusion_matrix

pred = pipe.predict(X_te)
print(confusion_matrix(y_te, pred))
# [[354  12]
#  [ 44  90]]

De las 366 entregas a tiempo, 354 se predijeron bien (verdaderos negativos, TN) y 12 se marcaron como tarde sin serlo (falsos positivos, FP). De las 134 tardías, el modelo detectó 90 (verdaderos positivos, TP) y se le escaparon 44 (falsos negativos, FN). El Dummy tendría 366 TN, 134 FN y cero en lo demás.

Precision, recall y F1

Con esos cuatro números se definen las métricas de la clase positiva (tarde = 1):

$$\text{precision} = \frac{TP}{TP + FP} \qquad \text{recall} = \frac{TP}{TP + FN} \qquad F_1 = \frac{2 \cdot \text{precision} \cdot \text{recall}}{\text{precision} + \text{recall}}$$

  • Precision 0.882 ($90/102$): cuando el modelo avisa «llegará tarde», acierta 88 de cada 100 veces.
  • Recall 0.672 ($90/134$): de todas las entregas que sí llegaron tarde, detecta dos de cada tres.
  • F1 0.763: la media armónica de ambas; castiga que una de las dos sea baja.

El Dummy tiene recall 0: no detecta ninguna tardía. Esa es la cifra que revela que no sirve. classification_report(y_te, pred, digits=3) imprime todo junto, por clase, con el support (366 y 134) y los promedios macro avg y weighted avg.

Probabilidades y ROC AUC

Las métricas anteriores dependen del umbral con el que predict decide (0.5). El ROC AUC se calcula con las probabilidades y mide otra cosa: la probabilidad de que una entrega tardía elegida al azar reciba una puntuación mayor que una a tiempo elegida al azar. 0.5 es azar (el Dummy tiene 0.500) y 1.0 es un orden perfecto.

from sklearn.metrics import roc_auc_score

proba = pipe.predict_proba(X_te)[:, 1]
print(round(roc_auc_score(y_te, proba), 3))   # 0.927

Ojo: roc_auc_score recibe la columna de probabilidad de la clase 1, no la salida de predict.

Mover el umbral

Para PyEnvíos, una tardía no detectada (FN) cuesta más que una falsa alarma (FP): el cliente se queja sin aviso. Bajar el umbral a 0.3 hace que el modelo avise más:

pred3 = (proba >= 0.3).astype(int)
print(confusion_matrix(y_te, pred3))
# [[324  42]
#  [ 35  99]]

El recall sube de 0.672 a 0.739 (99 tardías detectadas en lugar de 90) y la precision baja de 0.882 a 0.702 (42 falsas alarmas en lugar de 12). El modelo es el mismo y el AUC no cambia; solo cambia la decisión. Elegir el umbral es una decisión de negocio, no de la librería.

Métricas de regresión

Si en lugar de «tarde» se predicen los minutos, se mide el tamaño del error:

$$\text{MAE} = \frac{1}{n}\sum |y_i - \hat y_i| \qquad \text{RMSE} = \sqrt{\frac{1}{n}\sum (y_i - \hat y_i)^2} \qquad R^2 = 1 - \frac{\sum (y_i - \hat y_i)^2}{\sum (y_i - \bar y)^2}$$

Con el mismo pre y una LinearRegression, el error medio absoluto es 6.77 minutos, el RMSE 8.55 y el $R^2$ 0.741. El DummyRegressor, que predice siempre la media, tiene MAE 13.01 y $R^2$ prácticamente 0. El MAE se lee en minutos; el RMSE castiga más los errores grandes; el $R^2$ dice qué fracción de la variación explica el modelo. Las funciones son mean_absolute_error, root_mean_squared_error y r2_score.

Trampas comunes

  • Reportar solo accuracy con clases desbalanceadas. Compárala siempre con el Dummy.
  • Invertir los argumentos. Todas las funciones reciben primero y_true y después la predicción; al revés, precision y recall se intercambian.
  • Pasar clases a roc_auc_score. Con predict en lugar de predict_proba el AUC sale más bajo y engañoso.
  • Elegir el umbral mirando el test. Ajústalo con validación cruzada o con un conjunto aparte; el test se usa una vez, al final.

El notebook metricas-de-evaluacion repite estos cálculos con la salida a la vista; como ejercicio, calcula precision y recall a mano desde la matriz y compáralos con las funciones. Antes de entrenar un modelo, decide qué error es más caro: esa decisión elige la métrica.

Recursos