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:
- usar a divisão de dados e as estratégias de janelamento da Vertex AI.
- Leia os dados de tabelas do BigQuery ou CSVs armazenados no Cloud Storage. A Vertex AI espera que cada linha tenha o mesmo formato da Previsão da Vertex AI.
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. |
|
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. |
|
Divisão manual (predefinida) | A Vertex AI divide os dados usando os valores TRAIN, VALIDATE ou TEST na coluna 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. |