Saltar al contenido

lección 4

Miércoles: el primer modelo y leer el error en servicios/hora

Partir al azar y entrenar un bosque aleatorio: da un R² buenísimo de 0,91 y parece que lo clavaste. Nadie sabe aún por qué va tan bien.

⏱ 55 min

## Miércoles, 10:00. Por fin se entrena

Ayer dejaste la serie limpia, agregada y con todas sus pistas: la tabla de modelado. Hoy, por fin, se entrena. Para que todos los ejercicios de modelado partan del mismo punto exacto, cada uno empieza con el mismo bloque, ya hecho, que reconstruye la tabla de ayer desde serie_horaria.csv: 16.108 filas, su columna n_servicios (el target) y sus nueve features a 14 días (los tres lags, las dos medias que acaban hace 14 días, la hora, el día de la semana, el mes y el festivo), sin ningún hueco. La temperatura no está: a 14 días vista solo tendrías la previsión, y estos datos no la traen. En datos/ verás también serie_modelo.csv, una tabla montada antes con pistas de hace una hora: sirve para mirar la demanda, no para predecir a 14 días.

Entrenar un modelo tiene siempre la misma forma: se separan las features (las pistas, que llamamos X) del target (lo que se quiere predecir, que llamamos y), se parte la tabla en una parte para entrenar y otra para probar, se ajusta el modelo con la parte de entrenamiento y se mide su error con la parte de prueba —datos que no vio al aprender—. En scikit-learn, la librería de modelos de Python, la partición la hace una función que, por defecto, reparte las filas al azar. Y aquí viene lo importante: eso es exactamente lo que traes aprendido de tus tres encargos anteriores, donde cada fila era independiente y repartir al azar era lo correcto. Hoy lo haces igual que siempre. Lo que no sabes todavía es que en una serie eso tiene truco.

El split al azar reparte las horas por toda la serie, así que cada hora de prueba queda con vecinas suyas en el entrenamiento. Hoy lo haces así, igual que en tus encargos anteriores. El truco que esconde esto en una serie es la lección del jueves.

## Leer el error en servicios, no en abstracto

Cuando el modelo predice un número, acertar el valor exacto es casi imposible: ninguna hora da justo los servicios que predices al decimal. Así que la pregunta no es "¿cuántas veces aciertas?", sino "¿por cuántos servicios te equivocas?". Para eso hay tres medidas que vas a calcular siempre juntas. El MAE (error absoluto medio) es el promedio de lo que te desvías, en servicios: si da 0,85, te equivocas de media en menos de un servicio por hora. El RMSE es parecido pero penaliza más los errores grandes, también en servicios. Y el R² dice qué parte de la variación de la demanda explica el modelo: 1 es perfecto, 0 es lo mismo que predecir siempre la media, y puede salir negativo si lo haces peor que eso. Es una medida de contexto, sin unidades, y —esto es clave— solo es fiable si se midió bien.

De las tres, la que de verdad entiende la central es el MAE, porque está en servicios: "me equivoco de media en X servicios por hora" es una frase que Rebeca puede traducir directamente a cuántos operadores de margen poner. El R² es útil para hablar entre nosotros, pero a Casilda no le dice nada por sí solo. Por eso toda la semana vas a traducir cada métrica a servicios, y vas a tratar el R² con cautela: un R² altísimo es una buena noticia solo cuando sabes sobre qué datos se midió.

Las tres medidas del error. El MAE, en servicios, es la que la central puede usar para dimensionar los turnos. El R² es de contexto y solo vale si se midió bien, un matiz que el jueves resultará ser el corazón del caso.

## El bosque aleatorio, y después el lineal

El modelo que vas a usar es un bosque aleatorio, un regresor que combina muchos árboles de decisión y suele ir muy bien capturando relaciones complicadas sin que haya que decirle nada. Lo entrenas con cien árboles y una semilla fija, para que el resultado sea siempre el mismo. Al medir sobre la parte de prueba, los números salen espectaculares: un R² de 0,91 y un error de menos de un servicio por hora, prediciendo con dos semanas de antelación. Suena a triunfo redondo, y por un momento lo parece.

Para comparar, entrenas también una regresión lineal, un modelo mucho más simple, con las mismas features y la misma partición. Se queda muy atrás: un R² de 0,63 y un error de unos dos servicios por hora. Con las mismas pistas, el bosque saca muchísimo más. Eso debería hacerte levantar una ceja: el bosque puede recordar filas concretas que vio al entrenar, y la recta no. ¿Y si el bosque no está aprendiendo el patrón, sino recordando horas casi idénticas a las de la prueba? Pero hoy no lo ves todavía. Hoy le escribes a Severino que lo has clavado.

Un R² de 0,91 a la primera, prediciendo a dos semanas vista algo tan movido como las averías, es justo el tipo de resultado que debería dar un poco de miedo. Un buen resultado es una hipótesis, no una conclusión: antes de celebrarlo, la pregunta de senior es "¿y cómo partí los datos?". Hoy no te la haces, y es lo normal: traes aprendido que el split al azar es correcto. Mañana Severino te la hará, y ahí se cae el castillo. Guarda el 0,91 en la cabeza, porque vas a verlo desinflarse.

A partir de hoy los ejercicios de modelado empiezan con el mismo bloque que reconstruye la tabla a 14 días (16.108 filas, columnas zona, ts, n_servicios y las nueve features) desde serie_horaria.csv y calendario_festivos.csv, para que todos partan del mismo punto. Están en la carpeta datos/, junto con los CSV crudos del caso.

volver a la visión del caso y descargar los datasets

Regístrate para guardar tu progreso.