Previsão de séries temporais com a Vertex AI e o BigQuery ML

1. Visão geral

Neste laboratório, você vai aprender a criar um modelo de previsão de séries temporais com o TensorFlow e a implantar esses modelos com a Vertex AI.

Conteúdo do laboratório

Você vai aprender a:

  • Transformar dados para que eles possam ser usados em um modelo de ML
  • Visualizar e analisar dados
  • Usar o BigQuery ML para criar um modelo de previsão de séries temporais
  • Criar um modelo de previsão de série temporal com o TensorFlow usando arquiteturas LSTM e CNN

2. Introdução à previsão de séries temporais

O foco deste codelab é como aplicar técnicas de previsão de séries temporais usando o Google Cloud Platform. Não é um curso geral de previsão de séries temporais, mas um tour rápido pelos conceitos pode ser útil para nossos usuários.

Dados de série temporal

Primeiro, o que é uma série temporal? Trata-se de um conjunto de dados com dados registrados em intervalos de tempo regulares. Um conjunto de dados de série temporal contém o tempo e pelo menos uma variável que depende do tempo.

85af6a1ff05c69f2.png

Componentes

Uma série temporal pode ser decomposta em componentes:

  • Tendência: sobe ou desce em um padrão razoavelmente previsível.
  • Sazonal: se repete ao longo de um período específico, como um dia, semana, mês, estação etc.
  • Aleatórias: flutuações residuais.

Pode haver várias camadas de sazonalidade. Por exemplo, um call center pode identificar um padrão no volume de chamadas em determinados dias da semana e meses. Outras variáveis além do tempo podem explicar o residual.

6e8d45bbbbc388ec.png

Estacionário

Para melhores resultados na previsão, os dados de séries temporais precisam ser estacionários, com propriedades estatísticas constantes, como média e variância. Técnicas como diferenciação e redução de tendência podem ser aplicadas a dados brutos para torná-los mais estacionários.

Por exemplo, o gráfico abaixo da concentração de CO2 mostra um padrão anual repetido com uma tendência crescente. ( Fonte)

ab82857e2e7d0b89.png

Depois de remover a tendência linear, os dados são mais adequados para previsão, porque agora têm uma média constante.

c936381ab1095528.png

Como usar dados de série temporal para machine learning

Para usar dados de séries temporais em um problema de machine learning, eles precisam ser transformados para que os valores anteriores possam ser usados para prever valores futuros. Esta tabela mostra um exemplo de como variáveis com atraso são criadas para ajudar a prever a meta.

d667a941dbd470f5.png

Agora que cobrimos alguns fundamentos, vamos começar a explorar dados e fazer previsões.

3. Configurar o ambiente do notebook

Agora que fizemos uma breve introdução aos dados, vamos configurar nosso ambiente de desenvolvimento de modelos.

Etapa 1: ativar as APIs

O conector do BigQuery usa a API BigQuery Storage. Procure a API BigQuery Storage no console e ative-a se ela estiver desativada.

9895a2fd3cdf8f8c.png

Etapa 2: criar um notebook do Vertex AI Workbench

Acesse a seção Vertex AI Workbench do console do Cloud e clique em Novo notebook. Em seguida, selecione o tipo de notebook do TensorFlow Enterprise 2.x mais recente sem GPUs:

4e7b73eabf2bc061.png

Use as opções padrão e clique em Criar. Depois que a instância for criada, selecione Abrir JupyterLab:

18c9f3c462aafaee.png

Depois crie um notebook Python 3 no JupyterLab:

58523671a252b95a.png

Etapa 3: fazer o download dos materiais do laboratório

Crie uma nova janela do terminal na interface do JupyterLab: Arquivo -> Novo -> Terminal.

A partir daí, clone o material de origem com este comando:

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

4. Explore e visualize dados

Nesta seção, você:

  • Criar uma consulta que agrupe os dados em uma série temporal
  • Preencher valores ausentes
  • Visualizar dados
  • Decompor séries temporais em componentes sazonais e de tendência

Etapa 1

No Vertex AI Workbench, navegue até training-data-analyst/courses/ai-for-time-series/notebooks e abra 01-explore.ipynb.

Etapa 2

Limpe todas as células do notebook (Editar > Limpar todas as saídas), altere as configurações de região, projeto e bucket em uma das primeiras células e execute cada uma delas.

Etapa 3

Nesta seção, você importou os dados e visualizou várias dimensões deles. Agora que você tem uma imagem mais clara dos dados, pode prosseguir com a modelagem de machine learning usando esses dados.

55839e7bc0427915.png

5. Criar um modelo com a previsão de série temporal do BigQuery

Nesta seção, você:

  • Importar os dados de entrada da série temporal para uma tabela do BigQuery
  • Criar um modelo de série temporal usando a sintaxe do BQML
  • Aprender a avaliar os parâmetros e a acurácia do modelo
  • Prever usando seu modelo

Etapa 1

Vamos criar uma tabela do BigQuery com os dados brutos do CSV que acabamos de analisar. Vamos começar fazendo o download do CSV do ambiente do notebook.

No diretório training-data-analyst/courses/ai-for-time-series/notebooks/data, clique com o botão direito do mouse em cta_ridership.csv e faça o download dele no seu ambiente local.

Etapa 2

Em seguida, vamos fazer o upload desses dados para uma tabela do BigQuery.

Pesquise ou use este link para acessar o BigQuery no console:

649e7ab1c44b75e8.png

Você pode adicionar a tabela a um conjunto de dados novo ou atual, que agrupa tabelas relacionadas. Se você ainda não criou um conjunto de dados, clique no seu projeto no canto inferior esquerdo e selecione Criar conjunto de dados no canto inferior direito.

281b97020cd52f29.png

Escolha um nome, como demo, aceite os padrões e continue.

Com esse conjunto de dados selecionado, selecione Criar tabela no canto inferior direito para criar uma nova tabela.

ad47810d44cfb289.png

Para as opções de criação de tabela, selecione:

  • Criar tabela de: Upload
  • Selecione o arquivo: cta_ridership.csv
  • Nome da tabela: cta_ridership
  • Esquema: marque a caixa para detectar automaticamente os Parâmetros de esquema e entrada.

213e4177e9e79544.png

Etapa 3

Agora é hora de criar nosso modelo. O BigQuery ML tem uma sintaxe simples semelhante ao SQL, que permite criar uma grande variedade de tipos de modelos.

No editor de consultas, cole/digite a consulta, substituindo demo se necessário pelo nome do seu conjunto de dados nos dois lugares:

CREATE OR REPLACE MODEL
  `demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
    TIME_SERIES_TIMESTAMP_COL='service_date',
    TIME_SERIES_DATA_COL='total_rides',
    HOLIDAY_REGION='us') AS
SELECT
  service_date, total_rides
FROM
  `demo.cta_ridership`

Vamos ver os principais elementos da sintaxe para entendermos:

CREATE OR REPLACE MODEL
demo.cta_ridership_model

Essa instrução cria o modelo. Há variantes desta instrução, como CREATE MODEL, mas aqui escolhemos substituir um modelo atual com o mesmo nome.

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

Aqui, definimos as opções do modelo. A primeira é o tipo. Selecionar ARIMA cria um modelo de previsão de série temporal.

TIME_SERIES_TIMESTAMP_COL=‘service_date'

A coluna com informações de data/hora

TIME_SERIES_DATA_COL=‘total_rides'

A coluna de dados

HOLIDAY_REGION=‘us'

Com esse parâmetro opcional, é possível incluir feriados no modelo. Como nossa análise de dados na etapa anterior mostrou que o número de passageiros era menor nos feriados e os dados vêm de Chicago, IL, EUA, estamos incluindo feriados nos EUA no modelo.

AS SELECT ... FROM ...

Nesta seção, selecionamos os dados de entrada que usaremos para treinar o modelo.

Há várias outras opções que você pode adicionar à consulta, como definir uma coluna se você tiver várias séries temporais ou escolher se quer descobrir automaticamente os parâmetros do modelo ARIMA. Para mais detalhes, consulte a referência de sintaxe Instrução CREATE MODEL para modelos de série temporal.

Etapa 4

Vamos saber mais sobre nosso modelo. Depois de concluir o treinamento, vamos executar outra consulta, substituindo demo novamente, se necessário:

SELECT
  *
FROM
  ML.EVALUATE(MODEL `demo.cta_ridership_model`)

Vamos interpretar os resultados. Em cada linha, você vai encontrar um modelo candidato, com os parâmetros e as estatísticas de avaliação dele. Os resultados são retornados em ordem crescente de AIC, ou critério de informação de Akaike, que fornece um indicador relativo da qualidade do modelo. Portanto, o modelo na primeira linha tem o AIC mais baixo e é considerado o melhor modelo.

Você poderá ver os parâmetros p, d e q do modelo ARIMA, além da sazonalidade descoberta no modelo. Nesse caso, o modelo principal inclui sazonalidade e sazonalidade.

5b5b1e129c70a340.png

Etapa 5

Agora, estamos prontos para fazer a previsão com a função ML.FORECAST.

Cole/digite o código a seguir (substituindo demo, se necessário):

SELECT
  *
FROM
  ML.FORECAST(MODEL `demo.cta_ridership_model`,
    STRUCT(7 AS horizon))

Essa consulta simplesmente prevê sete dias usando nosso modelo. Podemos ver as sete linhas retornadas abaixo. A previsão também inclui um intervalo de confiança, que tem o padrão de 0,95, mas pode ser configurado na consulta.

b8a7f22657dc2d27.png

Bom trabalho: criamos um modelo de série temporal com apenas algumas consultas do BQML.

6. Criar um modelo de previsão personalizado

Nesta seção, você:

  • Remover outliers dos dados
  • Realizar a previsão em várias etapas
  • Incluir mais atributos em um modelo de série temporal
  • Saiba mais sobre arquiteturas de rede neural para previsão de séries temporais: LSTM e CNN
  • Saiba mais sobre modelos estatísticos, incluindo a suavização exponencial Holt-Winters
  • Modelos do conjunto

Etapa 1

No Vertex AI Workbench, navegue até training-data-analyst/courses/ai-for-time-series/notebooks e abra 02-model.ipynb.

Etapa 2

Limpe todas as células do notebook (Editar > Limpar todas as saídas), altere as configurações de região, projeto e bucket em uma das primeiras células e execute cada uma delas.

Etapa 3

No notebook, você explorou várias arquiteturas de modelo: LSTM, CNN e modelos estatísticos. É possível comparar o desempenho de cada modelo com os dados de teste:

a528df58f4e6d372.png

7. Treine e preveja na nuvem

Nesta seção, você:

  • Preparar dados e modelos para treinamento na nuvem
  • Treine seu modelo e monitore o progresso do job com o AI Platform Training
  • Prever usando o modelo com o AI Platform Predictions

Etapa 1

No Vertex AI Workbench, navegue até training-data-analyst/courses/ai-for-time-series/notebooks e abra 03-cloud-training.ipynb.

Etapa 2

Limpe todas as células do notebook (Editar > Limpar todas as saídas), altere as configurações de região, projeto e bucket em uma das primeiras células e execute cada uma delas.

Etapa 3

Na seção anterior, treinamos um modelo e prevemos com ele, tudo em um notebook do Workbench. Nesta seção, demonstramos como usar o SDK do Python para Vertex AI do seu notebook para usar os serviços da Vertex AI para treinamento e implantação.

a3f6b5dc895a24fb.png

8. Desafio

Nesta seção, você vai tentar aplicar os conceitos aprendidos a um novo conjunto de dados.

Não forneceremos instruções detalhadas, apenas algumas dicas (se você quiser!).

O objetivo é prever as solicitações de serviço 311 da cidade de Nova York. Essas solicitações não emergenciais incluem reclamações de barulho, problemas de iluminação da rua etc.

Etapa 1

Vamos começar entendendo o conjunto de dados.

Primeiro, acesse o conjunto de dados Solicitações de serviço do 311 da cidade de Nova York.

Para conhecê-los melhor, teste alguns dos exemplos de consulta listados na descrição do conjunto de dados:

  • Qual o número de solicitações do 311 relacionadas a caminhões de sorvete?
  • Em quais dias da semana há mais solicitações do número 311 relacionadas a festas?

Na interface do BigQuery, selecione Criar consulta para saber como acessar o conjunto de dados. Observe que a instrução select está consultando bigquery-public-data.new_york_311.311_service_requests.

Etapa 2

Estamos prontos para começar. Nesta seção, faça modificações no notebook Explore and Visualize para trabalhar com esses dados.

Dicas

  • Duplique o notebook 01-explore.ipynb e comece a trabalhar com ele.
  • Para analisar os dados, faça esta consulta:
from google.cloud import bigquery as bq

sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""

client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()

df.head()
  • Para obter as contagens de incidentes por mês, use esta consulta:
SELECT
  COUNT(unique_key) as y,
  DATE_TRUNC(DATE(created_date), month) as ds  
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
  • Atualize as variáveis de coluna na seção de constantes. Na consulta acima, a coluna de destino é y e a coluna de data é ds. Não há recursos adicionais.
  • Mude o nome do arquivo que vai ser exportado para o próximo laboratório.
  • Exporte os dados usando: df.to_csv(YOUR-EXPORT-FILENAME, index=False)

Etapa 3

Agora, vamos criar um modelo de série temporal com os dados mensais.

Dicas:

  • Duplique o notebook 02-model.ipynb e comece a trabalhar com ele.
  • Atualize os parâmetros do conjunto de dados:
  • Atualize os parâmetros target_col e ts_col para corresponder ao novo conjunto de dados.
  • Atualize os parâmetros do modelo:
  • Frequência até mensal (o código para início do mês é ‘MS’)
  • Etapas de entrada: 12 (a janela de lookback é de 12 meses)
  • Etapas de saída: 3 (previsão de três meses à frente)
  • Temporadas: 12 (a sazonalidade é de 12 meses)
  • Altere o nome do arquivo de entrada se você o alterou no notebook anterior.
  • Se você executar a consulta no meio do mês, o total mensal do último mês será muito menor do que o esperado. Portanto, para este laboratório, vamos remover o último mês do conjunto de dados usando: df = df[:-1]
  • Não parece haver outliers óbvios nos dados, portanto, ignore ou comente essas células.
  • Ajuste as unidades LSTM, os filtros CNN e o tamanho do kernel para esse novo modelo.

9. Limpeza

Se você quiser continuar usando este notebook, é recomendado que você o desative quando não estiver em uso. Na IU do Workbench no Console do Cloud, selecione o notebook e, em seguida, clique em Parar:

57213ef2edad9257.png

Se você quiser excluir todos os recursos criados neste laboratório, basta Excluir o notebook do workbench em vez de interrompê-lo.

No menu de navegação do console do Cloud, acesse "Storage" e exclua os dois buckets que você criou para armazenar os recursos do modelo. AVISO: só faça isso se tiver criado buckets só para este laboratório.