ia machine learning python estadística

Conjunto de entrenamiento y de test: por qué dividir un dataset

Qué es el training set y el test set, por qué son claves para evitar sobreajuste y cómo dividir datos en Python con train_test_split de scikit-learn.

Por Compujuy · ·
- vistas
Conjunto de entrenamiento y test en Machine Learning

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:

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:

La idea es simple:


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:

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:

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:


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:

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:

La elección depende de:

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:

Como tenemos 10 filas:

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:

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:


12. Después de dividir, ¿qué sigue?

El flujo típico es:

  1. dividir los datos,
  2. entrenar el modelo con X_train y y_train,
  3. predecir sobre X_test,
  4. 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:

  1. permite entrenar y evaluar de forma correcta,
  2. ayuda a detectar sobreajuste,
  3. mide mejor la capacidad de generalización,
  4. simula lo que ocurrirá en producción.

En resumen:

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ó.


Más sobre ia Probar Yagware gratis