Predecir una sola serie temporal con un modelo univariante ARIMA_PLUS

En este tutorial se explica cómo usar un ARIMA_PLUSmodelo de serie temporal univariante para predecir el valor futuro de una columna determinada en función de los valores históricos de esa columna.

En este tutorial se prevé una sola serie temporal. Los valores previstos se calculan una vez por cada punto temporal de los datos de entrada.

En este tutorial se usan datos de la bigquery-public-data.google_analytics_sample.ga_sessionstabla de ejemplo pública. Esta tabla contiene datos de comercio electrónico ofuscados de Google Merchandise Store.

Crear conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.

Consola

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a la página de BigQuery

  2. En el panel Explorador, haz clic en el nombre de tu proyecto.

  3. Haga clic en Ver acciones > Crear conjunto de datos.

  4. En la página Crear conjunto de datos, haz lo siguiente:

    • En ID del conjunto de datos, introduce bqml_tutorial.

    • En Tipo de ubicación, selecciona Multirregión y, a continuación, EE. UU. (varias regiones de Estados Unidos).

    • Deje el resto de los ajustes predeterminados como están y haga clic en Crear conjunto de datos.

bq

Para crear un conjunto de datos, usa el comando bq mk con la marca --location. Para ver una lista completa de los parámetros posibles, consulta la referencia del comando bq mk --dataset.

  1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos definida como US y la descripción BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    En lugar de usar la marca --dataset, el comando usa el acceso directo -d. Si omite -d y --dataset, el comando creará un conjunto de datos de forma predeterminada.

  2. Confirma que se ha creado el conjunto de datos:

    bq ls

API

Llama al método datasets.insert con un recurso de conjunto de datos definido.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Visualizar los datos de entrada

Antes de crear el modelo, puedes visualizar los datos de la serie temporal de entrada para hacerte una idea de la distribución. Para ello, puedes usar Looker Studio.

Sigue estos pasos para visualizar los datos de la serie temporal:

SQL

En la siguiente consulta de GoogleSQL, la instrucción SELECT analiza la columna date de la tabla de entrada y la convierte al tipo TIMESTAMP, le cambia el nombre a parsed_date y usa las cláusulas SUM(...) y GROUP BY date para crear un valor totals.visits diario.

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
    PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
    SUM(totals.visits) AS total_visits
    FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date;
    1. Cuando se complete la consulta, haz clic en Explorar datos > Explorar con Looker Studio. Looker Studio se abre en una pestaña nueva. Sigue estos pasos en la nueva pestaña.

    2. En Looker Studio, haz clic en Insertar > Gráfico de serie temporal.

    3. En el panel Gráfico, selecciona la pestaña Configuración.

    4. En la sección Métrica, añade el campo total_visits y quita la métrica predeterminada Número de registros. El gráfico resultante será similar al siguiente:

      Result_visualization

      Si observas el gráfico, verás que la serie temporal de entrada tiene un patrón estacional semanal.

      .

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

import bigframes.pandas as bpd

# Start by loading the historical data from BigQuerythat you want to analyze and forecast.
# This clause indicates that you are querying the ga_sessions_* tables in the google_analytics_sample dataset.
# Read and visualize the time series you want to forecast.
df = bpd.read_gbq("bigquery-public-data.google_analytics_sample.ga_sessions_*")
parsed_date = bpd.to_datetime(df.date, format="%Y%m%d", utc=True)
parsed_date.name = "parsed_date"
visits = df["totals"].struct.field("visits")
visits.name = "total_visits"
total_visits = visits.groupby(parsed_date).sum()

# Expected output: total_visits.head()
# parsed_date
# 2016-08-01 00:00:00+00:00    1711
# 2016-08-02 00:00:00+00:00    2140
# 2016-08-03 00:00:00+00:00    2890
# 2016-08-04 00:00:00+00:00    3161
# 2016-08-05 00:00:00+00:00    2702
# Name: total_visits, dtype: Int64

total_visits.plot.line()

El resultado es similar al siguiente: Result_visualization

Crear el modelo de serie temporal

Crea un modelo de serie temporal para predecir el total de visitas al sitio representado por la columna totals.visits y entrénalo con los datos de Google Analytics 360.

SQL

En la siguiente consulta, la cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica que estás creando un modelo de serie temporal basado en ARIMA. La opción auto_arima de la instrucción CREATE MODEL tiene el valor predeterminado TRUE, por lo que el algoritmo auto.ARIMA ajusta automáticamente los hiperparámetros del modelo. El algoritmo ajusta decenas de modelos candidatos y elige el mejor, que es el que tiene el criterio de información de Akaike (AIC) más bajo. La opción data_frequency de las instrucciones CREATE MODEL tiene el valor predeterminado AUTO_FREQUENCY, por lo que el proceso de entrenamiento infiere automáticamente la frecuencia de los datos de la serie temporal de entrada. La opción decompose_time_series de la instrucción CREATE MODEL tiene el valor predeterminado TRUE, por lo que se devuelve información sobre los datos de la serie temporal al evaluar el modelo en el paso siguiente.

Sigue estos pasos para crear el modelo:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    CREATE OR REPLACE MODEL `bqml_tutorial.ga_arima_model`
    OPTIONS
    (model_type = 'ARIMA_PLUS',
     time_series_timestamp_col = 'parsed_date',
     time_series_data_col = 'total_visits',
     auto_arima = TRUE,
     data_frequency = 'AUTO_FREQUENCY',
     decompose_time_series = TRUE
    ) AS
    SELECT
    PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
    SUM(totals.visits) AS total_visits
    FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date;

    La consulta tarda unos 4 segundos en completarse. Después, puedes acceder al modelo ga_arima_model. Como la consulta usa una instrucción CREATE MODEL para crear un modelo, no se muestran resultados.

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

from bigframes.ml import forecasting
import bigframes.pandas as bpd

# Create a time series model to forecast total site visits:
# The auto_arima option defaults to True, so the auto.ARIMA algorithm automatically
# tunes the hyperparameters in the model.
# The data_frequency option defaults to 'auto_frequency so the training
# process automatically infers the data frequency of the input time series.
# The decompose_time_series option defaults to True, so that information about
# the time series data is returned when you evaluate the model in the next step.
model = forecasting.ARIMAPlus()
model.auto_arima = True
model.data_frequency = "auto_frequency"
model.decompose_time_series = True

# Use the data loaded in the previous step to fit the model
training_data = total_visits.to_frame().reset_index(drop=False)

X = training_data[["parsed_date"]]
y = training_data[["total_visits"]]

model.fit(X, y)

Evalúa los modelos candidatos

SQL

Evalúa los modelos de series temporales con la función ML.ARIMA_EVALUATE. La función ML.ARIMA_EVALUATE muestra las métricas de evaluación de todos los modelos candidatos evaluados durante el proceso de ajuste automático de hiperparámetros.

Sigue estos pasos para evaluar el modelo:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
    *
    FROM
    ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.ga_arima_model`);

    Los resultados deberían ser similares a los siguientes:

    Resultado de ML.ARIMA_EVALUATE.

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

# Evaluate the time series models by using the summary() function. The summary()
# function shows you the evaluation metrics of all the candidate models evaluated
# during the process of automatic hyperparameter tuning.
summary = model.summary(
    show_all_candidate_models=True,
)
print(summary.peek())

# Expected output:
# row   non_seasonal_p	non_seasonal_d	non_seasonal_q	has_drift	log_likelihood	AIC	variance	seasonal_periods	has_holiday_effect	has_spikes_and_dips	has_step_changes	error_message
#  0	      0	              1	               3	      True	     -2464.255656	4938.511313	     42772.506055	        ['WEEKLY']	            False	        False	            True
#  1	      2	              1	               0	      False	     -2473.141651	4952.283303	     44942.416463	        ['WEEKLY']	            False	        False	            True
#  2	      1	              1	               0 	      False	     -2479.880885	4963.76177	     46642.953433	        ['WEEKLY']	            False	        False	            True
#  3	      0	              1	               1	      False	     -2470.632377	4945.264753	     44319.379307	        ['WEEKLY']	            False	        False	            True
#  4	      2	              1	               1	      True	     -2463.671247	4937.342493	     42633.299513	        ['WEEKLY']	            False	        False	            True

Las columnas de salida non_seasonal_p, non_seasonal_d, non_seasonal_q y has_drift definen un modelo ARIMA en el flujo de entrenamiento. Las columnas de salida log_likelihood, AIC y variance son relevantes para el proceso de ajuste del modelo ARIMA.

El algoritmo auto.ARIMA usa la prueba KPSS para determinar el mejor valor de non_seasonal_d, que en este caso es 1. Cuando non_seasonal_d es 1, el algoritmo auto.ARIMA entrena 42 modelos ARIMA candidatos diferentes en paralelo. En este ejemplo, los 42 modelos candidatos son válidos, por lo que el resultado contiene 42 filas, una por cada modelo ARIMA candidato. En los casos en los que algunos de los modelos no son válidos, se excluyen del resultado. Estos modelos candidatos se devuelven en orden ascendente según el criterio de información de la IA. El modelo de la primera fila tiene el AIC más bajo y se considera el mejor modelo. El mejor modelo se guarda como modelo final y se usa cuando llamas a funciones como ML.FORECAST en el modelo.

La columna seasonal_periods contiene información sobre el patrón estacional identificado en los datos de serie temporal. No tiene nada que ver con el modelo ARIMA, por lo que tiene el mismo valor en todas las filas de salida. Informa de un patrón semanal, que coincide con los resultados que has visto si has elegido visualizar los datos de entrada.

Las columnas has_holiday_effect, has_spikes_and_dips y has_step_changes solo se rellenan cuando decompose_time_series=TRUE. Estas columnas también reflejan información sobre los datos de series temporales de entrada y no están relacionadas con el modelado ARIMA. Estas columnas también tienen los mismos valores en todas las filas de salida.

En la columna error_message se muestran los errores que se han producido durante el proceso de auto.ARIMAajuste. Una de las posibles razones por las que se producen errores es que las columnas non_seasonal_p, non_seasonal_d, non_seasonal_q y has_drift seleccionadas no pueden estabilizar la serie temporal. Para obtener el mensaje de error de todos los modelos candidatos, defina la opción show_all_candidate_models en TRUE al crear el modelo.

Para obtener más información sobre las columnas de salida, consulta la función ML.ARIMA_EVALUATE.

Inspeccionar los coeficientes del modelo

SQL

Inspecciona los coeficientes del modelo de serie temporal con la función ML.ARIMA_COEFFICIENTS.

Sigue estos pasos para obtener los coeficientes del modelo:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
    *
    FROM
    ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.ga_arima_model`);

La columna ar_coefficients muestra los coeficientes del modelo de la parte autorregresiva (AR) del modelo ARIMA. Del mismo modo, la columna ma_coefficients output muestra los coeficientes del modelo de la parte de media móvil (MA) del modelo ARIMA. Ambas columnas contienen valores de matriz cuya longitud es igual a non_seasonal_p y non_seasonal_q, respectivamente. En el resultado de la función ML.ARIMA_EVALUATE, has visto que el mejor modelo tiene un valor de non_seasonal_p de 2 y un valor de non_seasonal_q de 3. Por lo tanto, en la salida ML.ARIMA_COEFFICIENTS, el valor ar_coefficients es una matriz de dos elementos y el valor ma_coefficients es una matriz de tres elementos. El valor de intercept_or_drift es el término constante del modelo ARIMA.

Para obtener más información sobre las columnas de salida, consulta la función ML.ARIMA_COEFFICIENTS.

BigQuery DataFrames

Inspecciona los coeficientes del modelo de serie temporal con la función coef_.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

coef = model.coef_
print(coef.peek())

# Expected output:
#       ar_coefficients   ma_coefficients   intercept_or_drift
#   0	 [0.40944762]	   [-0.81168198]	      0.0

La columna ar_coefficients muestra los coeficientes del modelo de la parte autorregresiva (AR) del modelo ARIMA. Del mismo modo, la columna ma_coefficients output muestra los coeficientes del modelo de la parte de media móvil (MA) del modelo ARIMA. Ambas columnas contienen valores de matriz cuya longitud es igual a non_seasonal_p y non_seasonal_q, respectivamente.

Usar el modelo para predecir datos

SQL

Prevé valores futuros de series temporales con la función ML.FORECAST.

En la siguiente consulta de GoogleSQL, la cláusula STRUCT(30 AS horizon, 0.8 AS confidence_level) indica que la consulta prevé 30 puntos temporales futuros y genera un intervalo de predicción con un nivel de confianza del 80 %.

Sigue estos pasos para predecir datos con el modelo:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
    *
    FROM
    ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
              STRUCT(30 AS horizon, 0.8 AS confidence_level));

    Los resultados deberían ser similares a los siguientes:

    Salida de ML.FORECAST.

BigQuery DataFrames

Prevé valores futuros de series temporales con la función predict.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

prediction = model.predict(horizon=30, confidence_level=0.8)

print(prediction.peek())
# Expected output:
#           forecast_timestamp	   forecast_value	standard_error	confidence_level	prediction_interval_lower_bound	    prediction_interval_upper_bound	    confidence_interval_lower_bound	    confidence_interval_upper_bound
# 11	2017-08-13 00:00:00+00:00	1845.439732	      328.060405	      0.8	                 1424.772257	                      2266.107208	                     1424.772257	                     2266.107208
# 29	2017-08-31 00:00:00+00:00	2615.993932	      431.286628	      0.8	                 2062.960849	                      3169.027015	                     2062.960849	                     3169.027015
# 7	    2017-08-09 00:00:00+00:00	2639.285993	      300.301186	      0.8	                 2254.213792	                      3024.358193	                     2254.213792	                     3024.358193
# 25	2017-08-27 00:00:00+00:00	1853.735689	      410.596551	      0.8	                 1327.233216	                      2380.238162	                     1327.233216	                     2380.238162
# 1	    2017-08-03 00:00:00+00:00	2621.33159	      241.093355	      0.8	                 2312.180802	                      2930.482379	                     2312.180802	                     2930.482379

Las filas de salida están ordenadas cronológicamente por el valor de la columna forecast_timestamp. En la previsión de series temporales, el intervalo de predicción, representado por los valores de las columnas prediction_interval_lower_bound y prediction_interval_upper_bound, es tan importante como el valor de la columna forecast_value. El valor forecast_value es el punto medio del intervalo de predicción. El intervalo de predicción depende de los valores de las columnas standard_error y confidence_level.

Para obtener más información sobre las columnas de salida, consulta la función ML.FORECAST.

Explicar los resultados de las previsiones

SQL

Puede obtener métricas de interpretabilidad además de datos de previsión mediante la función ML.EXPLAIN_FORECAST. La función ML.EXPLAIN_FORECAST predice los valores de series temporales futuras y también devuelve todos los componentes independientes de la serie temporal.

Al igual que la función ML.FORECAST, la cláusula STRUCT(30 AS horizon, 0.8 AS confidence_level) utilizada en la función ML.EXPLAIN_FORECAST indica que la consulta pronostica 30 puntos temporales futuros y genera un intervalo de predicción con una confianza del 80 %.

Sigue estos pasos para explicar los resultados del modelo:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
    *
    FROM
    ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
     STRUCT(30 AS horizon, 0.8 AS confidence_level));

    Los resultados deberían ser similares a los siguientes:

    Las nueve primeras columnas de salida de los datos previstos y las explicaciones de las previsiones. Las columnas de salida de la décima a la decimoséptima, que contienen datos previstos y explicaciones de las previsiones. Las seis últimas columnas de resultados de datos previstos y explicaciones de las previsiones.

    Las filas de salida se ordenan cronológicamente por el valor de la columna time_series_timestamp.

    Para obtener más información sobre las columnas de salida, consulta la función ML.EXPLAIN_FORECAST.

BigQuery DataFrames

Puede obtener métricas de interpretabilidad además de datos de previsión mediante la función predict_explain. La función predict_explain pronostica los valores de series temporales futuros y también devuelve todos los componentes independientes de la serie temporal.

Al igual que la función predict, la cláusula horizon=30, confidence_level=0.8 utilizada en la función predict_explain indica que la consulta pronostica 30 puntos temporales futuros y genera un intervalo de predicción con una confianza del 80 %.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

ex_pred = model.predict_explain(horizon=30, confidence_level=0.8)

print(ex_pred.head(4))
# Expected output:
#       time_series_timestamp	  time_series_type	    time_series_data	time_series_adjusted_data	 standard_error	   confidence_level	   prediction_interval_lower_bound	   prediction_interval_upper_bound	  trend	   seasonal_period_yearly	  seasonal_period_quarterly	    seasonal_period_monthly	   seasonal_period_weekly	  seasonal_period_daily	    holiday_effect	   spikes_and_dips	   step_changes	   residual
# 0	  2016-08-01 00:00:00+00:00	      history	             1711.0	               505.716474	           206.939556	         <NA>	                    <NA>	                            <NA>	               0.0	           <NA>	                        <NA>	                     <NA>	                 169.611938	                  <NA>	                <NA>	            <NA>	       1205.283526	   336.104536
# 1	  2016-08-02 00:00:00+00:00	      history	             2140.0	               623.137701	           206.939556	         <NA>	                    <NA>	                            <NA>	            336.104428	       <NA>	                        <NA>	                     <NA>	                 287.033273	                  <NA>	                <NA>	            <NA>	       1205.283526	   311.578773
# 2	  2016-08-03 00:00:00+00:00	      history	             2890.0	               1008.655091	           206.939556	         <NA>	                    <NA>	                            <NA>	            563.514213	       <NA>	                        <NA>	                     <NA>	                 445.140878	                  <NA>	                <NA>	            <NA>	       1205.283526	   676.061383
# 3	  2016-08-04 00:00:00+00:00	      history	             3161.0	               1389.40959	           206.939556	         <NA>	                    <NA>	                            <NA>	            986.317236	       <NA>	                        <NA>	                     <NA>	                 403.092354	                  <NA>	                <NA>	            <NA>	       1205.283526	   566.306884
# 4	  2016-08-05 00:00:00+00:00	      history	             2702.0	               1394.395741	           206.939556	         <NA>	                    <NA>	                            <NA>	            1248.707386	       <NA>	                        <NA>	                     <NA>	                 145.688355	                  <NA>	                <NA>	            <NA>	       1205.283526	   102.320733
# 5	  2016-08-06 00:00:00+00:00	      history	             1663.0	               437.09243	           206.939556	         <NA>	                    <NA>	                            <NA>	            1188.59004	       <NA>	                        <NA>	                     <NA>	                 -751.49761	                  <NA>	                <NA>	            <NA>	       1205.283526	    20.624044

Si quieres visualizar los resultados, puedes usar Looker Studio, tal como se describe en la sección Visualizar los datos de entrada, para crear un gráfico con las siguientes columnas como métricas:

  • time_series_data
  • prediction_interval_lower_bound
  • prediction_interval_upper_bound
  • trend
  • seasonal_period_weekly
  • step_changes