preloader

Evaluación de modelos para pronosticar

2 de febrero de 2018 | 32 minutos de lectura
Índice de contenido

Resumen:
Al desarrollar modelos de aprendizaje automático, generalmente se comparan varios modelos durante la fase de construcción. Luego, se estiman los rendimientos de esos modelos y se selecciona el modelo que, bajo ciertas consideraciones, tiene más probabilidades de funcionar bien. Así pues, se necesitan medidas objetivas de desempeño para decidir qué pronóstico conservar como un pronóstico real.
¿Cómo citar el presente artículo?
Romero, J. (2 de febrero de 2018). Evaluación de modelos para pronosticar. Python.JeshuaRomeroGuadarrama. https://www.Python.jeshuaromeroguadarrama.com/es/blog/advanced-forecasting/machine-learning-models-evaluation-for-forecasting/.
Evaluación de modelos para pronosticar by Jeshua Romero Guadarrama, available under Attribution 4.0 International (CC BY 4.0) at https://www.Python.jeshuaromeroguadarrama.com/es/blog/advanced-forecasting/machine-learning-models-evaluation-for-forecasting/.

Evaluación de modelos para pronosticar

Introducción


Al desarrollar modelos de aprendizaje automático, generalmente se comparan varios modelos durante la fase de construcción. Luego, se estiman los rendimientos de esos modelos y se selecciona el modelo que, bajo ciertas consideraciones, tiene más probabilidades de funcionar bien. Así pues, se necesitan medidas objetivas de desempeño para decidir qué pronóstico conservar como un pronóstico real.

En la presente entrada, descubrirá numerosas herramientas para la evaluación de modelos. Verá diferentes estrategias para evaluar modelos de aprendizaje automático en general, así como adaptaciones y consideraciones específicas a tener en cuenta para el pronóstico. También verá diferentes métricas para calificar el rendimiento del modelo.

Evaluación con un pronóstico de ejemplo


Veamos un ejemplo puramente hipotético con precios de acciones por mes del año $2020$ y el pronóstico que alguien ha hecho para esto (el cual se puede consultar en la Tabla 1). Suponga que este pronóstico se realizó en diciembre de $2019$ para el año completo y que no se ha actualizado desde entonces.

Tabla 1. Datos de precios de acciones.

PeríodoPrecio de mercadoPronosticado
Enero3530
Febrero3531
Marzo1030
Abril510
Mayo812
Junio1017
Julio1518
Agosto2027
Septiembre2329
Octubre2124
Noviembre2223
Diciembre2522

Puede verse que hay bastante diferencia entre los valores reales y los valores pronosticados (lo cual sucede con bastante regularidad). Comencemos por introducir los datos en Python y graficar las dos líneas usando el siguiente código:

python
import warnings
warnings.filterwarnings('ignore')
python
# Obtener el ejemplo de datos bursátiles en Python:
import pandas as pd
import matplotlib.pyplot as plt
periodos = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 
           'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre']
reales = [35, 35, 10, 5, 8, 10, 
        15, 20, 23, 21, 22, 25]
pronosticos = [30, 31, 30, 10, 12, 17,
              18, 27, 29, 24, 23, 22]
datos = pd.DataFrame({
    'periodo': periodos,
    'real': reales,
    'pronostico': pronosticos
})
ax = datos.plot.line(x = 'periodo')
ax.set_title('Pronósticos vs Reales', fontsize = 16)
ax.set_xticklabels(ax.get_xticklabels(), rotation = 45, ha = 'right')

# Precios de acciones frente a precios de acciones pronosticados a lo largo del tiempo:
plt.show()

png

El gráfico anterior muestra los valores reales frente a los valores pronosticados a lo largo del tiempo.

Ahora, el siguiente paso simple es calcular las diferencias entre cada valor pronosticado y cada valor real, como se muestra en la Tabla 2.

Tabla 2. Adición de los errores de cada valor pronosticado a los datos.

PeríodoPrecio de mercadoPronosticadoError
Enero3530-5
Febrero3531-4
Marzo103020
Abril5105
Mayo8124
Junio10177
Julio15183
Agosto20277
Septiembre23296
Octubre21243
Noviembre22231
Diciembre2522-3

Métricas de calidad del modelo


Este error mes a mes es información útil para la mejora del modelo. Sin embargo, aunque da una primera impresión de la calidad del modelo, existen algunos problemas con esta forma de evaluación del modelo. En primer lugar, este nivel de detalle sería demasiado para hacer una comparación de modelos: No puede mirar largas listas de errores para cada modelo, pero lo ideal es que seleccione uno o algunos KPI por modelo.

En segundo lugar, debe tener en cuenta que simplemente no es posible tomar el promedio de esta columna de error y considerarlo como su métrica de error. Dado que hay medidas de error positivas y negativas, se promediarían entre sí. Esto sería una fuerte subestimación de su error.

Para resolver este problema, se deben estandarizar los errores tomando los valores absolutos o elevando al cuadrado los errores. Esto asegurará que un error negativo y uno positivo no se anulen entre sí. Ahora verá cinco métricas comunes que hacen exactamente esto.

Métrica 1: MSE

El error cuadrático medio (o MSE, por sus siglas en inglés: “Mean Squared Error”) es una de las métricas más utilizadas en el aprendizaje automático. Se calcula como el promedio de los errores al cuadrado. Para calcular el MSE, toma los errores por fila de datos, eleva al cuadrado esos errores y luego toma el promedio de ellos.

$$ MSE=\frac{1}{n}\sum {({y}_i-{\hat{y}}_i)}^2 $$

Puede calcularlo en Python usando la biblioteca scikit-learn, como se hace en el siguiente código:

python
from sklearn.metrics import mean_squared_error

# Cálculo del error cuadrático medio en Python:
print(round(mean_squared_error(datos['real'], datos['pronostico']), 1))
53.7

Para el ejemplo actual, esto da un MSE de $53.7$.

La lógica detrás de esta métrica de error es múltiple:

  • La primera parte de la fórmula se puede entender conociendo la razón por la que se usan los errores cuadráticos en lugar de los errores originales, en vista de que sería imposible sumar los errores originales. En este caso, dado que existen valores positivos y negativos en los errores originales, se cancelarían entre sí. Imagine un caso con un gran error negativo y un gran error positivo: La suma de los dos errores podría ser cercana a cero, lo que claramente es incorrecto. El cuadrado de un valor siempre es positivo, por lo que esta es una posibilidad para contrarrestar esto.
  • La segunda parte de la fórmula se puede entender conociendo la razón por la que se usa el promedio. Se toma la suma de todos los valores y se divide entre el número de observaciones.
  • En conclusión, en el MSE, se toma el promedio de los errores al cuadrado.

La métrica de error MSE es excelente para comparar diferentes modelos en el mismo conjunto de datos. La escala del MSE será la misma para cada modelo aplicado al mismo conjunto de datos. Sin embargo, la escala de la métrica no es muy intuitiva, lo que dificulta su interpretación fuera de la evaluación comparativa de múltiples modelos.

El MSE es una métrica de error, por lo que debe interpretarse de la siguiente manera: Cuanto menor sea el error, mejor será el modelo. No es posible convertir esto en una medida de precisión debido a la falta de una escala fija de la métrica. No hay límites superiores para el error, por lo que realmente debería usarse solo para comparar.

Métrica 2: RMSE

La raíz del error cuadrático medio (o RMSE, por sus siglas en inglés: “Root Mean Squared Error”) es la raíz cuadrada del error cuadrático medio. Como puede comprender, sacar la raíz cuadrada del MSE no hace ninguna diferencia cuando desea utilizar las métricas de error para clasificar los rendimientos en orden.

$RMSE=\sqrt{MSE}$

Sin embargo, hay una ventaja en usar el RMSE en lugar del MSE. La razón para sacar la raíz cuadrada del MSE es que la escala del RMSE es la misma que la escala de la variable original. En la fórmula MSE, se toma el promedio de los errores al cuadrado. Esto hace que el valor sea difícil de interpretar. El uso de la raíz cuadrada hará que la escala de la métrica de error vuelva a la escala de sus valores reales.

Si calcula el RMSE usando el siguiente codigo, verá que el RMSE es $7.3$. Esto está mucho más en línea con los precios reales de las acciones con las que se está trabajando. Esto puede tener una ventaja para los propósitos en términos de su explicación y comunicación:

python
from sklearn.metrics import mean_squared_error
from math import sqrt

# Cálculo del error cuadrático medio en Python:
print(round(sqrt(mean_squared_error(datos['real'], datos['pronostico'])), 1))
7.3

Como el RMSE es una medida de error, un RMSE más bajo indica un mejor modelo.

Aunque el RMSE es más intuitivamente comprensible, su escala aún depende de los valores reales. Esto hace que sea imposible comparar los valores RMSE de diferentes conjuntos de datos entre sí, al igual que el MSE.

Métrica 3: MAE

El error absoluto medio (o MAE, por sus siglas en inglés: “Mean Absolute Error”) se calcula tomando las diferencias absolutas entre los valores pronosticados y reales por fila. El promedio de esos errores absolutos es el error absoluto medio.

$$ MAE=\frac{1}{n}\sum \mid {y}_i-{\hat{y}}_i\mid $$

El MAE toma los valores absolutos de los errores antes de promediarlos. Tomar el promedio de los errores absolutos es una forma de asegurarse de que la suma de los errores no haga que se cancelen entre sí.

Se ha visto que el MSE usa el cuadrado de los errores para evitar que se cancelen entre sí. Bajo este escenario, el MAE representa una alternativa. El MAE tiene una fórmula más intuitiva: es la métrica de error que la mayoría de la gente encuentra intuitivamente. Sin embargo, el RMSE es generalmente favorecido sobre el MAE.

Dado que el RMSE usa cuadrados en lugar de valores absolutos, el RMSE es más fácil de usar en cálculos matemáticos que exigen tomar derivadas. La derivada de los errores al cuadrado es mucho más fácil de calcular que la derivada de los errores absolutos. Dado que la derivada es una función muy utilizada en optimización y minimización, este es un criterio importante.

La interpretación del MAE es comparable a la interpretación del RMSE. Ambos producen puntajes que están en el mismo rango de valores que los valores reales. Siempre habrá una diferencia en el MAE y el MSE. Al utilizar los errores al cuadrado, si uno de los errores individuales es muy alto, este valor puede pesar más en la evaluación total. Sin embargo, no existe una forma definitiva de juzgar si una de las medidas de error es mejor o peor que la otra.

Puede calcular el error absoluto medio en Python utilizando el siguiente código:

python
from sklearn.metrics import mean_absolute_error

# Cálculo del error absoluto medio en Python:
print(mean_absolute_error(datos['real'], datos['pronostico']))
5.666666666666667

Se obtiene un MAE de $5.67$.

Métrica 4: MAPE

El error porcentual absoluto medio (o MAPE, por sus siglas en inglés: “Mean Absolute Percent Error”) se calcula tomando el error de cada predicción, dividido entre el valor real. Esto se hace para obtener los errores relativos a los valores reales. Lo cual hará que la medida del error sea un porcentaje y, por lo tanto, esté estandarizada.

En este punto, resulta sencillo observar que las medidas de error anteriores no se estandarizaron en una escala entre cero y uno. Sin embargo, esta estandarización es muy útil, ya que facilita la comunicación de los resultados del rendimiento.

Para calcular el MAPE, toma los valores absolutos de esos porcentajes por fila y calcula su promedio.

$$ MAPE=\frac{1}{n}\sum |\frac{y_i-{\hat{y}}_i}{y_i}| $$

El MAPE mide un porcentaje de error; es decir, es una medida de error, por lo que los valores más bajos para el MAPE son mejores. Sin embargo, puede convertir fácilmente el MAPE en una medida de bondad de ajuste calculando $1 - MAPE$. En muchos casos, es más fácil comunicar el desempeño en términos de un resultado positivo que negativo.

Aunque la función MAPE es intuitiva, tiene un serio inconveniente: Cuando el valor real es 0, la fórmula dividirá el error entre el valor real. Esto lleva a una división entre cero, lo cual es matemáticamente imposible. Lo cual hace que sea problemática de usar.

Puede calcular el error porcentual absoluto medio en Python utilizando el siguiente código:

python
from sklearn.metrics import mean_absolute_percentage_error

# Cálculo del error porcentual absoluto medio en Python:
print(mean_absolute_percentage_error(datos['real'], datos['pronostico']))
0.46469367588932814

En el ejemplo anterior, se obtiene $0.46$.

Métrica 5: R2

La métrica $R^{2}$ (R cuadrada) es una métrica que está muy cerca de la métrica $1 - MAPE$. Es una métrica de rendimiento en lugar de una métrica de error, lo que la hace ideal para la comunicación.

La $R^{2}$ es un valor que tiende a estar entre $0$ y $1$, siendo $0$ malo y $1$ perfecto. Por lo tanto, se puede usar fácilmente como un porcentaje multiplicándolo por $100$. El único caso en el que el $R^{2}$ puede ser negativo es si su pronóstico es más del $100%$ incorrecto.

$$ {R}^2=1-\frac{\sum {({y}_i-{\hat{y}}_i)}^2}{\sum {({y}_i-{\overline{y}}_i)}^2} $$

La fórmula hace un cálculo interesante. Calcula una relación entre la suma de los errores al cuadrado y la suma de las desviaciones entre el pronóstico y el promedio. Esto se reduce a un porcentaje de aumento de su modelo sobre el uso del promedio como modelo. Si su modelo es una predicción tan mala como usar el promedio, entonces el $R^{2}$ será cero. Como el promedio se usa a menudo como modelo de referencia, esta es una métrica de rendimiento muy práctica.

En Python, se puede calcular la $R^{2}$ utilizando el código que se muestra a continuación:

python
from sklearn.metrics import r2_score

# Calculando el R2 en Python:
print(r2_score(datos['real'], datos['pronostico']))
0.39976699029126206

Esto le da un valor (redondeado) de $0.4$. Como la $R^{2}$ se mide en una escala entre $0$ y $1$, podría traducir esto como un $40%$ más de rendimiento que el promedio. Aunque esta interpretación exacta no será muy clara para sus socios comerciales y gerentes, el uso de porcentajes para rastrear el rendimiento del modelo será muy convincente en muchos casos.

Estrategias de evaluación de modelos


Ahora que se han visto cinco métricas importantes, veamos cómo configurar pruebas para la comparación de modelos. Cuando realiza pronósticos avanzados, a menudo trabajará con muchos modelos al mismo tiempo (existen muchos modelos suceptibles de ser empleados).

No obstante, cuando trabaja con todos esos modelos diferentes, generalmente necesita hacer un pronóstico final: ¿Cómo decidir qué modelo es el más preciso?.

En teoría, por supuesto, podría usar múltiples modelos para predecir el futuro (en un corto plazo) y luego esperar para ver cuál funciona mejor. Esto sucede en la práctica, lo cual es una excelente manera de asegurarse de entregar pronósticos de calidad. Sin embargo, se puede hacer más. En lugar de esperar, es mucho más interesante probar y utilizar datos anteriores para estimar errores.

En la práctica, la pregunta es: ¿Cómo decidir qué modelo es el más preciso, sin esperar que el futuro confirme su modelo?

Sobreajuste y error fuera de la muestra

Al hacer pronósticos, está construyendo modelos sobre datos históricos y proyectando un pronóstico hacia el futuro. Al hacer esto, es importante evitar ciertos sesgos. Un sesgo muy común es ajustar un modelo en datos históricos, calcular errores en estos datos históricos y, si el error es bueno, usarlo para un pronóstico.

Sin embargo, esto no funcionará debido al sobreajuste. Sobreajustar un modelo significa que su modelo ha aprendido los datos anteriores de manera demasiado específica. Con los métodos avanzados que están disponibles en el mercado, los modelos podrían llegar a ajustarse al $100%$ a casi cualquier tendencia histórica. No osbtante, esto no es en absoluto una garantía de rendimiento en la predicción fuera de la muestra.

Cuando los modelos se sobreajustan, obtienen puntajes muy altos en datos históricos y desempeños deficientes en datos futuros. En lugar de aprender tendencias reales y generales, un modelo sobreajustado recuerda muchas variaciones “inútiles” y “ruidosas” del pasado y proyectará este ruido en el futuro.

Los modelos de aprendizaje automático son modelos de aprendizaje poderosos: Aprenderán cualquier cosa que les des. Pero cuando se adaptan demasiado, aprenden demasiado. Esto sucede a menudo y existen muchas estrategias para evitarlo.

Estrategia 1: División del conjunto de datos en entrenamiento y prueba

La primera estrategia que se implementa a menudo es la división del conjunto de datos en entrenamiento y prueba. Al aplicar una división en entrenamiento-prueba, se dividen las filas en dos conjuntos de datos. Por lo general, se mantiene un $20$ o $30%$ de los datos en el conjunto de prueba.

Luego puede proceder a ajustar modelos en el resto de los datos: Los datos de entrenamiento. Puede aplicar muchos modelos a los datos de entrenamiento y hacer predicciones sobre los datos de prueba. Compara el rendimiento de los modelos de aprendizaje automático en el conjunto de prueba y notará que los modelos con un buen rendimiento en los datos de entrenamiento no necesariamente tienen un buen rendimiento en los datos de prueba.

Un modelo con una puntuación más alta en los datos de entrenamiento y una puntuación más baja en los datos de prueba es un modelo con sobreajuste. En este caso, un modelo con un error ligeramente menor en los datos de entrenamiento bien puede superar al primer modelo en el conjunto de prueba.

Los rendimientos de las pruebas son los que importan, ya que replican mejor el caso futuro: Intentan predecir sobre datos que son “desconocidos” para el modelo; esto replica la situación de su pronóstico en el futuro.

Ahora, una pregunta que podría hacer es cómo elegir el conjunto de prueba. En la mayoría de los problemas de aprendizaje automático, realiza una selección aleatoria de datos para el conjunto de prueba. No obstante, el pronóstico es bastante particular en este caso. Como generalmente tiene un orden en los datos, tiene más sentido mantener el conjunto de prueba como el $20%$ de las últimas observaciones: Replicará la situación futura de aplicación del pronóstico.

Como ejemplo de la aplicación de la división en entrenamiento y prueba, hagamos un modelo de pronóstico muy simple: El modelo promedio. Consiste en tomar el promedio de los datos del entrenamiento y usarlo como pronóstico. Por supuesto, no será muy eficaz, pero a menudo se usa como punto de referencia “mínimo” en los modelos de pronóstico. Cualquier modelo que sea peor que este no merece ser considerado en absoluto.

Entonces, veamos un ejemplo con los datos del precio de las acciones usando el siguiente código:

python
# División del conjunto de datos en entrenamiento y prueba en Python:
from sklearn.model_selection import train_test_split

# Conjunto de datos:
y = datos['real']

# División del conjuntos de datos en un 70% entrenamiento y un 30% prueba en Python:
entrenamiento, prueba = train_test_split(y, 
                                         test_size = 0.3, 
                                         shuffle = False)

# El pronostico es de 17.25:
pronostico = entrenamiento.mean()

# Conjunto de datos de entrenamiento:
entrenamiento = pd.DataFrame(entrenamiento)
entrenamiento['pronostico'] = pronostico

# Error cuadrático medio del conjunto de datos de entrenamiento:
error_entrenamiento = mean_squared_error(entrenamiento['real'], entrenamiento['pronostico'])

# Conjunto de datos de prueba:
prueba = pd.DataFrame(prueba)
prueba['pronostico'] = pronostico

# Error cuadrático medio del conjunto de datos de prueba:
error_prueba = mean_squared_error(prueba['real'], prueba['pronostico'])


print(error_entrenamiento, error_prueba)
122.9375 32.4375

Esto dará un error de entrenamiento de $122.9375$ y un error de prueba de $32.4375$.

Atención aquí: Con un año de datos, una división del conjunto de datos en entrenamiento y prueba causará un problema. El conjunto de entrenamiento no tendrán un año completo de datos, lo que hace que el modelo no aprenda por completo ninguna estacionalidad. Además, el investigador debe esforzarse por tener al menos tres observaciones por período (en este caso, tres años de datos de entrenamiento).

Por lo general, es una buena idea tener en cuenta la estacionalidad al seleccionar el período de prueba. En situaciones que no son de pronóstico, a menudo verá conjuntos de prueba del $20$ o $30%$ de los datos. En el pronóstico, se aconseja utilizar un período estacional completo. Si tiene estacionalidad anual, debe usar un año completo como período de prueba para evitar tener, por ejemplo, un modelo que funcione muy bien en verano, pero mal en invierno (posiblemente debido a diferentes dinámicas en lo que se está pronosticando en diferentes estaciones).

Estrategia 2: División del conjunto de datos en entrenamiento, validación y prueba

Al realizar una comparación de modelos, se compara el rendimiento de muchos modelos. Como se dijo antes, se puede evitar el sobreajuste entrenando los modelos en el conjunto de entrenamiento y probando los modelos en el conjunto de prueba.

Además de este enfoque, puede agregar una división adicional: La división de validación. Al usar la división de entrenamiento-validación-prueba, entrenará modelos en el conjunto de entrenamiento y, posteriormente, comparará los modelos con los datos de validación, esta será la base para la selección del modelo. Finalmente, se usará el modelo seleccionado para calcular un error en el conjunto de prueba: Esto debería confirmar el error estimado del modelo.

En caso de que tenga un error en el conjunto de prueba que sea significativamente peor que el error en el conjunto de validación, esto le alertará de que el modelo no es tan bueno como esperaba: El error de validación está subestimado y debe volver a investigarse.

Cuando se usa la división del conjunto de datos en entrenamiento, validación y prueba, hay una gran cantidad de datos dedicados completamente a la comparación y prueba del modelo. Por lo tanto, este enfoque debe evitarse cuando se trabaja con pocos datos.

Como se dijo antes, es importante considerar qué períodos omitir para la validación y los datos de prueba. Si, por ejemplo, tiene cinco años de datos mensuales y decide usar tres años para entrenamiento, un año para validación y un año para pruebas, se está perdiendo los dos años de datos más recientes: No es una buena idea.

En este caso, podría seleccionar el mejor modelo (es decir, el tipo de modelo y sus hiperparámetros óptimos); y, una vez que el modelo se selecciona y compara, vuelve a entrenar el modelo óptimo, incluidos los datos más recientes.

El siguiente código muestra un ejemplo muy básico en el que se comparan dos modelos: La media y la mediana. Por supuesto, no se debe esperar que esos modelos funcionen (el objetivo es mostrar cómo usar los datos de validación para la comparación de modelos):

python
# División del conjunto de datos en entrenamiento, validación y prueba en Python:
from sklearn.model_selection import train_test_split

# Conjunto de datos:
y = datos['real']

# División del conjuntos de datos en un 70% entrenamiento, un 15% validación y un 15% prueba en Python:
entrenamiento, prueba = train_test_split(y, 
                                         test_size = 0.3, 
                                         shuffle = False, 
                                         random_state = 12345)                                             
validacion, prueba = train_test_split(prueba, 
                                      test_size = 0.5, 
                                      shuffle = False, 
                                      random_state = 12345)

# Ajustar (estimar) los dos modelos en los datos de entrenamiento:
pronostico_promedio = entrenamiento.mean() # 17.25
pronostico_mediana = entrenamiento.median() # 12.5

# Conjunto de datos de validación:
validacion = pd.DataFrame(validacion)

# Calcular error cuadrático medio (MSE) en datos de validación para el modelo del promedio (del conjunto de datos de entrenamiento):
validacion['pronostico_promedio'] = pronostico_promedio
promedio_validacion_mse = mean_squared_error(validacion['real'], validacion['pronostico_promedio'])

# Calcular error cuadrático medio (MSE) en datos de validación para el modelo de la mediana (del conjunto de datos de entrenamiento):
validacion['pronostico_mediana'] = pronostico_mediana
mediana_validacion_mse = mean_squared_error(validacion['real'], validacion['pronostico_mediana'])

# Mostrar la validación del MSE de cada modelo: 
# MSE de la media: 23.56.
# MSE de la mediana: 91.25.
print(promedio_validacion_mse, mediana_validacion_mse)

# El mejor rendimiento es para el modelo de la media. En consecuencia, se verifica su error en los datos de prueba:
prueba = pd.DataFrame(prueba)
prueba['pronostico_promedio'] = pronostico_promedio
promedio_prueba_mse = mean_squared_error(prueba['real'], prueba['pronostico_promedio'])

# Observar un MSE de prueba de 41.3125 (casi el doble del MSE de validación):
print(promedio_prueba_mse)
23.5625 91.25
41.3125

Si sigue el ejemplo, se puede observar un MSE de validación para el modelo del promedio de $23.56$ y $91.25$ para el modelo de la mediana. Esta sería una razón para mantener el modelo del promedio frente al modelo de la mediana. Como evaluación final, de verifica si el error de validación no está influenciado por una selección del conjunto de validación que es (aleatoriamente) favorable al modelo promedio.

Esto se hace tomando una medida de error final en el conjunto de prueba. Ahora bien, tanto el conjunto de validación como el conjunto de prueba eran datos no vistos por el modelo promedio; por ende, sus errores deberían ser cercanos. Sin embargo, se observa un MSE de prueba de $41.3125$, casi el doble del error de validación. El hecho de que el error de prueba esté lejos del error de validación indica que hay un sesgo en la estimación del error (el error de validación está subestimado). En este caso particular, el sesgo es bastante fácil de encontrar: Hay muy pocos puntos de datos en el conjunto de validación (solo dos puntos de datos), lo que hace que la estimación del error no sea confiable.

La división del conjunto de datos en entrenamiento, validación y prueba habría dado una advertencia temprana sobre las métricas de error del modelo. Por lo tanto, habría impedido confiar en este pronóstico para estimaciones futuras. Aunque una estrategia de evaluación no puede mejorar un modelo, definitivamente puede mejorar su elección de modelos de pronóstico. Por lo tanto, tiene un impacto indirecto en la precisión de su modelo.

Estrategia 3: Validación cruzada para pronósticos

Puede ocurrir un problema con la división del conjunto de datos en entrenamiento y prueba cuando se tienen muy pocos datos. En algunos casos, no puede “permitirse” mantener un $20%$ de los datos fuera de la construcción del modelo. En este caso, la validación cruzada es una gran solución.

Validación cruzada de K-Fold

El tipo más común de validación cruzada es la validación cruzada K-fold. La validación cruzada de K-fold es como una adición a la división del conjunto de datos en entrenamiento y prueba. En la división de entrenamiento-prueba, se calcula el error de cada modelo una vez: En los datos de prueba. En la validación cruzada K-fold, ajusta el mismo modelo $k$ veces y evalúa el error cada vez. Luego obtiene $k$ medidas de error, de las cuales toma el promedio. Este es su error de validación cruzada.

Para hacer esto, una validación cruzada de K-fold realiza varias divisiones de entrenamiento y prueba diferentes. Si se elige un $k$ de $10$, dividirá los datos en $10$. Luego, cada una de las $10$ partes servirá como datos de prueba una vez. Esto significa que las $9$ partes restantes se utilizan como datos de entrenamiento.

Como valores para $k$, generalmente busca entre $3$ y $10$. Si va mucho más alto, los datos de prueba se vuelven pequeños, lo que puede conducir a estimaciones de error sesgadas. Si baja demasiado, tiene muy pocos pliegues y pierde el valor agregado de la validación cruzada. Tenga en cuenta que cuando $k$ es $1$, simplemente está aplicando una división de entrenamiento y prueba.

Como ejemplo hipotético, imagine un caso con $100$ puntos de datos y una validación cruzada quíntuple. Hará $5$ conjuntos de datos de entrenamiento-prueba diferentes, como puede ver en la ilustración esquemática de la Figura 1.

Figura 1. Validación cruzada de K-fold en Python.

Figura 1. Validación cruzada de K-fold en Python.

En esas $5$ divisiones de entrenamiento y prueba, entrena el modelo en las observaciones que se han seleccionado como datos de entrenamiento y calcula el error en las observaciones que se han seleccionado como datos de prueba. El error de validación cruzada es entonces el promedio de los cinco errores de prueba:

python
import numpy as np
from sklearn.model_selection import KFold

# Validación cruzada de K-fold en Python:
kf = KFold(n_splits = 5)
errores = []
for indice_entrenamiento, indice_prueba in kf.split(datos):
    entrenamiento = datos.iloc[indice_entrenamiento, :]
    prueba = datos.iloc[indice_prueba, :]
    prediccion = entrenamiento['real'].mean()
    prueba['pronostico'] = prediccion
    error = mean_squared_error(prueba['real'], prueba['pronostico'])
    errores.append(error)
print(np.mean(errores))
106.10234567901234

Este ejemplo brinda un error de validación cruzada de $106.1$. Este es un MSE, por lo que solo debe compararse con errores de otros modelos en el mismo conjunto de datos.

Validación cruzada de series temporales

El hecho de que tenga varias estimaciones del error mejorará la estimación del error. Como puede imaginar, cuando solo tiene una estimación del error, los datos de su prueba pueden ser muy favorables: ¡todos los eventos difíciles de predecir pueden haber caído en los datos de entrenamiento! La validación cruzada reduce este riesgo al aplicar una evaluación a todos los datos. Esto hace que la estimación del error sea generalmente más fiable.

Sin embargo, se debe prestar atención al caso específico del pronóstico. Como puede ver en la Figura 1, la validación cruzada K-fold crea divisiones de prueba equitativas en los datos. En el ejemplo, puede ver muchos casos en los que el conjunto de prueba se encuentra temporalmente antes que el conjunto de entrenamiento. Esto significa que está midiendo el error de pronosticar el pasado en lugar del futuro usando estos métodos.

Para la categoría de modelos supervisados, en los que utiliza relaciones entre su variable objetivo y un conjunto de variables explicativas, esto no es necesariamente un problema: Se puede suponer que las relaciones entre variables son las mismas en el pasado y en el presente.

Sin embargo, para la categoría de modelos de series de tiempo, este es un problema serio. Los modelos de series temporales generalmente se basan en hacer pronósticos basados en tendencias y/o estacionalidad: Utilizan el pasado de la variable objetivo para pronosticar el futuro.

Un primer problema que encontrará es que muchos modelos de series de tiempo no funcionarán con datos faltantes: Si falta un mes en el medio, los métodos simplemente no se pueden estimar.

Un segundo problema es que cuando los modelos se pueden estimar, a menudo no son realistas: Estimar un período entre puntos de datos es mucho más fácil que estimar un período que está totalmente en el futuro.

Una solución que se puede usar es la llamada división de series de tiempo, como se muestra en la Figura 2. En este enfoque, solo se toman los datos anteriores al período de prueba para el entrenamiento del modelo.

Figura 2. Validación cruzada de series temporales en Python.

Figura 2. Validación cruzada de series temporales en Python.

Puede aplicar la validación cruzada de series de tiempo utilizando el código que se muestra a continuación:

python
import numpy as np
from sklearn.model_selection import TimeSeriesSplit

# Validación cruzada de series temporales en Python:
vc_st = TimeSeriesSplit()
errores = []
for indice_entrenamiento, indice_prueba in vc_st.split(datos):
    entrenamiento = datos.iloc[indice_entrenamiento, :]
    prueba = datos.iloc[indice_prueba, :]
    prediccion = entrenamiento['real'].mean()
    prueba['pronostico'] = prediccion
    error = mean_squared_error(prueba['real'], prueba['pronostico'])
    errores.append(error)
print(np.mean(errores))
194.76522222222223

Este método de validación cruzada estima que el error es de $194.7$. Una vez más, este error no debe usarse de forma independiente, sino como una forma de comparar el rendimiento de varios métodos en los mismos datos.

Este método al menos se puede utilizar en modelos de series temporales, ya que no hay lagunas en los datos. Sin embargo, con este método, tienes un sesgo. Para el primer pliegue, tendrá muchos menos datos históricos que para el último pliegue. Esto hace que los errores de los pliegues no sean comparables: Si no pueden utilizar suficientes datos históricos para ajustar el modelo, los errores de los primeros pliegues podrían considerarse injustos. Esta es una debilidad inherente de este método que debe tenerse en cuenta al momento de usarse.

Validación cruzada de series temporales móviles

Una alternativa que se ha propuesto es la división de series temporales móviles. Utiliza el mismo período para cada pliegue en la validación cruzada. Puede ver la descripción general esquemática de este método en la Figura 3. Esto solucionará el problema de tener errores desiguales: Todos están entrenados con la misma cantidad de datos históricos. Sin embargo, persiste el problema de que no puede basar su modelo en datos muy lejanos en el pasado utilizando este método.

Así pues, solo debe usarse en situaciones en las que tiene una gran cantidad de datos o en las que no tiene que mirar muy lejos en el pasado para predecir el futuro.

Figura 3. Validación cruzada de series temporales móviles.

Figura 3. Validación cruzada de series temporales móviles.

Puede usar el código que se muestra a continuación para ejecutar la validación cruzada de la serie de tiempo móvil en el ejemplo del precio de las acciones:

python
import numpy as np
from sklearn.model_selection import TimeSeriesSplit

# Validación cruzada de series temporales móviles en Python:
vc_st = TimeSeriesSplit(max_train_size = 2)
errores = []
for indice_entrenamiento, indice_prueba in vc_st.split(datos):
    entrenamiento = datos.iloc[indice_entrenamiento, :]
    prueba = datos.iloc[indice_prueba, :]
    prediccion = entrenamiento['real'].mean()
    prueba['pronostico'] = prediccion
    error = mean_squared_error(prueba['real'], prueba['pronostico'])
    errores.append(error)
print(np.mean(errores))
174.0

Este método de evaluación del modelo estima que el error es de $174.0$. Ahora ha visto tres errores de validación cruzada que son todos diferentes. No obstante, cada uno de ellos utiliza el mismo modelo; lo cual indica dos cosas:

  1. En primer lugar, se insiste en comparar solo las estimaciones de error utilizando la misma métrica, utilizando el mismo conjunto de datos.
  2. En segundo lugar, se ha observado un error significativamente menor en la división de la serie temporal móvil. Esto puede ser un indicio de que el uso del modelo con muy pocos datos históricos (en movimiento) podría ser el modelo más eficaz en este caso.

Sin embargo, para estar seguro de la segunda conclusión, se necesitan estudiar los resultados un poco más. Un excelente punto de partida sería agregar varios modelos al punto de referencia.

Prueba retrospectiva (backtesting)


Como última estrategia, quiero mencionar la prueba retrospectiva (backtesting). El backtesting es un término que no se practica mucho en ciencia de datos y aprendizaje automático. Sin embargo, es la técnica de validación de modelos de referencia en el comercio de acciones y las finanzas. De ahí que, el backtesting se basa en los mismos principios que la evaluación de otros modelos.

Existe una diferencia fundamental entre el backtesting y la evaluación de modelos utilizando métricas. En el backtesting, en lugar de medir la precisión de un modelo de pronóstico, se mide el resultado de una estrategia (negociación de acciones). En lugar de intentar pronosticar los precios futuros de las acciones, usted define en qué evento o gatillo (trigger) desea comprar o vender. Por ejemplo, podría definir una estrategia que establezca que comprará una acción determinada al precio $x$ y la venderá al precio $y$.

Para evaluar el rendimiento de esta estrategia, ejecuta la estrategia en datos históricos de precios de acciones: ¿Qué habría sucedido si hubiera vendido y comprado acciones a los precios que indicó?. Luego evalúas cuánta ganancia habrías obtenido.

Aunque el backtesting se aplica a las estrategias comerciales más que a los pronósticos, me pareció interesante enumerarla como una alternativa a la evaluación de modelos en el pronóstico.

Hay varias bibliotecas de Python para finanzas, que proponen soluciones de backtesting. Un ejemplo muy fácil de usar es el paquete fastquant, disponible en GitHub.

¿Qué estrategia usar para pronósticos seguros?


Después de haber visto múltiples enfoques para la evaluación del modelo de pronóstico, es posible que se pregunte qué solución debe elegir. Yo diría que no tienes que elegir. Como pronosticador o modelador, su tarea más importante es confiar en la evaluación de su modelo. ¡Una estrategia de evaluación fiable es la clave del éxito! Entonces, en lugar de elegir una estrategia, le aconsejo que use una combinación de estrategias que lo haga sentir más seguro acerca de sus predicciones.

Una estrategia combinada que puede usar es entrenar y ajustar sus modelos mediante la validación cruzada de los datos de entrenamiento. Como siguiente paso, puede medir los errores predictivos en los datos de validación: El modelo que tenga el mejor error en los datos de validación será su modelo preferido. Como última verificación (nunca puede estar lo suficientemente seguro), hace una predicción sobre los datos de prueba con el modelo seleccionado y se asegura de que el error es el mismo que el error observado en los datos de validación. Si este es el caso, puede estar seguro de que su modelo debería ofrecer el mismo rango de errores en datos futuros.

A medida que haga más pronósticos predictivos, desarrollará una idea de qué métricas de evaluación es importante considerar. Solo recuerde que el objetivo de la evaluación del modelo es doble: Por un lado, lo usa para mejorar el rendimiento del modelo y, por otro lado, lo usa para medir el rendimiento objetivo.

Tenga en cuenta que, a veces, los modeladores predictivos se centran tanto en la parte de mejora del rendimiento que empiezan a modificar sus métodos de evaluación para mejorar sus puntuaciones de rendimiento. Esto debe evitarse: Desea tener la mayor confianza posible sobre el rendimiento futuro de su modelo. Las métricas son una parte importante de esto; poner en marcha una estrategia de evaluación del modelo objetivo es aún más importante.

Consideraciones finales sobre la evaluación del modelo


Además de observar las métricas, también debe comprender a qué se ajusta su modelo:

  • ¿Qué variables explicativas tiene en cuenta el modelo?
  • ¿Las variables explicativas tienen sentido intuitivamente?
  • ¿Las variables explicativas se ajustan al conocimiento empresarial sobre sus datos?

Esta comprensión científica o explicativa de su modelo le dará confianza adicional, lo cual es un complemento importante para la minimización numérica de los errores de pronóstico.

Por ejemplo, si predice sobre datos del mercado de valores, puede obtener un $90%$ de precisión basándose en el pasado. Pero al reflexionar sobre lo que está haciendo, puede darse cuenta de que en los datos anteriores, no ha habido un simple desplome del mercado actual. Y puede comprender por esto que su modelo fallará por completo en el caso de una caída del mercado, ¡mientras que ese es quizás el momento en el que corre más riesgo!

Un gran libro que habla de esto es El cisne negro (o The Black Swan) en el que el autor Nicholas Taleb insiste en la importancia de tener en cuenta eventos muy raros cuando se trabaja en el mercado de valores. Una conclusión aquí es que las crisis extremas en la historia del comercio de acciones han influido mucho en el éxito comercial, mientras que los métodos utilizados para el comercio diario no (siempre) tienen en cuenta dicha gestión de riesgos. Incluso puede preferir un modelo que sea peor en el día a día, pero mejor en la predicción de grandes accidentes.

En resumen, ¡no siempre tiene que obtener el error cuadrático medio más bajo posible! A veces, las actuaciones estables son las más importantes. Otras veces, es posible que desee evitar cualquier sobreestimación, mientras que las subestimaciones no son un problema (por ejemplo, en un restaurante, puede ser peor comprar demasiada comida debido a un pronóstico de demanda sobreestimado, en lugar de demasiado poca). Para llegar a este nivel de comprensión, es importante entender a profundidad los fundamentos de los modelos.

Un modelo no es una caja negra que hace predicciones por ti, es una fórmula matemática que estás construyendo. Para obtener buenos resultados, se debe evaluar el rendimiento de la fórmula utilizando criterios de evaluación que se ajusten a su caso de uso: Hay muchas estrategias y métricas disponibles, pero ninguna sirve para todos los casos. Solo usted puede saber qué método de evaluación se ajusta a los criterios de éxito de la declaración de su problema en particular.

Conclusiones clave


Métricas

  • Las métricas más adecuadas para los problemas de regresión son R2 ($R^{2}$), raíz del error cuadrático medio (RMSE) y error cuadrático medio (MSE).
  • La R2 da un valor porcentual. El RMSE da un valor en la escala de los valores reales. El MSE da un valor en una escala que es difícil de interpretar.
  • Las métricas deben usarse para comparar diferentes modelos en un mismo conjunto de datos.

Estrategias de evaluación de modelos

  • La validación cruzada brinda una estimación de error muy confiable. Las adaptaciones son necesarias para que funcione para series temporales.
  • Se puede usar una división de entrenamiento, validación y prueba para la evaluación comparativa.
  • Una estrategia combinada dará una estimación más segura: Utilizar la validación cruzada en los datos de entrenamiento, los datos de validación para la selección del modelo y los datos de prueba para una última estimación del error.

Modelos sobreajustados

  • Si su modelo aprende demasiado de los datos de entrenamiento y no generaliza en el futuro, se está sobreajustando.
  • El sobreajuste se identifica por un buen desempeño en los datos de entrenamiento, pero un mal desempeño en los datos de prueba.

Modelos subajustados

  • Si su modelo no aprende lo suficiente de los datos de entrenamiento, se está subajustando.
  • El subajuste está determinado por un mal desempeño en los datos de entrenamiento.
comments powered by Disqus

popular post

El modelo AR de series temporales univariadas

Resumen: En esta entrada, descubrirá el modelo AR: El modelo autorregresivo.

Leer más

Evaluación de modelos para pronosticar

Resumen: Al desarrollar modelos de aprendizaje automático, generalmente se comparan varios modelos durante la fase de construcción.

Leer más

Modelos para pronosticar

Resumen: El pronóstico, traducido groseramente como la tarea de predecir el futuro, ha estado presente en la sociedad humana durante siglos.

Leer más