Entendiendo el conjunto de entrenamiento y de test: por qué se divide un dataset
Introducción
Cuando empezamos en Machine Learning, una de las primeras preguntas que aparece es esta:
¿Por qué no usar todos los datos para entrenar el modelo?
A primera vista parece lógico usar todo:
- más datos,
- más información,
- mejor entrenamiento.
Pero hay un problema importante.
Si entrenas y evalúas el modelo con los mismos datos, no sabes si el modelo realmente aprendió un patrón general o si simplemente memorizó los ejemplos que ya vio.
Por eso dividimos el dataset en dos partes:
- conjunto de entrenamiento (training set)
- conjunto de prueba (test set)
La idea es simple:
- con una parte de los datos el modelo aprende,
- con la otra parte verificamos si el modelo generaliza bien sobre datos que nunca vio.
1. ¿Qué es el conjunto de entrenamiento?
Es la parte de los datos que usamos para que el modelo aprenda.
Ahí el algoritmo ajusta sus parámetros internos:
- pesos,
- coeficientes,
- reglas de decisión,
- o la estructura matemática que necesita para hacer predicciones.
En otras palabras:
el conjunto de entrenamiento es el material con el que el modelo “practica”.
2. ¿Qué es el conjunto de test?
Es la parte de los datos que no se usa durante el entrenamiento.
Se guarda aparte para el final.
Después de entrenar el modelo, usamos ese conjunto para hacer una pregunta clave:
“¿Qué tan bien funciona este modelo sobre ejemplos nuevos?”
Eso lo vuelve valioso, porque simula lo que pasará en el mundo real.
En producción, el modelo siempre verá datos nuevos, no los mismos con los que fue entrenado.
3. Ejemplo intuitivo sin código
Imagina que estás estudiando para un examen.
Tienes 100 ejercicios.
Opción A: estudiar y evaluarte con las mismas 100 preguntas
Resuelves esos 100 ejercicios varias veces hasta aprenderlos de memoria. Luego te haces una “prueba” usando exactamente esas mismas preguntas.
Probablemente te vaya muy bien.
Pero eso no significa necesariamente que entendiste el tema. Tal vez solo recuerdas las respuestas.
Opción B: estudiar con 80 ejercicios y evaluarte con 20 nuevos
Ahora usas:
- 80 ejercicios para practicar,
- 20 ejercicios distintos para evaluarte.
Si te va bien en esos 20 que no habías visto, ahí sí tienes una señal mucho más confiable de que realmente entendiste.
Eso mismo pasa en Machine Learning:
- train = ejercicios con los que practicas,
- test = ejercicios nuevos con los que compruebas si aprendiste de verdad.
4. ¿Por qué es necesario dividir los datos?
1. Para medir generalización
El objetivo real de un modelo no es rendir bien sobre datos viejos. El objetivo es rendir bien sobre datos nuevos.
El conjunto de test nos da una estimación de esa capacidad.
2. Para detectar sobreajuste (overfitting)
Un modelo puede funcionar excelente en entrenamiento y mal en test. Eso significa que aprendió demasiado los detalles del dataset de entrenamiento y no generaliza bien.
En ese caso decimos que hubo sobreajuste.
3. Para tener una evaluación honesta
Si el modelo ya vio los datos durante el entrenamiento, la evaluación queda “contaminada”. No sería una medida real del desempeño.
5. ¿Qué pasa si no separo train y test?
Si no haces la división, puedes caer en una conclusión engañosa:
“Mi modelo tiene 98% de acierto”
pero ese 98% puede estar medido sobre los mismos datos usados para entrenar. Entonces no sabes si el modelo:
- aprendió de verdad,
- o simplemente memorizó.
Por eso la separación entre entrenamiento y test no es un detalle técnico menor. Es una parte esencial del proceso.
6. Proporciones comunes de división
No existe una única regla, pero algunas divisiones habituales son:
- 80% entrenamiento / 20% test
- 70% entrenamiento / 30% test
- 75% entrenamiento / 25% test
La elección depende de:
- cuántos datos tienes,
- qué tan complejo es el problema,
- y cuánto quieres reservar para evaluación.
En datasets pequeños, a veces se usan técnicas como validación cruzada, pero para empezar la división train/test es la base.
7. Ahora sí: dividir los datos con sklearn
En scikit-learn, la función más usada para esto es:
from sklearn.model_selection import train_test_split
Esta función toma tus datos y los divide automáticamente en entrenamiento y prueba.
8. Ejemplo práctico con un dataset pequeño
Supongamos que tenemos datos de casas y queremos predecir el precio.
import pandas as pd
from sklearn.model_selection import train_test_split
# Dataset simple
df = pd.DataFrame({
'm2': [50, 60, 75, 80, 90, 100, 110, 120, 130, 140],
'habitaciones': [1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
'antiguedad': [20, 18, 15, 12, 10, 8, 6, 5, 3, 2],
'precio': [100, 120, 150, 160, 180, 200, 220, 250, 270, 300]
})
# Variables de entrada (features)
X = df[['m2', 'habitaciones', 'antiguedad']]
# Variable objetivo
y = df['precio']
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=42
)
print('X_train:')
print(X_train)
print('\nX_test:')
print(X_test)
print('\ny_train:')
print(y_train)
print('\ny_test:')
print(y_test)
9. ¿Qué hace exactamente train_test_split?
En este ejemplo:
Xcontiene las variables de entradaycontiene lo que queremos predecirtest_size=0.2significa que el 20% de los datos irá a testrandom_state=42fija la división aleatoria para que siempre salga igual
Como tenemos 10 filas:
- 8 filas van a entrenamiento,
- 2 filas van a test.
Eso significa que el modelo aprenderá con 8 ejemplos y luego será evaluado con 2 ejemplos que no vio.
10. ¿Qué devuelve la función?
La función devuelve cuatro objetos:
X_train, X_test, y_train, y_test
Significado:
X_train: entradas para entrenarX_test: entradas para evaluary_train: salidas reales correspondientes aX_trainy_test: salidas reales correspondientes aX_test
Es importante que X e y se dividan de manera consistente.
Si una casa queda en entrenamiento, su precio también debe quedar en entrenamiento.
11. Forma más compacta de verificar la división
Muchas veces no necesitas imprimir todas las filas. Puedes verificar tamaños:
print('Tamaño de X_train:', X_train.shape)
print('Tamaño de X_test:', X_test.shape)
print('Tamaño de y_train:', y_train.shape)
print('Tamaño de y_test:', y_test.shape)
Salida esperada:
Tamaño de X_train: (8, 3)
Tamaño de X_test: (2, 3)
Tamaño de y_train: (8,)
Tamaño de y_test: (2,)
Interpretación:
- 8 ejemplos para entrenar,
- 2 ejemplos para probar,
- 3 variables de entrada en
X.
12. Después de dividir, ¿qué sigue?
El flujo típico es:
- dividir los datos,
- entrenar el modelo con
X_trainyy_train, - predecir sobre
X_test, - comparar la predicción con
y_test.
13. Idea clave para recordar
La división train/test no se hace para complicar el trabajo. Se hace para responder una pregunta fundamental:
“¿Mi modelo funciona bien solo con datos conocidos, o también con datos nuevos?”
Esa diferencia es la base de un buen modelo de Machine Learning.
Conclusión
Separar un dataset en entrenamiento y test es una práctica esencial porque:
- permite entrenar y evaluar de forma correcta,
- ayuda a detectar sobreajuste,
- mide mejor la capacidad de generalización,
- simula lo que ocurrirá en producción.
En resumen:
- train sirve para aprender,
- test sirve para comprobar si realmente aprendió.
Y en Python, la forma más común de hacerlo es con:
from sklearn.model_selection import train_test_split
Frase final para el post
Entrenar con todos los datos puede hacerte sentir confiado. Evaluar con datos nuevos es lo que realmente te dice si el modelo aprendió.