Previsão com o Prophet

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

Tal como o ARIMA_PLUS do BigQuery ML, o Prophet tenta decompor cada série cronológica em tendências, estações e feriados, produzindo uma previsão através da agregação das inferências destes modelos. No entanto, existe uma diferença importante: o ARIMA+ do BQML usa o ARIMA para modelar o componente de tendência, enquanto o Prophet tenta ajustar uma curva usando um modelo logístico ou linear segmentado.

Google Cloud oferece um pipeline para preparar um modelo Prophet e um pipeline para obter inferências em lote a partir de um modelo Prophet. Ambos os pipelines são instâncias do Vertex AI Pipelines dos Google Cloud componentes de pipeline (GCPC).

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

Embora o Prophet seja um modelo multivariável, o Vertex AI suporta apenas uma versão univariável do mesmo.

Para saber mais sobre as contas de serviço que este fluxo de trabalho usa, consulte o artigo Contas de serviço para fluxos de trabalho tabulares.

APIs Workflow

Este fluxo de trabalho usa as seguintes APIs:

  • Vertex AI
  • Dataflow
  • BigQuery
  • Cloud Storage

Prepare um modelo com o Prophet

O Prophet foi concebido para um único intervalo temporal. O Vertex AI agrega dados por ID de série cronológica e prepara um modelo Prophet para cada série cronológica. O pipeline de preparação de modelos realiza o ajuste de hiperparâmetros através da pesquisa de grelha e da lógica de testes retroativos incorporada do Prophet.

Para suportar várias séries cronológicas, o pipeline usa uma tarefa de preparação personalizada do Vertex AI e o Dataflow para preparar vários modelos do Prophet em paralelo. Em geral, o número de modelos preparados é o produto do número de séries cronológicas e do número de tentativas de ajuste de hiperparâmetros.

O seguinte exemplo de código demonstra como executar um pipeline de preparação do modelo Prophet:

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

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

O pipeline e os valores dos parâmetros são definidos pela seguinte função.

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

Segue-se um subconjunto de parâmetros get_prophet_train_pipeline_and_parameters:

Nome do parâmetro Tipo Definição
project String O ID do seu projeto.
location String A sua região.
root_dir String A localização do Cloud Storage para armazenar o resultado.
target_column String A coluna (valor) que quer que este modelo preveja.
time_column String A coluna de tempo. Tem de especificar uma coluna de tempo e esta tem de ter um valor para cada linha. A coluna Hora indica a hora em que foi feita uma determinada observação.
time_series_identifier_column String A coluna do identificador de séries cronológicas. Tem de especificar uma coluna de identificador de série cronológica e esta tem de ter um valor para cada linha. Normalmente, os dados de preparação de previsão incluem vários intervalos temporais, e o identificador indica ao Vertex AI a que intervalo temporal pertence uma determinada observação nos dados de preparação. Todas as linhas numa determinada série cronológica têm o mesmo valor na coluna do identificador da série cronológica. Alguns identificadores de séries cronológicas comuns podem ser o ID do produto, o ID de uma loja ou uma região. É possível formar um modelo de previsão numa única série cronológica, com um valor idêntico para todas as linhas na coluna do identificador de série cronológica. No entanto, o Vertex AI é mais adequado para dados de preparação que contêm duas ou mais séries cronológicas. Para obter os melhores resultados, use, pelo menos, 10 séries cronológicas para cada coluna que usar para preparar o modelo.
data_granularity_unit String A unidade a usar para a granularidade dos dados de preparação e o horizonte de previsão e o período de contexto. Pode ser minute, hour, day, week, month ou year. Saiba como escolher o nível de detalhe dos dados.
data_source_csv_filenames String Um URI para um CSV armazenado no Cloud Storage.
data_source_bigquery_table_path String Um URI para uma tabela do BigQuery.
forecast_horizon Número inteiro O horizonte de previsão determina até que ponto o modelo prevê o valor-alvo para cada linha de dados de inferência. O horizonte de previsão é especificado em unidades de detalhe dos 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 tentativas de otimização a realizar por série cronológica.

Parâmetros do Dataflow

Segue-se 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 a usar para a preparação.
trainer_dataflow_max_num_workers Número inteiro O número máximo de trabalhadores do Dataflow a usar para a preparação.
evaluation_dataflow_machine_type String O tipo de máquina do Dataflow a usar para a avaliação.
evaluation_dataflow_max_num_workers Número inteiro O número máximo de trabalhadores do Dataflow a usar para a avaliação.
dataflow_service_account String Conta de serviço personalizada para executar tarefas do Dataflow. Pode configurar a tarefa do Dataflow para usar IPs privados e uma sub-rede da VPC específica. Este parâmetro funciona como uma substituição da conta de serviço do trabalhador do Dataflow predefinida.

Uma vez que as tarefas de preparação do Prophet são executadas no Dataflow, ocorre um tempo de arranque inicial de 5 a 7 minutos. Para reduzir o tempo de execução adicional, pode aumentar a escala vertical ou horizontalmente. Por exemplo, para aumentar a escala, altere o tipo de máquina de n1-standard-1 para e2-highcpu-8. Para aumentar a escala, aumente o número de trabalhadores de 1 para 200.

Parâmetros de divisão de dados

O pipeline de preparação oferece as seguintes opções para dividir os seus dados:

Divisão de dados Descrição Parâmetros
Divisão predefinida O Vertex AI seleciona aleatoriamente 80% das linhas de dados para o conjunto de preparação, 10% para o conjunto de validação e 10% para o conjunto de teste. A Vertex AI usa a coluna Hora para determinar a ordem cronológica das linhas de dados. Nenhum
Divisão de frações O Vertex AI usa os valores que fornece para particionar os seus dados no conjunto de preparação, no conjunto de validação e no conjunto de teste. A Vertex AI usa a coluna Hora para determinar a ordem cronológica das linhas de dados.
  • training_fraction
  • validation_fraction
  • test_fraction
Divisão de data/hora A Vertex AI usa os valores training_fraction, validation_fraction e test_fraction para particionar os seus dados no conjunto de preparação, no conjunto de validação e no conjunto de teste. O 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) O Vertex AI divide os dados usando os valores TRAIN, VALIDATE ou TEST na coluna predefined_split_key.
  • predefined_split_key

Define os parâmetros de divisão de dados em get_prophet_train_pipeline_and_parameters da seguinte forma:

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 este valor se estiver a usar uma divisão manual (predefinida).
training_fraction Flutuante A percentagem dos dados a atribuir ao conjunto de preparação. Defina este valor se estiver a usar uma divisão de fração ou uma divisão de data/hora.
validation_fraction Flutuante A percentagem dos dados a atribuir ao conjunto de validação. Defina este valor se estiver a usar uma divisão de fração ou uma divisão de data/hora.
test_fraction Flutuante A percentagem dos dados a atribuir ao conjunto de testes. Defina este valor se estiver a usar uma divisão de fração ou uma divisão de data/hora.
timestamp_split_key String O nome da coluna que contém as indicações de tempo para a divisão de dados. Defina este valor se estiver a usar uma divisão de data/hora.

Parâmetros da janela

O Vertex AI gera intervalos de previsão a partir dos dados de entrada através de uma estratégia de intervalo contínuo. Se deixar os parâmetros da janela não definidos, o Vertex AI usa a estratégia de contagem com um valor máximo predefinido de 100,000,000. O pipeline de preparação oferece as seguintes estratégias de janela contínua:

Estratégia de janela móvel Descrição Parâmetros
Contagem O número de janelas geradas pela Vertex AI não pode exceder um máximo fornecido pelo utilizador. Se o número de linhas no conjunto de dados de entrada for inferior ao número máximo de janelas, todas as linhas são usadas para gerar uma janela. Caso contrário, a Vertex AI realiza uma amostragem aleatória para selecionar as linhas. O valor predefinido 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
Stride A Vertex AI usa uma de cada X linhas de entrada para gerar uma janela, até um máximo de 100 000 000 janelas. Esta opção é útil para inferências sazonais ou periódicas. Por exemplo, pode limitar a previsão a um único dia da semana definindo o valor do intervalo como 7. O valor pode estar entre 1 e 1000. window_stride_length
Coluna Pode adicionar uma coluna aos dados de entrada em que os valores são True ou False. O 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 inferior a 100,000,000. São preferíveis os valores booleanos, mas também são aceites valores de string. Os valores das strings não são sensíveis a maiúsculas e minúsculas. window_column

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

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

Tire conclusões com o Prophet

O pipeline de preparação de modelos do Vertex AI para o Prophet cria um modelo do Prophet para cada série cronológica nos dados. O pipeline de inferência agrega os dados de entrada por ID de série cronológica e calcula as inferências separadamente para cada série cronológica. Em seguida, o pipeline desagrupa os resultados da inferência para corresponder ao formato do Vertex AI Forecasting.

O seguinte exemplo de código demonstra como executar um pipeline de inferência do Prophet:

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

O pipeline e os valores dos parâmetros são definidos pela seguinte função.

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

Segue-se um subconjunto de parâmetros get_prophet_prediction_pipeline_and_parameters:

Nome do parâmetro Tipo Definição
project String O ID do seu projeto.
location String A sua região.
model_name String O nome do recurso do modelo. Formate a string da seguinte forma: projects/{project}/locations/{location}/models/{model}.
time_column String A coluna de tempo. Tem de especificar uma coluna de tempo e esta tem de ter um valor para cada linha. A coluna Hora indica a hora em que foi feita uma determinada observação.
time_series_identifier_column String A coluna do identificador de séries cronológicas. Tem de especificar uma coluna de identificador de série cronológica e esta tem de ter um valor para cada linha. Normalmente, os dados de preparação de previsão incluem vários intervalos temporais, e o identificador indica ao Vertex AI a que intervalo temporal pertence uma determinada observação nos dados de preparação. Todas as linhas numa determinada série cronológica têm o mesmo valor na coluna do identificador da série cronológica. Alguns identificadores de séries cronológicas comuns podem ser o ID do produto, o ID de uma loja ou uma região. É possível formar um modelo de previsão numa única série cronológica, com um valor idêntico para todas as linhas na coluna do identificador de série cronológica. No entanto, o Vertex AI é mais adequado para dados de preparação que contêm duas ou mais séries cronológicas. Para obter os melhores resultados, use, pelo menos, 10 séries cronológicas para cada coluna que usar para preparar o modelo.
target_column String A coluna (valor) que quer que este modelo preveja.
data_source_csv_filenames String Um URI para um CSV armazenado no Cloud Storage.
data_source_bigquery_table_path String Um URI para uma tabela do BigQuery.
bigquery_destination_uri String Um URI para o conjunto de dados de destino selecionado. Se este valor não for definido, os recursos são criados num novo conjunto de dados no projeto.
machine_type String O tipo de máquina a usar para a inferência em lote.
max_num_workers Número inteiro O número máximo de trabalhadores a usar para a inferência em lote.