Ir al contenido
wannacode

Modelos: aprender de ejemplos

En resumen: Un modelo de machine learning aprende la regla a partir de ejemplos (características X y objetivo y) con fit, predice con predict y se comprueba con los datos de prueba frente a una línea base.

Problema

«¿Cuánta gente pongo en el almacén?»

La jefa hace el horario del almacén para la semana que viene: cuánta gente recibe y empaqueta los pedidos cada día. Hasta ahora lo calcula a ojo. Quiere un número para cada día. Aquí están los pedidos del último año, por días:

Pythondatos: las tablas de la tienda

Son 365 días, y llegan de media 30,45 pedidos por día. Contamos todos los pedidos, también los cancelados: la pregunta es cuántos llegan, y un pedido cancelado también se recibe y se tramita. Junto a cada día están el día de la semana (0 es lunes, 6 es domingo) y el mes. ¿Cómo sacas, a partir de estos ejemplos, un número para el viernes 6 de noviembre?

La idea

Primero la pregunta

Antes del modelo preguntas qué decisión vas a tomar con la predicción. Aquí es cuánta gente poner cada día. De ahí salen tres cosas:

  • Qué predices. El número de pedidos del día, no los ingresos: el empaquetado depende de los pedidos.
  • Qué sabes de antemano. El horario se hace el domingo. Entonces conoces el día de la semana y el mes de cada día. Cuántos pedidos llegarán hasta el mediodía del miércoles no lo sabes.
  • Qué exactitud necesita. La suficiente para no cambiar la decisión: si la predicción se equivoca en menos de lo que atiende una persona, el horario es el mismo.

Si el horario no cambia sea cual sea la predicción, no necesitas un modelo.

La idea

Un modelo es una función aprendida de ejemplos

Un modelo es una función: le das el día y devuelve una predicción. No escribes la regla. Das ejemplos, días con su número de pedidos conocido, y el modelo encuentra solo una regla que se ajuste a ellos. La entrada se llama características y se escribe X. Lo que predices es el objetivo, y.

El día de la semana es un número de 0 a 6, pero no es una cantidad: el domingo (6) no es «tres veces el miércoles» (2). Por eso cada valor se convierte en su propia columna de 0 y 1. Es la codificación one-hot, y pd.get_dummies la hace:

Pythondatos: las tablas de la tienda

Son 19 columnas: 7 para los días y 12 para los meses. El 1 de noviembre de 2025 es sábado, así que su fila tiene un 1 solo en weekday_5 (y en month_11, que está más a la derecha).

La idea

fit, predict y la prueba

Los modelos de scikit-learn tienen los mismos dos pasos:

  • fit(X, y) aprende de los ejemplos;
  • predict(X) da una predicción para filas nuevas.

Si el modelo es bueno lo compruebas con días que no ha visto. train_test_split baraja las filas y las divide: el 75 % es para el entrenamiento y el 25 % para la prueba. Con random_state=42 la división es la misma en cada ejecución. La primera carga de scikit-learn (junto con scipy) descarga unos 18 MB y tarda unos segundos:

Pythondatos: las tablas de la tienda

El modelo aprende de 273 días, y 92 días son para la prueba. En ellos se equivoca en 4,38 pedidos al día de media: el promedio de las diferencias entre el hecho y la predicción, sin signo. En los días de entrenamiento el error es 4,09. Allí el modelo siempre se ve mejor, porque ha visto las respuestas. Por eso el número que informas es el de la prueba.

LinearRegression es un modelo que suma un número por cada columna. Cómo los encuentra está en la próxima lección. Aquí solo importan fit y predict, y son iguales en cualquier modelo.

Más precisamente, para curiosos

Los días están ordenados en el tiempo, y train_test_split los baraja. Aquí es una simplificación: el modelo aprende sobre septiembre también con días posteriores al día de prueba. En la próxima lección verás por qué en una predicción es más honesto dividir por tiempo: entrenas con los meses anteriores y compruebas con los posteriores. Cómo aprende un modelo a mano, sin biblioteca, está en la lección Regresión lineal del curso de IA.

La idea

Primero una línea base

¿Es bueno un error de 4,38 pedidos? Sin comparar no lo sabes. Comparas con una línea base (baseline): una predicción sin modelo, que a cualquiera se le ocurriría. Por ejemplo «siempre la media». DummyRegressor es justo eso, con los mismos fit y predict:

Pythondatos: las tablas de la tienda

La línea base dice 30,34 para cada día: la media de los días de entrenamiento. Se equivoca en 5,76 pedidos, y el modelo en 4,38. El modelo es 1,38 pedidos más exacto, con un error un 24 % menor. Tiene sentido.

Un modelo que no supera la línea base no vale nada. Es código, datos y mantenimiento, y da tanto como «siempre 30». Por eso la línea base va primero. Otra buena línea base es lo que hace la gente ahora, por ejemplo «tantos como el mismo día de la semana pasada».

Pruébalo

La regla «como la semana pasada»

1. El modelo predice cuántos pedidos llegan en un día a partir del día de la semana y el mes. ¿Qué es y?

Ahora mismo la jefa planifica «tantos como el mismo día de la semana pasada». ¿Cuánto se equivoca esta regla en los días de prueba? Pon en last_week los pedidos de 7 días antes para cada día, y en err el error medio sin signo en los días de y_test.

Pythondatos: las tablas de la tienda

Ejercicio

¿Basta el día? Y el plan para la semana que viene

¿Basta el día de la semana solo, sin el mes? Entrena LinearRegression solo con las columnas de día de la semana de X_train. Pon en err el error medio en los días de prueba, en base el error de «siempre la media del entrenamiento» y en beats si el modelo la supera.

Pythondatos: las tablas de la tienda

La prueba dijo que el modelo con el día y el mes supera la línea base. Ahora la predicción para la semana real, del lunes 2 al domingo 8 de noviembre de 2026. Entrena el modelo otra vez con los 365 días, crea X_new con las columnas de X y pon en plan la predicción para cada día (una Series con las fechas como índice).

Pythondatos: las tablas de la tienda

Test

Ponte a prueba

1. El modelo se equivoca en 4,09 pedidos de media en los días de entrenamiento y en 4,38 en los días de prueba. ¿Qué número le dices a la jefa?
2. Un modelo nuevo se equivoca en 5,9 pedidos al día de media, y «siempre la media» en 5,76. ¿Qué haces?
3. ¿Por qué el día de la semana entra al modelo como 7 columnas de 0 y 1 y no como un número de 0 a 6?
4. El horario del almacén se hace el domingo para toda la semana siguiente. ¿Puede ser una característica «los pedidos hasta el mediodía del mismo día»?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·