Previsão com o Prophet

O Prophet é um modelo de previsão mantido pela Meta. Confira o documento do Prophet para consultar detalhes do algoritmo e a documentação para mais informações sobre a biblioteca.

Assim como o BigQuery ML ARIMA_PLUS, o Prophet tenta decompor cada série temporal em tendências, estações e feriados, produzindo uma previsão usando a agregação desses modelos. No entanto, uma diferença importante é que o BQML ARIMA+ usa o ARIMA para modelar o componente de tendência, enquanto o Prophet tenta ajustar uma curva usando um modelo logístico ou linear parcial.

O Google Cloud oferece um pipeline para treinar um modelo do Prophet e um pipeline para receber previsões em lote de um modelo do Prophet. Os dois pipelines são instâncias de Vertex AI Pipelines de Componentes de Pipeline do Google Cloud (GCPC).

A integração do Prophet com a Vertex AI significa que você pode fazer o seguinte:

Embora o Prophet seja um modelo multivariável, a Vertex AI é compatível apenas com uma versão univariada dele.

Para saber mais sobre as contas de serviço usadas por esse fluxo de trabalho, consulte Contas de serviço para fluxos de trabalho tabulares.

APIs de fluxo de trabalho

Esse fluxo de trabalho usa as seguintes APIs:

  • Vertex AI
  • Dataflow
  • BigQuery
  • Cloud Storage

Treinar um modelo com o Prophet

O Prophet foi projetado para uma única série temporal. A Vertex AI agrega dados por ID de série temporal e treina um modelo do Prophet para cada série temporal. O pipeline de treinamento de modelo realiza o ajuste de hiperparâmetros usando a pesquisa de grade e a lógica de backtesting integrada do Prophet.

Para ser compatível com várias séries temporais, o pipeline usa um job de treinamento personalizado da Vertex AI e o Dataflow para treinar vários modelos do Prophet em paralelo. Em geral, o número de modelos treinados é o produto da quantidade de séries temporais e de testes de ajuste de hiperparâmetros.

No exemplo de código a seguir, demonstramos como executar um pipeline de treinamento de modelo do Prophet:

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

O parâmetro opcional service_account em job.run() permite definir a conta de serviço dos Pipelines da Vertex AI para uma conta de sua escolha.

O pipeline e os valores de parâmetro são definidos pela seguinte função:

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

Confira a seguir um subconjunto de parâmetros get_prophet_train_pipeline_and_parameters:

Nome do parâmetro Tipo Definição
project String O ID do projeto.
location String Sua região.
root_dir String O local do Cloud Storage para armazenar a saída.
target_column String A coluna (valor) que você quer que esse modelo preveja.
time_column String A coluna de data/hora. É necessário especificar uma coluna Data/hora e ter um valor para cada linha. A coluna de tempo indica a hora em que uma determinada observação foi feita.
time_series_identifier_column String A coluna do identificador de série temporal. É necessário especificar uma coluna identificadora de série temporal, e ela precisa ter um valor para cada linha. Os dados de treinamento de previsão geralmente incluem várias séries temporais, e o identificador informa ao Vertex AI qual série temporal os dados de treinamento fazem parte. Todas as linhas de uma determinada série temporal têm o mesmo valor na coluna do identificador. Alguns identificadores comuns de séries temporais podem ser o ID do produto, o ID da loja ou a região. É possível treinar um modelo de previsão em uma única série temporal, com um valor idêntico para todas as linhas na coluna do identificador de série temporal. No entanto, o Vertex AI é mais adequado para dados de treinamento que contêm duas ou mais séries temporais. Para melhores resultados, use pelo menos 10 séries temporais para cada coluna que você usa para treinar o modelo.
data_granularity_unit String A unidade a ser usada para a granularidade dos dados de treinamento e o horizonte da previsão e a janela de contexto. Pode ser minute, hour, day, week, month ou year. Saiba como escolher a granularidade dos dados.
data_source_csv_filenames String Um URI para um CSV armazenado no Cloud Storage.
data_source_bigquery_table_path String Um URI de uma tabela do BigQuery.
forecast_horizon Número inteiro O horizonte de previsão determina em que ponto do modelo o valor desejado será determinado para cada linha de dados de previsão. O horizonte de previsão é especificado em unidades da granularidade de dados. Saiba mais.
optimization_objective String Objetivo de otimização do modelo. Saiba mais.
max_num_trials Número inteiro Número máximo de testes de ajuste a serem realizados por série temporal.

Parâmetros do Dataflow

Confira a seguir um subconjunto de parâmetros get_prophet_train_pipeline_and_parameters para a personalização do Dataflow:

Nome do parâmetro Tipo Definição
trainer_dataflow_machine_type String O tipo de máquina do Dataflow que será usado para o treinamento.
trainer_dataflow_max_num_workers Número inteiro O número máximo de workers do Dataflow que serão usados para treinamento.
evaluation_dataflow_machine_type String O tipo de máquina do Dataflow a ser usado para avaliação.
evaluation_dataflow_max_num_workers Número inteiro O número máximo de workers do Dataflow a serem usados para avaliação.
dataflow_service_account String Conta de serviço personalizada para executar jobs do Dataflow. O job do Dataflow pode ser configurado para usar IPs privados e uma sub-rede VPC específica. Esse parâmetro funciona como uma substituição para a conta de serviço do worker padrão do Dataflow.

Como os jobs de treinamento do Prophet são executados no Dataflow, o tempo de inicialização inicial é de 5 a 7 minutos. Para reduzir o tempo de execução, você pode escalonar verticalmente ou horizontalmente. Por exemplo, para escalonar verticalmente, é possível alterar o tipo de máquina de n1-standard-1 para e2-highcpu-8. Para escalonar horizontalmente, é possível aumentar o número de workers de 1 para 200.

Parâmetros de divisão de dados

O pipeline de treinamento oferece as seguintes opções para dividir os dados:

Divisão de dados Descrição Parâmetros
Divisão padrão A Vertex AI seleciona aleatoriamente 80% das linhas de dados para o conjunto de treinamento, 10% para o conjunto de validação e 10% para o conjunto de teste. A Vertex AI usa a coluna data/hora para determinar a ordem cronológica das linhas de dados. Nenhum
Divisão fracionada A Vertex AI usa os valores fornecidos para particionar os dados no conjunto de treinamento, validação e teste. A Vertex AI usa a coluna data/hora para determinar a ordem cronológica das linhas de dados.
  • training_fraction
  • validation_fraction
  • test_fraction
Divisão de carimbo de data/hora A Vertex AI usa os valores training_fraction, validation_fraction e test_fraction para particionar seus dados no conjunto de treinamento, validação e teste. A Vertex AI usa a coluna timestamp_split_key para determinar a ordem cronológica das linhas de dados.
  • training_fraction
  • validation_fraction
  • test_fraction
  • timestamp_split_key
Divisão manual (predefinida) A Vertex AI divide os dados usando os valores TRAIN, VALIDATE ou TEST na coluna predefined_split_key.
  • predefined_split_key

Defina os parâmetros da divisão de dados em get_prophet_train_pipeline_and_parameters da seguinte maneira:

Nome do parâmetro Tipo Definição
predefined_split_key String O nome da coluna que contém os valores TRAIN, VALIDATE ou TEST. Defina esse valor se você estiver usando uma divisão manual (predefinida).
training_fraction Ponto flutuante A porcentagem dos dados a serem atribuídos ao conjunto de treinamento. Defina esse valor se estiver usando uma divisão de fração ou de carimbo de data/hora.
validation_fraction Ponto flutuante A porcentagem dos dados a serem atribuídos ao conjunto de validação. Defina esse valor se estiver usando uma divisão de fração ou de carimbo de data/hora.
test_fraction Ponto flutuante A porcentagem dos dados a serem atribuídos ao conjunto de teste. Defina esse valor se estiver usando uma divisão de fração ou de carimbo de data/hora.
timestamp_split_key String O nome da coluna que contém os carimbos de data/hora da divisão de dados. Defina esse valor se estiver usando uma divisão de carimbo de data/hora.

Parâmetros de janela

A Vertex AI gera janelas de previsão com base em dados de entrada usando uma estratégia de janela contínua. Se você não definir os parâmetros da janela, a Vertex AI usará a estratégia de contagem com um valor máximo padrão de 100,000,000. O pipeline de treinamento oferece as seguintes estratégias de janela contínua:

Estratégia de janela contínua Descrição Parâmetros
Contagem O número de janelas geradas pela Vertex AI não pode exceder um máximo fornecido pelo usuário. Se o número de linhas no conjunto de dados de entrada for menor que o número máximo de janelas, cada linha será usada para gerar uma janela. Caso contrário, a Vertex AI realiza uma amostragem aleatória para selecionar as linhas. O valor padrão para o número máximo de janelas é 100,000,000. O número máximo de janelas não pode exceder 100,000,000. window_max_count
Salto A Vertex AI usa uma em cada X linhas de entrada para gerar uma janela com um máximo de até 100 milhões de janelas. Essa opção é útil para previsões sazonais ou periódicas. Por exemplo, é possível limitar a previsão a um único dia da semana ao definir o valor de tamanho da passada como 7. O valor pode estar entre 1 e 1000. window_stride_length
Coluna É possível adicionar uma coluna aos dados de entrada em que os valores sejam True ou False. A Vertex AI gera uma janela para cada linha de entrada em que o valor da coluna é True. Os valores True e False podem ser definidos em qualquer ordem, desde que a contagem total de linhas True seja menor que 100,000,000. Preferimos valores booleanos, mas valores de string também são aceitos. Os valores de string não diferenciam maiúsculas de minúsculas. window_column

Defina os parâmetros da janela em get_prophet_train_pipeline_and_parameters da seguinte maneira:

Nome do parâmetro Tipo Definição
window_column String O nome da coluna com os valores True e False.
window_stride_length Número inteiro O valor do tamanho da passada.
window_max_count Número inteiro O número máximo de janelas.

Fazer previsões com o Prophet

O pipeline de treinamento de modelo do Prophet na Vertex AI cria um modelo do Prophet para cada série temporal nos dados. O pipeline de previsão agrega dados de entrada por ID de série temporal e calcula as previsões separadamente para cada série temporal. Em seguida, o pipeline desagrega os resultados da previsão para corresponder ao formato da Previsão da Vertex AI.

Na amostra de código a seguir, demonstramos como executar um pipeline de previsão do Prophet:

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

O pipeline e os valores de parâmetro são definidos pela seguinte função:

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

Confira a seguir um subconjunto de parâmetros get_prophet_prediction_pipeline_and_parameters:

Nome do parâmetro Tipo Definição
project String O ID do projeto.
location String Sua região.
model_name String O nome do recurso Modelo. Formate a string da seguinte maneira: projects/{project}/locations/{location}/models/{model}.
time_column String A coluna de data/hora. É necessário especificar uma coluna Data/hora e ter um valor para cada linha. A coluna de tempo indica a hora em que uma determinada observação foi feita.
time_series_identifier_column String A coluna do identificador de série temporal. É necessário especificar uma coluna identificadora de série temporal, e ela precisa ter um valor para cada linha. Os dados de treinamento de previsão geralmente incluem várias séries temporais, e o identificador informa ao Vertex AI qual série temporal os dados de treinamento fazem parte. Todas as linhas de uma determinada série temporal têm o mesmo valor na coluna do identificador. Alguns identificadores comuns de séries temporais podem ser o ID do produto, o ID da loja ou a região. É possível treinar um modelo de previsão em uma única série temporal, com um valor idêntico para todas as linhas na coluna do identificador de série temporal. No entanto, o Vertex AI é mais adequado para dados de treinamento que contêm duas ou mais séries temporais. Para melhores resultados, use pelo menos 10 séries temporais para cada coluna que você usa para treinar o modelo.
target_column String A coluna (valor) que você quer que esse modelo preveja.
data_source_csv_filenames String Um URI para um CSV armazenado no Cloud Storage.
data_source_bigquery_table_path String Um URI de uma tabela do BigQuery.
bigquery_destination_uri String Um URI do conjunto de dados de destino desejado. Se esse valor não for definido, os recursos serão criados em um novo conjunto de dados no projeto.
machine_type String O tipo de máquina a ser usado para a previsão em lote.
max_num_workers Número inteiro O número máximo de workers que serão usados na previsão em lote.