Previsión con Prophet

Prophet es un modelo de previsión mantenido por Meta. Consulta el informe de Prophet para obtener detalles sobre los algoritmos y la documentación para obtener más información sobre la biblioteca.

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

Google Cloud ofrece una canalización para entrenar un modelo de Prophet y una canalización para obtener predicciones por lotes a partir de un modelo de Prophet. Ambas canalizaciones son instancias de Vertex AI Pipelines de componentes de canalización de Google Cloud (GCPC).

La integración de Prophet en Vertex AI significa que puedes hacer lo siguiente:

Aunque Prophet es un modelo multivariable, Vertex AI solo admite una versión de una variable.

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

En este flujo de trabajo, se usan las siguientes APIs:

  • Vertex AI
  • Dataflow
  • BigQuery
  • Cloud Storage

Entrena un modelo con Prophet

Prophet está 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 a través de la búsqueda en cuadrícula y la lógica de prueba posterior 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, la cantidad de modelos entrenados es el producto de la cantidad de series temporales y la cantidad de pruebas de ajuste de hiperparámetros.

En el siguiente código de muestra, se ilustra cómo puedes 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 service_account opcional en job.run() te permite configurar la cuenta de servicio de Vertex AI Pipelines en una cuenta que elijas.

La canalización y los valores de los parámetros se definen mediante la siguiente función.

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

El siguiente es un subconjunto de parámetros get_prophet_train_pipeline_and_parameters:

Nombre del parámetro Tipo Definición
project String El ID de tu proyecto
location String Su región
root_dir String La ubicación de Cloud Storage para almacenar el resultado.
target_column String La columna (valor) que deseas que prediga este modelo.
time_column String La columna de tiempo. Debes especificar una columna de tiempo y debe tener un valor para cada fila. La columna de tiempo indica la hora en la que se realizó una observación determinada.
time_series_identifier_column String La columna de identificador de serie temporal. Debes especificar una columna de identificador de serie temporal y debe tener un valor para cada fila. Por lo general, los datos de entrenamiento para previsiones incluyen varias series temporales, y el identificador le indica a Vertex AI de qué serie temporal forma parte una observación determinada en los datos de entrenamiento. Todas las filas de una serie temporal determinada tienen el mismo valor en la columna de identificador de serie temporal. Algunos identificadores de series temporales comunes pueden ser el ID del producto, el ID de una 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 de identificador de serie temporal. Sin embargo, Vertex AI es más adecuada para los datos de entrenamiento que contienen dos o más series temporales. A fin de obtener mejores resultados, usa al menos 10 series temporales para cada columna que uses a fin de entrenar el modelo.
data_granularity_unit String La unidad que se usará para el nivel de detalle de tus datos de entrenamiento y el horizonte de previsión y la ventana contextual. Puede ser minute, hour, day, week, month o year. Obtén información sobre cómo elegir el nivel de detalle de los datos.
data_source_csv_filenames String Un URI para un archivo CSV almacenado en Cloud Storage.
data_source_bigquery_table_path String Un URI para una tabla de BigQuery.
forecast_horizon Número entero El horizonte de previsión determina hasta qué punto del futuro el modelo predice el valor objetivo de cada fila de datos de predicción. El horizonte de previsión se especifica en unidades de nivel de detalle de datos. Obtén más información.
optimization_objective String Objetivo de optimización del modelo. Obtén más información.
max_num_trials Número entero Cantidad máxima de pruebas de ajuste que se realizarán por serie temporal.

Parámetros de Dataflow

El siguiente es un subconjunto de parámetros de get_prophet_train_pipeline_and_parameters para la personalización de Dataflow:

Nombre del parámetro Tipo Definición
trainer_dataflow_machine_type String El tipo de máquina de Dataflow que se usará para el entrenamiento.
trainer_dataflow_max_num_workers Número entero La cantidad máxima de trabajadores de Dataflow que se usarán para el entrenamiento.
evaluation_dataflow_machine_type String El tipo de máquina de Dataflow que se usará para la evaluación.
evaluation_dataflow_max_num_workers Número entero La cantidad máxima de trabajadores de Dataflow que se usarán para la evaluación.
dataflow_service_account String La cuenta de servicio personalizada para ejecutar trabajos de Dataflow. El trabajo de Dataflow se puede configurar para usar IP privadas y una subred de VPC específica. Este parámetro actúa como una anulación para la cuenta de servicio predeterminada del trabajador de Dataflow.

Debido a que los trabajos de entrenamiento de Prophet se ejecutan en Dataflow, el tiempo de inicio inicial es de 5 a 7 minutos. Para reducir el entorno de ejecución adicional, puedes escalar horizontalmente o verticalmente. Por ejemplo, para escalar verticalmente, puedes cambiar el tipo de máquina de n1-standard-1 a e2-highcpu-8. Para escalar horizontalmente, puedes aumentar la cantidad de trabajadores de 1 a 200.

Parámetros de división de datos

La canalización de entrenamiento ofrece las siguientes opciones para dividir los datos:

División de datos Descripción Parámetros
División predeterminada Vertex AI selecciona de forma aleatoria el 80% de tus 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 de tiempo para determinar el orden cronológico de las filas de datos. Ninguno
División de fracciones Vertex AI usa los valores que proporcionas para particionar los datos en el conjunto de entrenamiento, el conjunto de validación y el conjunto de prueba. Vertex AI usa la columna de tiempo para determinar el orden cronológico de las filas de datos.
  • training_fraction
  • validation_fraction
  • test_fraction
División de marca de tiempo Vertex AI usa los valores training_fraction, validation_fraction y test_fraction para particionar tus 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 TRAIN, VALIDATE o TEST en la columna predefined_split_key.
  • predefined_split_key

Debes definir los parámetros de división de datos en get_prophet_train_pipeline_and_parameters de la siguiente manera:

Nombre del parámetro Tipo Definición
predefined_split_key String El nombre de la columna que contiene los valores TRAIN, VALIDATE o TEST. Establece este valor si usas una división manual (predefinida).
training_fraction Número de punto flotante El porcentaje de los datos que se asignarán al conjunto de entrenamiento. Establece este valor si usas una división de fracciones o una división de marca de tiempo.
validation_fraction Número de punto flotante El porcentaje de los datos que se asignarán al conjunto de validación. Establece este valor si usas una división de fracciones o una división de marca de tiempo.
test_fraction Número de punto flotante El porcentaje de los datos que se asignarán al conjunto de prueba. Establece este valor si usas una división de fracciones o una división de marca de tiempo.
timestamp_split_key String El nombre de la columna que contiene las marcas de tiempo de la división de datos. Establece este valor si usas una división por marca de tiempo.

Parámetros de ventana

Vertex AI genera ventanas de previsión a partir de los datos de entrada usando una estrategia de ventana progresiva. Si dejas los parámetros de la ventana sin configurar, Vertex AI usa 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 progresiva:

Estrategia de ventana móvil Descripción Parámetros
Recuento La cantidad de ventanas que genera Vertex AI no debe exceder el máximo proporcionado por el usuario. Si la cantidad de filas en el conjunto de datos de entrada es menor que la cantidad de ventanas, cada fila se usará para generar una ventana. De lo contrario, Vertex AI realiza un muestreo aleatorio para seleccionar las filas. El valor predeterminado para la cantidad máxima de ventanas es 100,000,000. La cantidad máxima de ventanas no puede ser superior a 100,000,000. window_max_count
Segmento Vertex AI usa una de cada filas de entrada X para generar una ventana, hasta un máximo de 100,000,000 ventanas. Esta opción es útil para predicciones estacionales o periódicas. Por ejemplo, puedes limitar la previsión a un solo día de la semana si configuras el valor de la longitud del segmento a 7. El valor puede ser de 1 a 1000. window_stride_length
Columna Puedes agregar una columna a los datos de entrada en los 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 True y False se pueden establecer en cualquier orden, siempre que el recuento total de filas True sea inferior a 100,000,000. Se prefieren los valores booleanos, pero también se aceptan valores de string. Los valores de string no distinguen mayúsculas de minúsculas. window_column

Debes definir los parámetros de la ventana en get_prophet_train_pipeline_and_parameters de la siguiente manera:

Nombre del parámetro Tipo Definición
window_column String El nombre de la columna con los valores True y False.
window_stride_length Número entero El valor de la longitud de la segmentación.
window_max_count Número entero La cantidad máxima de ventanas.

Haz predicciones con Prophet

La canalización 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 predicción agrega datos de entrada por ID de serie temporal y calcula las predicciones por separado para cada serie temporal. Luego, la canalización desagrega los resultados de la predicción para que coincidan con el formato de Previsión de Vertex AI.

En el siguiente código de muestra, se ilustra cómo puedes ejecutar una canalización de predicción de Prophet:

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

La canalización y los valores de los parámetros se definen mediante la siguiente función.

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

El siguiente es un subconjunto de parámetros get_prophet_prediction_pipeline_and_parameters:

Nombre del parámetro Tipo Definición
project String El ID de tu proyecto
location String Su región
model_name String El nombre del recurso Modelo. Da formato a la cadena de la siguiente manera: projects/{project}/locations/{location}/models/{model}.
time_column String La columna de tiempo. Debes especificar una columna de tiempo y debe tener un valor para cada fila. La columna de tiempo indica la hora en la que se realizó una observación determinada.
time_series_identifier_column String La columna de identificador de serie temporal. Debes especificar una columna de identificador de serie temporal y debe tener un valor para cada fila. Por lo general, los datos de entrenamiento para previsiones incluyen varias series temporales, y el identificador le indica a Vertex AI de qué serie temporal forma parte una observación determinada en los datos de entrenamiento. Todas las filas de una serie temporal determinada tienen el mismo valor en la columna de identificador de serie temporal. Algunos identificadores de series temporales comunes pueden ser el ID del producto, el ID de una 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 de identificador de serie temporal. Sin embargo, Vertex AI es más adecuada para los datos de entrenamiento que contienen dos o más series temporales. A fin de obtener mejores resultados, usa al menos 10 series temporales para cada columna que uses a fin de entrenar el modelo.
target_column String La columna (valor) que deseas que prediga este modelo.
data_source_csv_filenames String Un URI para un archivo CSV almacenado en Cloud Storage.
data_source_bigquery_table_path String Un URI para una tabla de BigQuery.
bigquery_destination_uri String Es un URI para el conjunto de datos de destino deseado. Si no se configura este valor, los recursos se crean en un conjunto de datos nuevo del proyecto.
machine_type String Es el tipo de máquina que se usará para la predicción por lotes.
max_num_workers Número entero Es la cantidad máxima de trabajadores que se usarán para la predicción por lotes.