Previsiones con Prophet

Prophet es un modelo de previsión mantenido por Meta. Consulta el artículo sobre Prophet para obtener información detallada sobre el algoritmo y la documentación para obtener más información sobre la biblioteca.

Al igual que BigQuery ML ARIMA_PLUS, Prophet intenta descomponer cada serie temporal en tendencias, temporadas y festivos, y genera una previsión mediante la agregación de las inferencias de estos modelos. Sin embargo, una diferencia importante es que ARIMA+ de BQML usa ARIMA para modelizar el componente de tendencia, mientras que Prophet intenta ajustar una curva mediante un modelo lineal o logístico por tramos.

Google Cloud ofrece un flujo de procesamiento para entrenar un modelo de Prophet y otro para obtener inferencias por lotes de un modelo de Prophet. Ambos flujos de procesamiento son instancias de Vertex AI Pipelines de Google Cloud Pipeline Components (GCPC).

La integración de Prophet con Vertex AI te permite hacer lo siguiente:

Aunque Prophet es un modelo multivariante, Vertex AI solo admite una versión univariante.

Para obtener información sobre las cuentas de servicio que usa este flujo de trabajo, consulta Cuentas de servicio para flujos de trabajo tabulares.

APIs de flujo de trabajo

Este flujo de trabajo usa las siguientes APIs:

  • Vertex AI
  • Dataflow
  • BigQuery
  • Cloud Storage

Entrenar un modelo con Prophet

Prophet se ha diseñado para una sola serie temporal. Vertex AI agrega datos por ID de serie temporal y entrena un modelo de Prophet para cada serie temporal. La canalización de entrenamiento de modelos realiza el ajuste de hiperparámetros mediante la búsqueda de cuadrícula y la lógica de retropuebas integrada de Prophet.

Para admitir varias series temporales, la canalización usa un trabajo de entrenamiento personalizado de Vertex AI y Dataflow para entrenar varios modelos de Prophet en paralelo. En general, el número de modelos entrenados es el producto del número de series temporales y el número de pruebas de ajuste de hiperparámetros.

En el siguiente código de ejemplo se muestra cómo ejecutar una canalización de entrenamiento de modelos de Prophet:

job = aiplatform.PipelineJob(
    ...
    template_path=train_job_spec_path,
    parameter_values=train_parameter_values,
    ...
)
job.run(service_account=SERVICE_ACCOUNT)

El parámetro opcional service_account de job.run() te permite definir la cuenta de servicio de Vertex AI Pipelines como la que elijas.

La siguiente función define la canalización y los valores de los parámetros.

(
    train_job_spec_path,
    train_parameter_values,
) = utils.get_prophet_train_pipeline_and_parameters(
    ...
)

A continuación, se muestra un subconjunto de parámetros de get_prophet_train_pipeline_and_parameters:

Nombre del parámetro Tipo Definición
project Cadena El ID de tu proyecto.
location Cadena Tu región.
root_dir Cadena Ubicación de Cloud Storage donde se almacenará el resultado.
target_column Cadena La columna (valor) que quieres que prediga este modelo.
time_column Cadena La columna de tiempo. Debe especificar una columna de tiempo y debe tener un valor en cada fila. La columna Hora indica la hora a la que se hizo una observación determinada.
time_series_identifier_column Cadena La columna del identificador de la serie temporal. Debe especificar una columna de identificador de serie temporal y debe tener un valor en cada fila. Los datos de entrenamiento de las previsiones suelen incluir varias series temporales, y el identificador indica a Vertex AI a qué serie temporal pertenece una observación determinada de los datos de entrenamiento. Todas las filas de una serie temporal determinada tienen el mismo valor en la columna del identificador de la serie temporal. Algunos identificadores de series temporales habituales pueden ser el ID de producto, el ID de tienda o una región. Es posible entrenar un modelo de previsión en una sola serie temporal, con un valor idéntico para todas las filas de la columna del identificador de la serie temporal. Sin embargo, Vertex AI es más adecuado para datos de entrenamiento que contienen dos o más series temporales. Para obtener los mejores resultados, usa al menos 10 series temporales por cada columna que utilices para entrenar el modelo.
data_granularity_unit Cadena Unidad que se va a usar para la granularidad de los datos de entrenamiento, el horizonte de previsión y la ventana de contexto. Puede ser minute, hour, day, week, month o year. Consulta cómo elegir la granularidad de los datos.
data_source_csv_filenames Cadena Un URI de un archivo CSV almacenado en Cloud Storage.
data_source_bigquery_table_path Cadena URI de una tabla de BigQuery.
forecast_horizon Entero El horizonte de previsión determina hasta qué punto en el futuro el modelo prevé el valor objetivo de cada fila de datos de inferencia. El horizonte de previsión se especifica en unidades de granularidad de los datos. Más información
optimization_objective Cadena Objetivo de optimización del modelo. Más información
max_num_trials Entero Número máximo de pruebas de ajuste que se deben realizar por serie temporal.

Parámetros de Dataflow

A continuación, se muestra un subconjunto de get_prophet_train_pipeline_and_parameters parámetros para personalizar Dataflow:

Nombre del parámetro Tipo Definición
trainer_dataflow_machine_type Cadena Tipo de máquina de Dataflow que se debe usar para el entrenamiento.
trainer_dataflow_max_num_workers Entero Número máximo de trabajadores de Dataflow que se deben usar para la preparación.
evaluation_dataflow_machine_type Cadena Tipo de máquina de Dataflow que se debe usar para la evaluación.
evaluation_dataflow_max_num_workers Entero Número máximo de trabajadores de Dataflow que se deben usar para la evaluación.
dataflow_service_account Cadena Cuenta de servicio personalizada para ejecutar tareas de Dataflow. Puedes configurar el trabajo de Dataflow para que use IPs privadas y una subred de VPC específica. Este parámetro anula la cuenta de servicio de trabajador de Dataflow predeterminada.

Como las tareas de entrenamiento de Prophet se ejecutan en Dataflow, se produce un tiempo de inicio inicial de entre 5 y 7 minutos. Para reducir el tiempo de ejecución adicional, puedes aumentar o ampliar la escala. Por ejemplo, para aumentar la escala, cambia el tipo de máquina de n1-standard-1 a e2-highcpu-8. Para escalar horizontalmente, aumenta el número de trabajadores de 1 a 200.

Parámetros de división de datos

El flujo de entrenamiento ofrece las siguientes opciones para dividir los datos:

División de datos Descripción Parámetros
División predeterminada Vertex AI selecciona aleatoriamente el 80% de las filas de datos para el conjunto de entrenamiento, el 10% para el conjunto de validación y el 10% para el conjunto de prueba. Vertex AI usa la columna Tiempo para determinar el orden cronológico de las filas de datos. Ninguno
División de fracciones Vertex AI usa los valores que proporciones para dividir tus datos en el conjunto de entrenamiento, el conjunto de validación y el conjunto de prueba. Vertex AI usa la columna Tiempo para determinar el orden cronológico de las filas de datos.
  • training_fraction
  • validation_fraction
  • test_fraction
División de marcas de tiempo Vertex AI usa los valores training_fraction, validation_fraction y test_fraction para dividir los datos en el conjunto de entrenamiento, el conjunto de validación y el conjunto de prueba. Vertex AI usa la columna timestamp_split_key para determinar el orden cronológico de las filas de datos.
  • training_fraction
  • validation_fraction
  • test_fraction
  • timestamp_split_key
División manual (predefinida) Vertex AI divide los datos usando los valores PREPARAR, VALIDAR o PROBAR de la columna predefined_split_key.
  • predefined_split_key

Los parámetros de división de datos se definen en get_prophet_train_pipeline_and_parameters de la siguiente manera:

Nombre del parámetro Tipo Definición
predefined_split_key Cadena Nombre de la columna que contiene los valores de entrenamiento, validación o prueba. Defina este valor si usa una división manual (predefinida).
training_fraction Flotante Porcentaje de los datos que se asignarán al conjunto de entrenamiento. Defina este valor si utiliza una división de fracciones o una división de marcas de tiempo.
validation_fraction Flotante Porcentaje de los datos que se asignarán al conjunto de validación. Defina este valor si utiliza una división de fracciones o una división de marcas de tiempo.
test_fraction Flotante Porcentaje de los datos que se asignarán al conjunto de prueba. Defina este valor si utiliza una división de fracciones o una división de marcas de tiempo.
timestamp_split_key Cadena Nombre de la columna que contiene las marcas de tiempo de la división de datos. Define este valor si usas una división de marca de tiempo.

Parámetros de ventana

Vertex AI genera ventanas de previsión a partir de los datos de entrada mediante una estrategia de ventana móvil. Si no defines los parámetros de la ventana, Vertex AI usará la estrategia de recuento con un valor máximo predeterminado de 100,000,000. La canalización de entrenamiento ofrece las siguientes estrategias de ventana móvil:

Estrategia de ventana móvil Descripción Parámetros
Recuento El número de ventanas generadas por Vertex AI no debe superar el máximo proporcionado por el usuario. Si el número de filas del conjunto de datos de entrada es inferior al número máximo de ventanas, se utiliza cada fila para generar una ventana. De lo contrario, Vertex AI realiza un muestreo aleatorio para seleccionar las filas. El valor predeterminado del número máximo de ventanas es 100,000,000. El número máximo de ventanas no puede superar 100,000,000. window_max_count
Stride Vertex AI usa una de cada X filas de entrada para generar una ventana, hasta un máximo de 100.000.000 ventanas. Esta opción es útil para las inferencias estacionales o periódicas. Por ejemplo, puede limitar las previsiones a un solo día de la semana si asigna el valor 7 a la longitud del paso. El valor puede estar entre 1 y 1000. window_stride_length
Columna Puede añadir una columna a sus datos de entrada en la que los valores sean True o False. Vertex AI genera una ventana para cada fila de entrada en la que el valor de la columna es True. Los valores de True y False se pueden definir en cualquier orden, siempre que el número total de filas de True sea inferior a 100,000,000. Aunque lo ideal es usar valores booleanos, también se aceptan valores de cadena. En los valores de cadena no se distingue entre mayúsculas y minúsculas. window_column

Los parámetros de la ventana se definen en get_prophet_train_pipeline_and_parameters de la siguiente manera:

Nombre del parámetro Tipo Definición
window_column Cadena Nombre de la columna con los valores True y False.
window_stride_length Entero Valor de la longitud de zancada.
window_max_count Entero El número máximo de ventanas.

Hacer inferencias con Prophet

La pipeline de entrenamiento de modelos de Vertex AI para Prophet crea un modelo de Prophet para cada serie temporal de los datos. La canalización de inferencia agrega los datos de entrada por ID de serie temporal y calcula las inferencias por separado para cada serie temporal. A continuación, la canalización desagrega los resultados de la inferencia para que coincidan con el formato de Vertex AI Forecasting.

En el siguiente código de ejemplo se muestra cómo ejecutar una canalización de inferencia de Prophet:

job = aiplatform.PipelineJob(
    ...
    template_path=prediction_job_spec_path,
    parameter_values=prediction_parameter_values,
    ...
)
job.run(...)

La siguiente función define la canalización y los valores de los parámetros.

(
    prediction_job_spec_path,
    prediction_parameter_values,
) = utils.get_prophet_prediction_pipeline_and_parameters(
    ...
)

A continuación, se muestra un subconjunto de parámetros de get_prophet_prediction_pipeline_and_parameters:

Nombre del parámetro Tipo Definición
project Cadena El ID de tu proyecto.
location Cadena Tu región.
model_name Cadena Nombre del recurso Model. Formatea la cadena de la siguiente manera: projects/{project}/locations/{location}/models/{model}.
time_column Cadena La columna de tiempo. Debe especificar una columna de tiempo y debe tener un valor en cada fila. La columna Hora indica la hora a la que se hizo una observación determinada.
time_series_identifier_column Cadena La columna del identificador de la serie temporal. Debe especificar una columna de identificador de serie temporal y debe tener un valor en cada fila. Los datos de entrenamiento de las previsiones suelen incluir varias series temporales, y el identificador indica a Vertex AI a qué serie temporal pertenece una observación determinada de los datos de entrenamiento. Todas las filas de una serie temporal determinada tienen el mismo valor en la columna del identificador de la serie temporal. Algunos identificadores de series temporales habituales pueden ser el ID de producto, el ID de tienda o una región. Es posible entrenar un modelo de previsión en una sola serie temporal, con un valor idéntico para todas las filas de la columna del identificador de la serie temporal. Sin embargo, Vertex AI es más adecuado para datos de entrenamiento que contienen dos o más series temporales. Para obtener los mejores resultados, usa al menos 10 series temporales por cada columna que utilices para entrenar el modelo.
target_column Cadena La columna (valor) que quieres que prediga este modelo.
data_source_csv_filenames Cadena Un URI de un archivo CSV almacenado en Cloud Storage.
data_source_bigquery_table_path Cadena URI de una tabla de BigQuery.
bigquery_destination_uri Cadena URI del conjunto de datos de destino seleccionado. Si no se define este valor, los recursos se crearán en un nuevo conjunto de datos del proyecto.
machine_type Cadena El tipo de máquina que se debe usar para la inferencia por lotes.
max_num_workers Entero Número máximo de trabajadores que se usarán para la inferencia por lotes.