0Pricing
Python Academy · Lección

Evaluación de modelos y validación cruzada

Evalúe modelos con accuracy, F1, ROC-AUC y validación cruzada k-fold.

Evaluación de modelos y validación cruzada es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.

División en entrenamiento, validación y prueba

Use una división en tres partes: entrenamiento para ajustar el modelo, validación para ajustar los hiperparámetros y prueba para informar del rendimiento final. No use nunca el conjunto de prueba durante el desarrollo.

from sklearn.model_selection import train_test_split
import numpy as np

X = np.random.rand(1000, 10)
y = (X[:,0] > 0.5).astype(int)

X_tr, X_rest, y_tr, y_rest = train_test_split(X, y, test_size=0.3)
X_val, X_te, y_val, y_te = train_test_split(X_rest, y_rest, test_size=0.5)

Puntuación de exactitud

accuracy_score es la fracción de predicciones correctas. Úsela con clases equilibradas; para datos desequilibrados, prefiera F1 o AUC.

from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = LogisticRegression().fit(X_tr, y_tr)
print("Accuracy:", accuracy_score(y_te, model.predict(X_te)))

Precisión, exhaustividad y F1

Para clases desequilibradas: precisión = TP/(TP+FP), exhaustividad = TP/(TP+FN), F1 = media armónica de la precisión y la exhaustividad.

from sklearn.metrics import precision_score, recall_score, f1_score, classification_report

# Use classification_report for a full summary:
print(classification_report(y_te, model.predict(X_te)))
# shows precision, recall, f1 for each class

Matriz de confusión

Una matriz de confusión muestra los verdaderos positivos, los falsos positivos, los verdaderos negativos y los falsos negativos.

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt

cm = confusion_matrix(y_te, model.predict(X_te))
print(cm)
# [[TN FP]
#  [FN TP]]

Curva ROC y AUC

roc_auc_score mide el área bajo la curva ROC. AUC = 1.0 es perfecto; 0.5 equivale a una clasificación aleatoria.

from sklearn.metrics import roc_auc_score, roc_curve

y_prob = model.predict_proba(X_te)[:,1]
print("AUC:", roc_auc_score(y_te, y_prob))

fpr, tpr, thresholds = roc_curve(y_te, y_prob)
# plot fpr vs tpr for the full ROC curve

Métricas de regresión

Use mean_squared_error (MSE), root_mean_squared_error (RMSE) y r2_score para las tareas de regresión.

from sklearn.metrics import mean_squared_error, r2_score

y_pred = regression_model.predict(X_te)
mse = mean_squared_error(y_te, y_pred)
print("RMSE:", mse**0.5)
print("R²:", r2_score(y_te, y_pred))

Validación cruzada k-fold

cross_val_score divide los datos en k folds, entrena con k-1, evalúa con 1 y repite el proceso k veces. Es más robusta que una única división.

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

X, y = make_classification(random_state=0)
scores = cross_val_score(LogisticRegression(), X, y, cv=10, scoring="accuracy")
print(f"{scores.mean():.3f} ± {scores.std():.3f}")

StratifiedKFold

Use StratifiedKFold para garantizar que cada fold tenga la misma distribución de clases, algo crucial para los conjuntos de datos desequilibrados.

from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

X, y = make_classification(weights=[0.9,0.1], random_state=0)
cv = StratifiedKFold(n_splits=5)
scores = cross_val_score(LogisticRegression(), X, y, cv=cv, scoring="f1")
print("Stratified F1:", scores.mean())

Equilibrio entre sesgo y varianza

Un sesgo alto implica subajuste (el modelo es demasiado simple). Una varianza alta implica sobreajuste (el modelo es demasiado complejo). La validación cruzada revela cuál de estos problemas tiene.

# Underfitting: low train score AND low val score
# → increase model complexity, add features

# Overfitting: high train score, low val score
# → regularise, reduce complexity, get more data

from sklearn.model_selection import validation_curve
import numpy as np

train_sc, val_sc = validation_curve(DecisionTreeClassifier(), X, y, param_name="max_depth", param_range=range(1,10))

Validación cruzada anidada

Para ajustar hiperparámetros y evaluar el modelo sin sesgos, use una validación cruzada anidada: el bucle interno ajusta y el externo evalúa.

from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification

X, y = make_classification(random_state=0)
gs = GridSearchCV(SVC(), {"C":[0.1,1,10]}, cv=5)
outer_scores = cross_val_score(gs, X, y, cv=5)
print("Nested CV accuracy:", outer_scores.mean())

Calibración

Las estimaciones de probabilidad de un clasificador pueden estar mal calibradas. Use CalibratedClassifierCV para obtener mejores estimaciones de probabilidad.

from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y)

cal = CalibratedClassifierCV(SVC(), cv=5).fit(X_tr, y_tr)
print(cal.predict_proba(X_te[:3]))

Comprobación rápida

¿Por qué se prefiere la validación cruzada a una única división de entrenamiento y prueba para evaluar modelos?

Resumen

Use la exactitud para problemas equilibrados y F1/AUC para problemas desequilibrados. Evalúe con cross_val_score mediante k-fold, use StratifiedKFold para datos desequilibrados y emplee validación cruzada anidada al ajustar hiperparámetros para obtener una estimación final sin sesgos. No consulte nunca el conjunto de prueba durante el desarrollo.

Preguntas frecuentes

¿La lección «Evaluación de modelos y validación cruzada» es gratis?

Sí — el texto completo de «Evaluación de modelos y validación cruzada» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Evaluación de modelos y validación cruzada»?

Evalúe modelos con accuracy, F1, ROC-AUC y validación cruzada k-fold. Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Python Academy?

No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Evaluación de modelos y validación cruzada»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Python Academy?

Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. La API de scikit-learn: fit, transform y predict
  2. Modelos lineales: regresión y clasificación
  3. Modelos basados en árboles: árboles de decisión y bosques aleatorios
  4. Evaluación de modelos y validación cruzada
← Volver a Python Academy