Mejores Prácticas de Machine Learning
Una lista de verificación de reglas para construir modelos de ML clásicos reproducibles y sin fugas de datos. Revísala antes de cada ejecución de entrenamiento y durante la revisión del código.
Cómo Usar Esta Lista
- Aplica las reglas A-C antes de escribir el código de entrenamiento.
- Las reglas D-F rigen la evaluación y la selección del modelo.
- Las reglas G-H cubren el despliegue y el mantenimiento.
- Revisa después de cada cambio en el esquema de datos o nueva fuente de características.
A - Higiene de Datos
- Dividir los datos antes del preprocesamiento. Ajusta escaladores, codificadores y selectores de características solo en los pliegues de entrenamiento; nunca en el conjunto de datos completo o en el conjunto de prueba.
- Bloquear un conjunto de prueba reservado. Toca este conjunto una sola vez para la evaluación final después de que se hayan tomado todas las decisiones sobre el modelo e hiperparámetros.
- Usar divisiones estratificadas para clasificación. Conserva las proporciones de clases cuando alguna clase sea inferior al 10% de las filas.
- Dividir por grupo para entidades repetidas. Usa
GroupKFoldcuando varias filas compartan un ID de usuario, paciente o sesión. - Documentar la procedencia de los datos. Registra la fuente, la fecha de extracción, los filtros aplicados y los recuentos de filas en un registro de experimentos.
B - Ingeniería de Características
- Excluir columnas posteriores al resultado. Elimina características que solo se conocen después del objetivo de predicción (fuga de datos).
- Encapsular transformaciones en un Pipeline. Agrupa el preprocesamiento con el modelo para que la validación cruzada y el despliegue apliquen pasos idénticos.
- Manejar categorías desconocidas en la inferencia. Usa
OneHotEncoder(handle_unknown="ignore")o el soporte nativo para categóricas en bibliotecas de boosting. - Imputar antes de escalar. Los valores faltantes deben rellenarse antes de
StandardScalero modelos basados en distancia. - Forzar el orden de las columnas en la inferencia. Pasa
X[expected_columns]antes depredictpara evitar desalineaciones silenciosas.
C - Modelado
- Comenzar con una línea base simple. Regresión logística o random forest antes de gradient boosting o deep learning.
- Establecer semillas aleatorias en todas partes.
random_state=42en divisiones, modelos y búsquedas para experimentos reproducibles. - Emparejar algoritmos con el tipo de problema. Métricas de regresión para objetivos continuos; métricas de clasificación para categorías.
- Usar pesos de clase o SMOTE para desequilibrio. No confíes en la precisión cuando la clase positiva es rara.
- Serializar el pipeline completo.
joblib.dump(pipe, ...)- no solo el paso del clasificador.
D - Evaluación
- Elegir métricas alineadas con el coste empresarial. PR-AUC para positivos raros; MAE para errores de regresión interpretables.
- Ajustar umbrales en datos de validación. El valor por defecto de 0.5 rara vez es óptimo para clasificación desequilibrada.
- Informar métricas por clase. Una única F1 o precisión oculta fallos en las clases minoritarias.
- Comparar contra la línea base. Cada nuevo modelo debe superar la referencia simple para justificar la complejidad.
- Verificar la brecha entre entrenamiento y prueba. Una brecha grande indica sobreajuste; reduce la capacidad o añade regularización.
E - Ajuste de Hiperparámetros
- Buscar dentro de la validación cruzada. Nunca elijas hiperparámetros usando el rendimiento del conjunto de prueba.
- Emparejar la puntuación con la métrica de despliegue. Optimiza
f1,roc_auconeg_mean_absolute_error- no la precisión por defecto. - Limitar el presupuesto de búsqueda. Usa la poda de Optuna o la búsqueda aleatoria en lugar de rejillas exhaustivas en 5 o más parámetros.
- Registrar cada prueba. Graba parámetros, puntuación de CV, duración y versión de datos para auditoría.
F - Reproducibilidad
- Fijar versiones de paquetes. Registra las versiones de scikit-learn, pandas y la biblioteca de boosting en los metadatos del artefacto.
- Versionar datos de entrenamiento. Haz hash del conjunto de entrenamiento o usa DVC para vincular modelos a instantáneas exactas de datos.
- Rastrear experimentos. Registra parámetros, métricas y artefactos en MLflow, W&B o un sistema equivalente.
- Escribir pruebas para la inferencia. Asegura que
pipe.predict(sample)devuelva la forma y el tipo de datos esperados.
Preguntas Frecuentes
¿Cuál es el error de ML más común?
- Entrenar preprocesadores en el conjunto de datos completo antes de dividirlo.
- Infla las puntuaciones de CV y de prueba; el modelo falla en producción con datos nuevos.
- Solución: usar
Pipeliney el orden de división correcto.
¿Cuándo puedo tocar el conjunto de prueba?
- Una vez, después de que todas las decisiones de modelado sean finales.
- Para una única estimación imparcial de generalización.
- Si lo ajustas, obtén un nuevo conjunto de prueba.
¿Siempre necesito validación cruzada?
- Sí, para comparar modelos y buscar hiperparámetros en conjuntos de datos de menos de 100k filas.
- Una única división es aceptable para datos muy grandes con métricas estables.
¿Deben los modelos de árbol usar escalado?
- No, random forest y boosting son invariantes a la escala.
- Aún así, codifica categóricas y maneja valores faltantes.
¿Cómo evito que los experimentos de notebook diverjan?
- Mueve el código de entrenamiento a scripts o módulos.
- Usa
random_state, dependencias fijadas y seguimiento de experimentos. - Revisa los notebooks buscando celdas que se ajustan a todos los datos.
¿Qué debe incluir una tarjeta de modelo?
- Descripción de los datos de entrenamiento, métricas, limitaciones y riesgos de sesgo.
- Lista de características, pasos de preprocesamiento y casos de uso previstos.
- Versión de sklearn y hash de la instantánea de datos.
¿Cuándo es seguro usar SMOTE?
- Dentro de
imblearn.pipeline.Pipelinedespués de la división de entrenamiento. - En características numéricas densas con desequilibrio moderado.
- Nunca en el conjunto de prueba.
¿Cómo reviso una PR de ML de un compañero?
- Verifica el orden de división, el uso de pipelines y la elección de métricas.
- Confirma que el conjunto de prueba no se usa en el ajuste.
- Ejecuta su script de entrenamiento y compara métricas.
¿Cuál es la estructura mínima viable de un proyecto de ML?
proyecto/
data/ # crudos y procesados (gitignored o DVC)
src/train.py # script de entrenamiento
src/predict.py # punto de entrada de inferencia
models/ # pipelines serializados
tests/ # pruebas de humo de inferencia¿Cuándo debo pasar de sklearn a deep learning?
- Cuando los datos son imágenes, audio, texto o secuencias largas.
- Los datos tabulares de menos de 100k filas rara vez se benefician de redes neuronales.
- Prueba primero gradient boosting en datos estructurados.
¿Con qué frecuencia debo reentrenar?
- Cuando la monitorización detecta deriva de datos o degradación de métricas.
- En un horario que coincida con la rapidez con que cambia el mundo.
- No con cada nueva fila; el reentrenamiento por lotes suele ser suficiente.
¿Qué pruebas debe tener el código de inferencia?
def test_pipeline_predicts(sample_row):
pred = pipe.predict(sample_row)
assert pred.shape == (1,)- Prueba de humo con un par de entrada-salida conocido.
- Asegura que los nombres de las columnas coincidan con el esquema de entrenamiento.
Relacionado
- Pipelines - preprocesamiento sin fugas de datos
- Conjuntos de Datos y Divisiones - estrategias de división adecuadas
- Evaluación de Modelos - selección de métricas
- Seguimiento de Experimentos - registro de ejecuciones
- Monitorización y Deriva - salud en producción
Versiones del Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.