# fundamentos-de-scikit-learn
Fundamentos de Scikit-learn
Volver a la portada del cursoMé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_truey después la predicción; al revés, precision y recall se intercambian. - Pasar clases a
roc_auc_score. Conpredicten lugar depredict_probael 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.