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:
- Usa las estrategias de división de datos y de ventanas de Vertex AI.
- Leer datos de tablas de BigQuery o de archivos CSV almacenados en Cloud Storage. Vertex AI espera que cada fila tenga el mismo formato que Vertex AI Forecasting.
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. |
|
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. |
|
División manual (predefinida) | Vertex AI divide los datos usando los valores PREPARAR, VALIDAR o PROBAR de la columna 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. |