Previsión con AutoGluon Amazon

Introducción a la biblioteca Amazon AutoGluon Multimodal AutoML con un problema de pronóstico de series temporales.

AutoGluón

Introducción a AutoGluon

AutoGluón

AutoGluon es una biblioteca Python multimodal de código abierto para AutoML, lanzada por Amazon. Construida sobre PyTorch, la biblioteca utiliza modelos de última generación (SOTA) para obtener los modelos de mejor rendimiento para diversos problemas de aprendizaje automático.

Equipado con modelos SOTA Deep Learning, AutoGluon ofrece soluciones a problemas como clasificación de imágenes, detección de objetos, predicción de texto, segmentación de imágenes, previsión de series temporales y mucho más, como en la imagen de portada. Esta página tiene como objetivo mostrar a los lectores cómo utilizar AutoGluon para una tarea de pronóstico de series temporales considerando el famoso conjunto de datos de Airlines con un código mínimo.

Es recomendable crear un nuevo entorno Python para los experimentos de Autogluon para evitar conflictos con otras bibliotecas. Una vez creado el nuevo entorno, instale Autogluon ejecutando el siguiente comando.

pip instalar autogluón
importar autogluón

AutoGluon TimeSeriesPredictor espera datos en un formato específico con índices múltiples. Un índice debe ser la marca de tiempo y el otro debe ser un identificador único (puede ser cualquier valor). Un marco de datos pandas normal se puede convertir a este formato usando TimeSeriesDataFrame.from_data_frame().

de autogluon.timeseries importar TimeSeriesPredictor, TimeSeriesDataFrame

Comencemos cargando los datos y colocándolos en un Time Series DataFrame:

importar panda as p.d.

datos = pd.read_excel('airlinesData.xlsx')
datos['Mes'] = pd.to_datetime(datos['Mes']) #convertir a fecha y hora
identificación = ['aerolínea'] * después(datos) #crear lista de ID para agregar al marco de datos
datos['identificación'] = identificación #add nueva columna 'id' al marco de datos

datos = TimeSeriesDataFrame.from_data_frame(
datos,
id_columna=”identificación”,
timestamp_column=”Mes”
)
datos.cola()

Luego dividimos los datos (tenga cuidado aquí, no hicimos validación cruzada):

datos.forma
(96, 3)
columnas.de.datos
Índice(['Pasajeros'], dtype='objeto')
 »'dividir datos en entrenar y probar''
tren = datos.head(77)
prueba = datos.cola(19)

Cómo entrenar al predicador

La métrica de evaluación que elija depende de si necesita un pronóstico probabilístico o un pronóstico puntual. A continuación se muestra una tabla con las diferentes medidas.

autogluón

En el registro de entrenamiento se pueden ver diferentes modelos entrenados con los datos del tren, los parámetros elegidos y la métrica de evaluación. La biblioteca aprovecha modelos estadísticos y modelos SOTA Deep Learning para la formación. De forma predeterminada, el modelo también probará un modelo WeightedEnsemble. se puede desactivar configurando enable_ensemble = False en el método .fit().

predictor = TimeSeriesPredictor(objetivo='Pasajeros', 
longitud_predicción=19,
eval_metric="MASE",).fit(tren)
No se ha especificado ninguna ruta. Los modelos se guardarán en: "AutogluonModels\ag-20240202_034220"
Comenzando el entrenamiento con AutoGluon...
AutoGluon guardará los modelos en 'AutogluonModels\ag-20240202_034220'
=================== Información del sistema ====================
Versión de AutoGluon: 1.0.0
Versión de Python: 3.8.18
Sistema operativo: Windows
Máquina de plataforma: AMD64
Versión de plataforma: 10.0.22621
Número de CPU: 12
Recuento de GPU: 0
Memoria disponible: 0,59 GB / 7,33 GB (8.0%)
Espacio disponible en disco: 262,60 GB / 476,08 GB (55.2%)
===================================================

Encajando con argumentos:
{'enable_ensemble': Verdadero,
'eval_metric': MASE,
'hiperparámetros': 'predeterminado',
'nombres_covariables_conocidos': [],
'num_val_windows': 1,
'predicción_longitud': 19,
'niveles_cuantiles': [0,1, 0,2, 0,3, 0,4, 0,5, 0,6, 0,7, 0,8, 0,9],
'semilla_aleatoria': 123,
'refit_every_n_windows': 1,
'refit_full': Falso,
'objetivo': 'Pasajeros',
'verbosidad': 2}

Frecuencia de series temporales inferidas: 'MS'
Siempre que train_data tenga 77 filas, 1 serie temporal. La duración media de la serie temporal es 77 (mín=77, máx=77).

El conjunto de datos proporcionado contiene las siguientes columnas:
objetivo: 'Pasajeros'

AutoGluon medirá el rendimiento predictivo utilizando una métrica de evaluación: 'MASE'
El signo de esta métrica se ha invertido para adherirse a ser más alto_es_mejor. La puntuación de la métrica se puede multiplicar por -1 para obtener el valor de la métrica.
===================================================

Iniciando el entrenamiento. La hora de inicio es 2024-02-02 09:12:20
Modelos que se entrenarán: ['SeasonalNaive', 'CrostonSBA', 'NPTS', 'AutoETS', 'DynamicOptimizedTheta', 'AutoARIMA', 'RecursiveTabular', 'DirectTabular', 'DeepAR', 'TemporalFusionTransformer', 'PatchTST' ]
Modelo de series temporales de entrenamiento SeasonalNaive.
-0,8728 = Puntuación de validación (-MASE)
0,02 s = tiempo de ejecución del entrenamiento
6,75 s = tiempo de ejecución de validación (predicción)
Modelo de series temporales de entrenamiento CrostonSBA.
-1,4745 = Puntuación de validación (-MASE)
0,00 s = tiempo de ejecución del entrenamiento
15,24 s = tiempo de ejecución de validación (predicción)
Modelo de series temporales de entrenamiento NPTS.
-2,3546 = Puntuación de validación (-MASE)
0,02 s = tiempo de ejecución del entrenamiento
2,85 s = tiempo de ejecución de validación (predicción)
Modelo de series temporales de entrenamiento AutoETS.
-0,8152 = Puntuación de validación (-MASE)
0,02 s = tiempo de ejecución del entrenamiento
30,67 s = tiempo de ejecución de validación (predicción)
Modelo de series temporales de entrenamiento DynamicOptimizedTheta.
-1,4460 = Puntuación de validación (-MASE)
0,02 s = tiempo de ejecución del entrenamiento
29,97 s = tiempo de ejecución de validación (predicción)
Entrenamiento de series temporales modelo AutoARIMA.
-0,7476 = Puntuación de validación (-MASE)
0,02 s = tiempo de ejecución del entrenamiento
21,59 s = tiempo de ejecución de validación (predicción)
Modelo de series temporales de entrenamiento RecursiveTabular.
-0,5560 = Puntuación de validación (-MASE)
4,89 s = tiempo de ejecución del entrenamiento
0,38 s = tiempo de ejecución de validación (predicción)
Entrenamiento de modelos de series temporales DirectTabular.
-3,5581 = Puntuación de validación (-MASE)
0,65 s = tiempo de ejecución del entrenamiento
0,08 s = tiempo de ejecución de validación (predicción)
Entrenamiento de modelos de series temporales DeepAR.
-1,1489 = Puntuación de validación (-MASE)
55,81 s = tiempo de ejecución del entrenamiento
0,08 s = tiempo de ejecución de validación (predicción)
Modelo de serie temporal de entrenamiento TemporalFusionTransformer.
-0,8554 = Puntuación de validación (-MASE)
144,14 s = tiempo de ejecución del entrenamiento
0,02 s = tiempo de ejecución de validación (predicción)
Modelo de series temporales de entrenamiento PatchTST.
-0,9520 = Puntuación de validación (-MASE)
32,19 s = tiempo de ejecución del entrenamiento
0,03 s = tiempo de ejecución de validación (predicción)
Montaje sencillo ponderado entre sí.
Pesos de conjunto: {'AutoARIMA': 0,09, 'NPTS': 0,07, 'RecursiveTabular': 0,04, 'SeasonalNaive': 0,35, 'TemporalFusionTransformer': 0,44}
-0,2127 = Puntuación de validación (-MASE)
1,67 s = tiempo de ejecución del entrenamiento
31,59 s = tiempo de ejecución de validación (predicción)
Formación completa. Modelos entrenados: ['SeasonalNaive', 'CrostonSBA', 'NPTS', 'AutoETS', 'DynamicOptimizedTheta', 'AutoARIMA', 'RecursiveTabular', 'DirectTabular', 'DeepAR', 'TemporalFusionTransformer', 'PatchTST', 'WeightedEnsemble ']
Tiempo de ejecución total: 347,54 s
Mejor modelo: Conjunto ponderado
Puntuación del mejor modelo: -0,2127

Ver los resultados

Para hacer esto, simplemente use la función:

predictor.tabla de clasificación()

autogluón

Sin especificar un modelo, el predictor considerará el mejor modelo de predicción, que en este caso es WeightedEnsemble.

predicciones = predictor.predict(entrenar) predicciones 
El modelo no especificado en la predicción, por defecto será el modelo con la mejor puntuación de validación: WeightedEnsemble
autogluón

De forma predeterminada, AutoGluon predice niveles de cuantiles [0,1, 0,2, 0,3, 0,4, 0,5, 0,6, 0,7, 0,8, 0,9]. Para predecir un conjunto diferente de cuantiles, puede utilizar los argumentos quantile_levels como:

predictor = TimeSeriesPredictor(eval_metric=”WQL”,quantile_levels=[0.1, 0.5, 0.75, 0.9]) [2].

También es posible mostrar la predicción:

importar matplotlib.pyplot como plt plt.figure(figsize=(20, 3)) item_id = "aerolínea" y_past = train.loc[item_id]["Pasajeros"] y_pred = predictions.loc[item_id] y_test = test.loc[ item_id]["Passengers"] plt.plot(y_past, label="Valores de series temporales pasadas") plt.plot(y_pred["mean"], label="Previsión media") plt.plot(y_test, label="Futuro valores de series temporales") plt.fill_between( y_pred.index, y_pred["0.1"], y_pred["0.9"], color="red", alpha=0.1, label=f"10%-90% intervalo de confianza") plt. leyenda();
autogluón

Para utilizar un modelo específico de los modelos entrenados, elija de la clasificación o los modelos disponibles se pueden ver con el siguiente código.

Usando AR profundo

Se puede elegir un modelo preferido en Model Zoo y utilizarlo. Al elegir DeepAR como modelo de interés, el entrenamiento se puede realizar como se muestra a continuación.

predictor = TimeSeriesPredictor(objetivo='Pasajeros', predicción_longitud=19).fit(
tren,
hiperparámetros = {
"AR profundo": {},
},
)
Comenzando el entrenamiento con AutoGluon...
AutoGluon guardará los modelos en 'AutogluonModels\ag-20240201_193851'
=================== Información del sistema ====================
Versión de AutoGluon: 1.0.0
Versión de Python: 3.8.18
Sistema operativo: Windows
Máquina de plataforma: AMD64
Versión de plataforma: 10.0.22621
Número de CPU: 12
Recuento de GPU: 0
Memoria disponible: 1,51 GB / 7,33 GB (20.6%)
Espacio disponible en disco: 262,48 GB / 476,08 GB (55.1%)
===================================================

Encajando con argumentos:
{'enable_ensemble': Verdadero,
'eval_metric': WQL,
'hiperparámetros': {'DeepAR': {}},
'nombres_covariables_conocidos': [],
'num_val_windows': 1,
'predicción_longitud': 19,
'niveles_cuantiles': [0,1, 0,2, 0,3, 0,4, 0,5, 0,6, 0,7, 0,8, 0,9],
'semilla_aleatoria': 123,
'refit_every_n_windows': 1,
'refit_full': Falso,
'objetivo': 'Pasajeros',
'verbosidad': 2}

Frecuencia de series temporales inferidas: 'MS'
Siempre que train_data tenga 77 filas, 1 serie temporal. La duración media de la serie temporal es 77 (mín=77, máx=77).

El conjunto de datos proporcionado contiene las siguientes columnas:
objetivo: 'Pasajeros'

AutoGluon medirá el rendimiento predictivo utilizando una métrica de evaluación: 'WQL'
El signo de esta métrica se ha invertido para adherirse a ser más alto_es_mejor. La puntuación de la métrica se puede multiplicar por -1 para obtener el valor de la métrica.
===================================================

Iniciando el entrenamiento. La hora de inicio es 2024-02-02 01:08:51
Modelos que serán entrenados: ['DeepAR']
Entrenamiento de modelos de series temporales DeepAR.
-0,1003 = Puntuación de validación (-WQL)
50,19 s = tiempo de ejecución del entrenamiento
0,11 s = tiempo de ejecución de validación (predicción)
El conjunto no encaja ya que solo se entrenó 1 modelo.
Formación completa. Modelos entrenados: ['DeepAR']
Tiempo de ejecución total: 50,33 s
Mejor modelo: DeepAR
Puntuación del mejor modelo: -0,1003

predicciones = predictor1.predict(tren)
predicciones
El modelo no especificado en la predicción, se utilizará de forma predeterminada el modelo con la mejor puntuación de validación.

predicciones = predictor.predict(tren)
predicciones

autogluón

importar matplotlib.pyplot como plt

plt.figura(tamaño de figura=(20, 3))

item_id = “aerolínea”
y_past = tren.loc[item_id][“Pasajeros”]
y_pred = predicciones.loc[item_id]
y_test = test.loc[item_id][“Pasajeros”]

plt.plot(y_past, label=”Valores de series temporales pasadas”)
plt.plot(y_pred[“media”], etiqueta =”pronóstico medio”)
plt.plot(y_test, label=”Valores futuros de series temporales”)

plt.fill_between(
y_pred.index, y_pred[“0.1”], y_pred[“0.9″], color=”rojo”, alfa=0.1, etiqueta=f”intervalo de confianza 10%-90%”
)
plt.leyenda();

autogluón

Los modelos se ajustan automáticamente para encontrar la mejor configuración. AutoGluon es una herramienta autoML, el usuario no necesita ajustar los modelos por sí mismo.

Lista de métodos

Modelo ingenuo: modelo de referencia que establece el pronóstico igual al último valor observado.

SeasonalNaiveModel: modelo de referencia que establece el pronóstico igual al último valor observado para la misma temporada.

Modelo promedio: modelo de referencia que iguala el pronóstico a la media o cuantil histórico.

SeasonalAverageModel: modelo de referencia que iguala el pronóstico al promedio histórico o cuantil de la misma temporada.

Modelo Cero: un pronosticador ingenuo que siempre devuelve 0 pronósticos durante el horizonte de pronóstico, donde los intervalos de pronóstico se calculan utilizando una predicción conforme.

Modelo ETS: suavización exponencial con tendencia y estacionalidad.

Modelo AutoARIMA: el modelo ARIMA se configura automáticamente.

Modelo AutoETS: suavizado exponencial ajustado automáticamente con tendencia y estacionalidad.

Modelo AutoCES: pronóstico con un modelo de suavizado exponencial complejo donde la selección del modelo se realiza utilizando el criterio de información de Akaike.

ThetaModel – Modelo de predicción Theta [Assimakopoulos2000].

ADIDAModel – Modelo de previsión de demanda intermitente utilizando el enfoque de demanda intermitente desagregada globalmente [Nikolopoulos2011].

CrostonClassicModel: modelo de pronóstico de demanda intermitente que utiliza el modelo Croston donde el parámetro de suavizado se establece en 0,1 [Croston1972].

Modelo CrostonOptimized: modelo de pronóstico de demanda intermitente que utiliza el modelo Croston donde se optimiza el parámetro de suavizado [Croston1972].

CrostonSBAModel – Modelo de pronóstico de demanda intermitente utilizando el modelo Croston con el enfoque de corrección de sesgo Syntetos-Boylan [SyntetosBoylan2001].

Modelo IMAPA: modelo de pronóstico de demanda intermitente que utiliza un algoritmo de pronóstico de agregación múltiple intermitente [Petropoulos2015].

Modelo NPTS: pronosticador de series temporales no paramétricas.

Modelo DeepAR: modelo de pronóstico autorregresivo basado en una red neuronal recurrente [Salinas2020].

DLinearModel: red neuronal de retroalimentación simple que resta la tendencia antes de realizar el pronóstico [Zeng2023].

PatchTSTModel: pronosticador basado en transformadores que segmenta cada serie temporal en parches [Nie2023].

SimpleFeedForwardModel: red neuronal de retroalimentación simple que predice simultáneamente todos los valores futuros.

Modelo de transformador de fusión temporal: combina LSTM con una capa de transformador para predecir cuantiles de todos los valores objetivo futuros [Lim2021].

Modelo WaveNet: estimador WaveNet que utiliza la arquitectura propuesta en [Oord2016] con objetivos cuantificados.

Direct TabularModel: prediga simultáneamente todos los valores de series temporales futuras utilizando TabularPredictor de AutoGluon-Tabular.

Modelo tabular recursivo: predice valores de series temporales futuras uno por uno utilizando TabularPredictor de AutoGluon-Tabular.

Elección de métricas

Elegir la métrica de evaluación correcta es una de las opciones más importantes cuando se utiliza un marco de AutoML. Esta página enumera las métricas de evaluación de pronóstico disponibles en AutoGluon, explica cuándo se deben usar diferentes métricas y describe cómo definir métricas de evaluación personalizadas.

Al usar AutoGluon, puede especificar la métrica usando el argumento eval_metric de TimeSeriesPredictor, por ejemplo:

desde autogluon.timeseries importar TimeSeriesPredictor

predictor = TimeSeriesPredictor(eval_metric=”MASE”)

AutoGluon siempre informa todas las mediciones en un formato "cuanto más alto, mejor". Para ello, determinadas métricas se multiplican por -1. Por ejemplo, si configuramos eval_metric=”MASE”, el predictor en realidad informará -MASE (es decir, puntuación MASE multiplicada por -1). Esto significa que test_score estará entre 0 (predicción más precisa) y (predicción menos precisa).

Actualmente, AutoGluon admite las siguientes métricas de evaluación:

Pérdida cuantil escalada de SQL.

WQL Pérdida cuantil ponderada.

MAE Error absoluto medio.

MAPE Error absoluto medio en porcentaje.

MASE Error de escala absoluto medio.

MSE Error cuadrático medio.

RMSE Error cuadrático medio.

RMSSE Error de escala cuadrático medio.

SMAPE Error porcentual absoluto medio simétrico.

WAPE Error porcentual absoluto ponderado.

También puede definir una métrica de evaluación de pronóstico personalizada.

Si no está seguro de qué métrica de evaluación elegir, aquí hay tres preguntas que pueden ayudarle a tomar la decisión correcta para su caso de uso.

1. ¿Está interesado en un pronóstico puntual o un pronóstico probabilístico?

Si su objetivo es generar un pronóstico probabilístico preciso, debe utilizar métricas WQL o SQL. Estas métricas se basan en la pérdida de cuantiles y miden la precisión de las predicciones de cuantiles. De forma predeterminada, AutoGluon predice niveles de cuantiles [0,1, 0,2, 0,3, 0,4, 0,5, 0,6, 0,7, 0,8, 0,9]. Para predecir un conjunto diferente de cuantiles, puede utilizar el argumento quantile_levels:

predictor = TimeSeriesPredictor(eval_metric= »WQL », quantile_levels=[0.1, 0.5, 0.75, 0.9])

Todas las demás medidas de pronóstico descritas en esta página son medidas de pronóstico puntuales. Tenga en cuenta que si selecciona eval_metric para una métrica de pronóstico puntual al crear TimeSeriesPredictor, el pronóstico que minimiza esa métrica siempre se proporcionará en la columna "promedio" del marco de datos de predicciones.

2. ¿Le importa más predecir con precisión series de tiempo con valores grandes?

Si la respuesta es "sí" (por ejemplo, si es importante predecir con mayor precisión las ventas de productos populares), debe utilizar métricas dependientes de la escala como WQL, MAE, RMSE o WAPE. Estas métricas también son adecuadas para procesar series temporales escasas (intermitentes) con muchos ceros.

Si la respuesta es "no" (le importan por igual todas las series temporales del conjunto de datos), considere métricas escaladas como SQL, MASE y RMSSE. Alternativamente, las medidas basadas en porcentajes MAPE y SMAPE también se pueden utilizar para igualar la escala entre series temporales. Sin embargo, estas medidas basadas en porcentajes tienen algunas limitaciones bien documentadas, por lo que no recomendamos su uso en la práctica. Tenga en cuenta que las métricas escaladas y basadas en porcentajes no son adecuadas para datos escasos (intermitentes).

3. (Solo pronóstico puntual) ¿Quiere estimar la media o la mediana?

Para estimar la mediana, debes utilizar métricas como MAE, MASE o WAPE. Si su objetivo es predecir la media (valor esperado), debe utilizar las métricas MSE, RMSE o RMSSE.

autogluón