Neste tutorial, você aprenderá a acelerar significativamente o treinamento de um conjunto de modelos de série temporal para executar várias previsões de séries temporais com uma única consulta. Você também aprenderá a avaliar a precisão da previsão.
Em todas as etapas, exceto na última, você usará os dados do
new_york.citibike_trips
.
Esses dados contêm informações sobre as viagens do Citi Bike na cidade de Nova York. Esse
conjunto de dados contém apenas algumas centenas de séries temporais. Ele é usado para ilustrar
várias estratégias para acelerar o treinamento de modelo.
Na última etapa, você usará os dados de iowa_liquor_sales.sales
para prever mais de um milhão de séries temporais.
Antes de ler este tutorial, leia Como executar várias previsões de séries temporais com uma única consulta de dados de viagens do Citi Bike de Nova York. Leia também as Práticas recomendadas de previsão de séries temporais em grande escala.
Objetivos
Neste tutorial, você usará:
- A instrução
CREATE MODEL
cria um modelo de série temporal ou um conjunto de modelos de série temporal. - A função
ML.EVALUATE
avalia a precisão da previsão. - As opções de treinamento
AUTO_ARIMA_MAX_ORDER
,TIME_SERIES_LENGTH_FRACTION
,MIN_TIME_SERIES_LENGTH
eMAX_TIME_SERIES_LENGTH
: para reduzir significativamente o tempo de treinamento do modelo.
Para simplificar, este tutorial não abrange como usar ML.FORECAST
ou ML.EXPLAIN_FORECAST
para gerar previsões (explicáveis). Para saber como usar essas funções, consulte
Como executar várias previsões de séries temporais com uma única consulta de dados de viagens do Citi Bike de Nova York.
Custos
Neste tutorial, há componentes faturáveis do Google Cloud, entre eles:
- BigQuery
- BigQuery ML
Para mais informações sobre custos, consulte as páginas de preços do BigQuery e do ML do BigQuery.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
- O BigQuery é ativado automaticamente em novos projetos.
Para ativar o BigQuery em um projeto preexistente, acesse
Enable the BigQuery API.
Etapa 1: criar conjunto de dados
Crie um conjunto de dados do BigQuery para armazenar o modelo de ML:
No console do Google Cloud, acesse a página do BigQuery.
No painel Explorer, clique no nome do seu projeto.
Clique em
Conferir ações > Criar conjunto de dados.Na página Criar conjunto de dados, faça o seguinte:
Para o código do conjunto de dados, insira
bqml_tutorial
.Em Tipo de local, selecione Multirregião e EUA (várias regiões nos Estados Unidos).
Os conjuntos de dados públicos são armazenados na multirregião
US
. Para simplificar, armazene seus conjuntos de dados no mesmo local.Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.
Etapa 2: criar a série temporal para previsão
Na consulta a seguir, a cláusula FROM bigquery-public-data.new_york.citibike_trips
indica que você está consultando a tabela citibike_trips
no conjunto de dados
new_york
.
CREATE OR REPLACE TABLE `bqml_tutorial.nyc_citibike_time_series` AS WITH input_time_series AS ( SELECT start_station_name, EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips FROM `bigquery-public-data.new_york.citibike_trips` GROUP BY start_station_name, date ) SELECT table_1.* FROM input_time_series AS table_1 INNER JOIN ( SELECT start_station_name, COUNT(*) AS num_points FROM input_time_series GROUP BY start_station_name) table_2 ON table_1.start_station_name = table_2.start_station_name WHERE num_points > 400
Para executar a consulta, siga estas etapas:
No console do Google Cloud, clique no botão Escrever nova consulta.
Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.
Clique em Executar.
Na instrução SELECT
na consulta, a
função EXTRACT
é usada para extrair as informações de data da coluna starttime
. A consulta usa a cláusula
COUNT(*)
para descobrir o número total diário de viagens do Citi Bike.
table_1
tem 679 séries temporais. A consulta usa lógica INNER JOIN
extra
para selecionar todas as séries temporais que têm mais de 400 pontos temporais, resultando
em um total de 383 séries temporais.
Etapa 3: prever simultaneamente várias séries temporais com parâmetros padrão
Nesta etapa, você prevê o número total diário de viagens que começam
em diferentes estações do Citi Bike. Para fazer isso, você precisa prever muitas séries temporais.
É possível gravar várias
consultas
CREATE MODEL
. No entanto, isso pode ser um processo tedioso e demorado, especialmente quando
você tem um grande número de séries temporais.
Para melhorar esse processo, o BigQuery ML permite a criação de um conjunto de modelos de séries temporais para prever várias séries temporais com uma única consulta. Além disso, todos os modelos de séries temporais são ajustados simultaneamente.
Na consulta do GoogleSQL a seguir, a cláusula
CREATE MODEL
cria e treina um conjunto de modelos chamado
bqml_tutorial.nyc_citibike_arima_model_default
.
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_default` OPTIONS (model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_name' ) AS SELECT * FROM bqml_tutorial.nyc_citibike_time_series WHERE date < '2016-06-01'
Para executar a consulta CREATE MODEL
a fim de criar e treinar seu modelo, use as seguintes etapas:
No console do Google Cloud, clique no botão Escrever nova consulta.
Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.
Clique em Executar.
A consulta leva por volta de 14 minutos e 25 segundos para ser concluída.
A cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...)
indica que você está criando um conjunto de modelos de séries temporais ARIMA_PLUS
baseados em
ARIMA. Além de time_series_timestamp_col
e
time_series_data_col
, é preciso especificar time_series_id_col
, que é usado para
anotar diferentes séries temporais de entrada.
Este exemplo exclui os pontos de tempo na série temporal após 01/06/2016 para que
esses pontos de tempo possam ser usados para avaliar a precisão da previsão posteriormente usando
a função ML.EVALUATE
.
Etapa 4: avaliar a precisão da previsão para cada série temporal
Nesta etapa, você avalia a precisão da previsão para cada série temporal usando a seguinte consulta ML.EVALUATE
.
SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`, TABLE `bqml_tutorial.nyc_citibike_time_series`, STRUCT(7 AS horizon, TRUE AS perform_aggregation))
Para executar a consulta acima, use as seguintes etapas:
No console do Google Cloud, clique no botão Escrever nova consulta.
Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.
Clique em Executar. Essa consulta relata várias métricas de previsão, incluindo:
- Erro médio absoluto
- Erro quadrático médio
- Erro percentual absoluto médio
- Erro de porcentagem média simétrica
Os resultados terão a aparência abaixo:
ML.EVALUATE
usa o modelo ARIMA_PLUS que foi treinado na etapa anterior como o primeiro argumento.
O segundo argumento é uma tabela de dados que contém as informações empíricas. Esses resultados da previsão são comparados aos dados de informações empíricas para calcular as métricas de precisão. Nesse caso, nyc_citibike_time_series
contém os
pontos de série temporal anteriores a 01/06/2016 e posteriores a 01/06/2016. Os
pontos após 01/06/2016 são dados informativos. Os pontos anteriores
a 01/06/2016 são usados para treinar o modelo e gerar previsões após essa data.
Apenas os pontos após 01/06/2016 serão necessários para calcular as métricas. Os pontos anteriores a 01/06/2016 são ignorados no cálculo de métricas.
O terceiro argumento é um STRUCT
que contém dois parâmetros. O horizonte é
7, o que significa que a consulta está calculando a precisão da estimativa com base na previsão
de 7 pontos. Se os dados de referência local tiverem menos de sete pontos para
a comparação, as métricas de precisão serão calculadas apenas com base nos
pontos disponíveis. perform_aggregation
tem o valor TRUE, o que significa que as
métricas de precisão da previsão são agregadas sobre as métricas no ponto de
tempo. Se você especificar perform_aggregation
como FALSE, a precisão da previsão será retornada para cada ponto do tempo previsto.
Etapa 5: avaliar a precisão da previsão geral para todas as séries temporais
Nesta etapa, você avalia a precisão da previsão para toda a série temporal de 383 usando a seguinte consulta:
SELECT AVG(mean_absolute_percentage_error) AS MAPE, AVG(symmetric_mean_absolute_percentage_error) AS sMAPE FROM ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`, TABLE `bqml_tutorial.nyc_citibike_time_series`, STRUCT(7 AS horizon, TRUE AS perform_aggregation))
Das métricas de previsão retornadas por ML.EVALUATE
, somente
erro percentual absoluto médio e erro percentual absoluto simétrico são
independentes do valor da série temporal. Portanto, para avaliar toda a precisão da previsão do conjunto de séries temporais, apenas o agregado dessas duas métricas é significativo.
Essa consulta retorna os seguintes resultados: MAPE é 0,3471, SMAPE é 0,2563.
Etapa 6: prever muitas séries temporais simultaneamente com um espaço de pesquisa de hiperparâmetros menor
Na etapa 3, usamos os valores padrão para todas as opções de treinamento, incluindo
o auto_arima_max_order
. Essa opção controla o espaço de pesquisa
para o ajuste de hiperparâmetros no algoritmo auto.ARIMA
.
Nesta etapa, você usará um espaço de pesquisa menor para os hiperparâmetros.
CREATE OR REPLACE MODELbqml_tutorial.nyc_citibike_arima_model_max_order_2
OPTIONS (model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_name', auto_arima_max_order = 2 ) AS SELECT * FROMbqml_tutorial.nyc_citibike_time_series
WHERE date < '2016-06-01'
Essa consulta reduz a auto_arima_max_order
de 5 (o valor padrão) para 2.
Para executar a consulta, siga estas etapas:
No console do Google Cloud, clique no botão Escrever nova consulta.
Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.
Clique em Executar.
A consulta leva aproximadamente 1 minuto e 45 segundos para ser concluída. Lembre-se de que leva 14 minutos e 25 segundos para a consulta ser concluída se
auto_arima_max_order
for 5. Assim, o ganho de velocidade é cerca de 7 vezes definindoauto_arima_max_order
como 2. Se você quer saber por que o ganho de velocidade não é 5/2=2,5x, porque ao aumentar a ordem deauto_arima_max_order
, não apenas o número de modelos candidatos aumenta, mas também a complexidade. Portanto, o tempo de treinamento dos modelos aumenta.
Etapa 7: avaliar a precisão da previsão com base em um espaço menor de pesquisa de hiperparâmetro
SELECT AVG(mean_absolute_percentage_error) AS MAPE, AVG(symmetric_mean_absolute_percentage_error) AS sMAPE FROM ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`, TABLE `bqml_tutorial.nyc_citibike_time_series`, STRUCT(7 AS horizon, TRUE AS perform_aggregation))
Essa consulta retorna os seguintes resultados: MAPE é 0,3337 e sMAPE é 0,2337.
Na etapa cinco, usando um espaço de pesquisa de hiperparâmetro maior,
auto_arima_max_order = 5, resultou em MAPE de 0,3471 e sMAPE 0,2563.
Portanto, nesse caso, um espaço menor de pesquisa de hiperparâmetro fornece, na verdade, uma maior precisão de previsão. Um
motivo é que o algoritmo auto.ARIMA
realiza apenas o ajuste de hiperparâmetros
para o módulo de tendência de todo o pipeline de modelagem. O melhor modelo ARIMA
selecionado pelo algoritmo auto.ARIMA pode não gerar os melhores resultados de
previsão para todo o pipeline.
Etapa 8: prever muitas séries temporais simultaneamente com um espaço menor de pesquisa de hiperparâmetros e estratégias de treinamento inteligentes e rápidas
Nesta etapa, você usa um espaço de pesquisa de hiperparâmetros menor e a
estratégia de treinamento rápida e inteligente com uma ou mais das opções de treinamento
max_time_series_length
, max_time_series_length
ou time_series_length_fraction
.
Embora modelos periódicos, como a sazonalidade, exijam um determinado número de pontos de tempo, a modelagem de tendências requer menos pontos de tempo. Enquanto isso, a modelagem de tendências é muito mais cara do que outros componentes de série temporal, como sazonalidade. Ao usar as opções de treinamento rápido acima, é possível modelar de maneira eficiente o componente de tendência com um subconjunto da série temporal. Já os outros componentes de série temporal usam toda a série temporal.
Neste exemplo, max_time_series_length
é usado para conseguir um treinamento rápido.
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training` OPTIONS (model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_name', auto_arima_max_order = 2, max_time_series_length = 30 ) AS SELECT * FROM `bqml_tutorial.nyc_citibike_time_series` WHERE date < '2016-06-01'
A opção max_time_series_length
tem um valor de 30. Portanto, para cada
série temporal de 383, somente os 30 pontos de tempo mais recentes são usados para modelar o componente de
tendência. Todas as séries temporais ainda são usadas para modelar os componentes que não são da tendência.
Para executar a consulta, siga estas etapas:
No console do Google Cloud, clique no botão Escrever nova consulta.
Insira a seguinte consulta do GoogleSQL na área de texto do Editor de consultas.
Clique em Executar.
A consulta leva cerca de 35 segundos para ser concluída. Isso é três vezes mais rápido em comparação com a consulta de treinamento que não usa uma estratégia de treinamento rápido (ou seja, leva 1 minuto e 45 segundos). Devido à constante sobrecarga de tempo da parte sem treinamento da consulta, como pré-processamento de dados etc., a velocidade será muito maior quando o número de séries temporais for muito maior que neste caso. Para um milhão de séries temporais, o ganho de velocidade se aproximará da proporção do comprimento da série temporal e do valor de max_time_series_length. Nesse caso, o ganho de velocidade será maior que 10x.
Etapa 9: avaliar a precisão da previsão para um modelo com espaço de pesquisa de hiperparâmetros menor e estratégias de treinamento rápido e inteligente
SELECT AVG(mean_absolute_percentage_error) AS MAPE, AVG(symmetric_mean_absolute_percentage_error) AS sMAPE FROM ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`, TABLE `bqml_tutorial.nyc_citibike_time_series`, STRUCT(7 AS horizon, TRUE AS perform_aggregation))
Essa consulta retorna os seguintes resultados: MAPE é 0,3515 e sMAPE é 0,2473.
Sem o uso de estratégias de treinamento rápido, os resultados de precisão da previsão são de 0,3337 e 0,2337 do MAPE. A diferença entre os dois valores de métricas está dentro de 3%, o que é estatisticamente insignificante.
Em resumo, você usou um espaço de pesquisa de hiperparâmetros menor e estratégias de treinamento rápidas e inteligentes para tornar o treinamento do seu modelo mais de 20 vezes mais rápido sem sacrificar a precisão da previsão. Como mencionado anteriormente, com mais séries temporais, o ganho de velocidade pelas estratégias de treinamento rápido e inteligente pode ser significativamente maior. Além disso, a biblioteca ARIMA subjacente usada pelo ARIMA_PLUS foi otimizada para funcionar cinco vezes mais rápido do que antes. Juntos, esses ganhos permitem a previsão de milhões de séries temporais em horas.
Etapa 10: prever mais de um milhão de séries temporais
Nesta etapa, você estima as vendas de bebidas alcoólicas para mais de 1 milhão de produtos de bebidas em lojas diferentes usando os dados públicos de venda de bebidas alcoólicas de Iowa.
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast_by_product` OPTIONS( MODEL_TYPE = 'ARIMA_PLUS', TIME_SERIES_TIMESTAMP_COL = 'date', TIME_SERIES_DATA_COL = 'total_bottles_sold', TIME_SERIES_ID_COL = ['store_number', 'item_description'], HOLIDAY_REGION = 'US', AUTO_ARIMA_MAX_ORDER = 2, MAX_TIME_SERIES_LENGTH = 30 ) AS SELECT store_number, item_description, date, SUM(bottles_sold) as total_bottles_sold FROM `bigquery-public-data.iowa_liquor_sales.sales` WHERE date BETWEEN DATE("2015-01-01") AND DATE("2021-12-31") GROUP BY store_number, item_description, date
O treinamento do modelo ainda usa um pequeno espaço de pesquisa de hiperparâmetros, bem como a estratégia de treinamento rápido e inteligente. A consulta leva aproximadamente 1 hora e 16 minutos para ser concluída.
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
- exclua o projeto que você criou; ou
- Mantenha o projeto e exclua o conjunto de dados.
Excluir o conjunto de dados
A exclusão do seu projeto removerá todos os conjuntos de dados e tabelas no projeto. Caso prefira reutilizá-lo, exclua o conjunto de dados criado neste tutorial:
Se necessário, abra a página do BigQuery no console do Google Cloud.
Na navegação, clique no conjunto de dados bqml_tutorial criado.
Clique em Excluir conjunto de dados para excluir o conjunto de dados, a tabela e todos os dados.
Na caixa de diálogo Excluir conjunto de dados, confirme o comando de exclusão digitando o nome do seu conjunto de dados (
bqml_tutorial
). Em seguida, clique em Excluir.
Excluir o projeto
Para excluir o projeto:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
A seguir
- Para saber mais sobre machine learning, consulte o Curso intensivo de machine learning.
- Para uma visão geral sobre ML do BigQuery, consulte Introdução ao ML do BigQuery.
- Para saber mais, consulte Como usar o console do Google Cloud.