Previsión de una sola serie temporal con un modelo multivariante

En este tutorial se explica cómo usar un modelo de serie temporal multivariante para predecir el valor futuro de una columna determinada en función del valor histórico de varias funciones de entrada.

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 del bigquery-public-data.epa_historical_air_qualityconjunto de datos público. Este conjunto de datos contiene información sobre partículas (PM2,5), temperatura y velocidad del viento recogidos a diario en varias ciudades de EE.UU.

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)

Crear una tabla de datos de entrada

Crea una tabla de datos que puedas usar para entrenar y evaluar el modelo. Esta tabla combina columnas de varias tablas del conjunto de datos bigquery-public-data.epa_historical_air_quality para proporcionar datos meteorológicos diarios. También debe crear las siguientes columnas para usarlas como variables de entrada del modelo:

  • date: la fecha de la observación
  • pm25 el valor medio de PM2,5 de cada día
  • wind_speed: la velocidad media del viento de cada día
  • temperature: la temperatura más alta de cada día

En la siguiente consulta de GoogleSQL, la cláusula FROM bigquery-public-data.epa_historical_air_quality.*_daily_summary indica que está consultando las tablas *_daily_summary del conjunto de datos epa_historical_air_quality. Estas tablas son tablas con particiones.

Sigue estos pasos para crear la tabla de datos de entrada:

  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 TABLE `bqml_tutorial.seattle_air_quality_daily`
    AS
    WITH
      pm25_daily AS (
        SELECT
          avg(arithmetic_mean) AS pm25, date_local AS date
        FROM
          `bigquery-public-data.epa_historical_air_quality.pm25_nonfrm_daily_summary`
        WHERE
          city_name = 'Seattle'
          AND parameter_name = 'Acceptable PM2.5 AQI & Speciation Mass'
        GROUP BY date_local
      ),
      wind_speed_daily AS (
        SELECT
          avg(arithmetic_mean) AS wind_speed, date_local AS date
        FROM
          `bigquery-public-data.epa_historical_air_quality.wind_daily_summary`
        WHERE
          city_name = 'Seattle' AND parameter_name = 'Wind Speed - Resultant'
        GROUP BY date_local
      ),
      temperature_daily AS (
        SELECT
          avg(first_max_value) AS temperature, date_local AS date
        FROM
          `bigquery-public-data.epa_historical_air_quality.temperature_daily_summary`
        WHERE
          city_name = 'Seattle' AND parameter_name = 'Outdoor Temperature'
        GROUP BY date_local
      )
    SELECT
      pm25_daily.date AS date, pm25, wind_speed, temperature
    FROM pm25_daily
    JOIN wind_speed_daily USING (date)
    JOIN temperature_daily USING (date);

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:

  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
      `bqml_tutorial.seattle_air_quality_daily`;
  3. 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.

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

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

  6. En la sección Métrica, añade los campos pm25, temperature y wind_speed, y quita la métrica predeterminada Número de registros. El gráfico resultante será similar al siguiente:

    Gráfico que muestra el tiempo a lo largo del tiempo.

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

.

Crear el modelo de serie temporal

Crea un modelo de serie temporal para predecir los valores de partículas, representados por la columna pm25, usando los valores de las columnas pm25, wind_speed y temperature como variables de entrada. Entrena el modelo con los datos de calidad del aire de la tabla bqml_tutorial.seattle_air_quality_daily. Para ello, selecciona los datos recogidos entre el 1 de enero del 2012 y el 31 de diciembre del 2020.

En la siguiente consulta, la cláusula OPTIONS(model_type='ARIMA_PLUS_XREG', time_series_timestamp_col='date', ...) indica que estás creando un modelo ARIMA con regresores externos. 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.

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.seattle_pm25_xreg_model`
      OPTIONS (
        MODEL_TYPE = 'ARIMA_PLUS_XREG',
        time_series_timestamp_col = 'date',  # Identifies the column that contains time points
        time_series_data_col = 'pm25')       # Identifies the column to forecast
    AS
    SELECT
      date,                                  # The column that contains time points
      pm25,                                  # The column to forecast
      temperature,                           # Temperature input to use in forecasting
      wind_speed                             # Wind speed input to use in forecasting
    FROM
      `bqml_tutorial.seattle_air_quality_daily`
    WHERE
      date
      BETWEEN DATE('2012-01-01')
      AND DATE('2020-12-31');

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

Evalúa los modelos candidatos

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 que se evaluaron 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.seattle_pm25_xreg_model`);

    Los resultados deberían ser similares a los siguientes:

    Métricas de evaluación del modelo de serie temporal.

    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 por AIC. 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 proporcionan información sobre los datos de series temporales de entrada y no están relacionadas con el modelado ARIMA. Estas columnas se devuelven porque el valor de la opción decompose_time_series de la instrucción CREATE MODEL es TRUE. 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

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.seattle_pm25_xreg_model`);

    Los resultados deberían ser similares a los siguientes:

    Coeficientes del modelo de serie temporal.

    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 0 y un valor de non_seasonal_q de 5. Por lo tanto, en la salida ML.ARIMA_COEFFICIENTS, el valor ar_coefficients es una matriz vacía y el valor ma_coefficients es una matriz de 5 elementos. El valor de intercept_or_drift es el término constante del modelo ARIMA.

    Las columnas de salida processed_input, weight y category_weights muestran los pesos de cada característica y la intersección del modelo de regresión lineal. Si la característica es numérica, el peso se indica en la columna weight. Si la característica es categórica, el valor de category_weights es un array de valores struct, donde cada valor struct contiene el nombre y el peso de una categoría determinada.

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

Usar el modelo para predecir datos

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.seattle_pm25_xreg_model`,
        STRUCT(30 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            date,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ));

    Los resultados deberían ser similares a los siguientes:

    Resultados previstos del modelo de serie temporal.

    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.

Evaluar la precisión de las previsiones

Evalúa la precisión de las previsiones del modelo con la función ML.EVALUATE.

En la siguiente consulta de GoogleSQL, la segunda instrucción SELECT proporciona los datos con las funciones futuras, que se usan para predecir los valores futuros y compararlos con los datos reales.

Sigue estos pasos para evaluar la precisión 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.EVALUATE(
        MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
        (
          SELECT
            date,
            pm25,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ),
        STRUCT(
          TRUE AS perform_aggregation,
          30 AS horizon));

    Los resultados deberían ser similares a los siguientes:

    Métricas de evaluación del modelo.

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

Explicar los resultados de las previsiones

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.seattle_pm25_xreg_model`,
        STRUCT(30 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            date,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ));

    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.