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érie temporal 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 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érie temporal
  • 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érie temporal

O foco deste codelab é aplicar técnicas de previsão de série temporal usando o Google Cloud Platform. Não é um curso geral de previsão de séries temporais, mas uma breve apresentação dos conceitos pode ser útil para nossos usuários.

Dados de série temporal

Primeiro, o que é uma série temporal? É um conjunto de dados com informações registradas em intervalos regulares. Um conjunto de dados de série temporal contém 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 em um período específico, como um dia, uma semana, um mês, uma estação etc.
  • Aleatório: flutuações residuais

Pode haver várias camadas de sazonalidade. Por exemplo, uma central de atendimento pode notar um padrão no volume de chamadas em determinados dias da semana e em determinados meses. O resíduo pode ser explicado por outras variáveis além do tempo.

6e8d45bbbbc388ec.png

Estacionariedade

Para melhores resultados na previsão, os dados de série temporal precisam ser estacionários, ou seja, as propriedades estatísticas, como média e variância, são constantes ao longo do tempo. Técnicas como diferenciação e remoçã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 CO₂ mostra um padrão anual repetido com uma tendência de alta. ( Fonte)

ab82857e2e7d0b89.png

Depois de remover a tendência linear, os dados ficam mais adequados para estimativa, já que agora têm uma média constante.

c936381ab1095528.png

Como usar dados de série temporal para machine learning

Para usar dados de série temporal em um problema de aprendizado de máquina, eles precisam ser transformados para que os valores anteriores possam ser usados para prever valores futuros. Esta tabela mostra um exemplo de como as variáveis de defasagem são criadas para ajudar a prever a meta.

d667a941dbd470f5.png

Agora que já falamos sobre alguns fundamentos, vamos começar a analisar dados e fazer previsões.

3. Configurar o ambiente do notebook

Agora que já fizemos uma breve introdução aos dados, vamos configurar o ambiente de desenvolvimento do modelo.

Etapa 1: ativar as APIs

O conector do BigQuery usa a API BigQuery Storage. Pesquise a API BigQuery Storage no console do Google Cloud e ative a API se 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 TensorFlow Enterprise 2.x mais recente sem GPUs:

4e7b73eabf2bc061.png

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

18c9f3c462aafaee.png

Em seguida, crie um notebook Python 3 no JupyterLab:

58523671a252b95a.png

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

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

Em seguida, clone o material de origem com este comando:

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

4. Explorar e visualizar dados

Nesta seção, você:

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

Etapa 1

No Vertex AI Workbench, acesse 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), mude as configurações de região, projeto e bucket em uma das primeiras células e execute cada uma.

Etapa 3

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

55839e7bc0427915.png

5. Criar um modelo com a previsão de séries temporais do BigQuery

Nesta seção, você:

  • Importar dados de entrada de série temporal para uma tabela do BigQuery
  • Criar um modelo de série temporal usando a sintaxe do BQML
  • Saiba como avaliar os parâmetros e a acurácia do modelo
  • Fazer previsões 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 no 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 para o ambiente local.

Etapa 2

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

Navegue até o BigQuery no console (pesquisando ou usando este link):

649e7ab1c44b75e8.png

É possível adicionar a tabela a um conjunto de dados novo ou atual, que agrupa tabelas relacionadas. Se você ainda não tiver criado um conjunto de dados, clique no 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, clique em Criar tabela no canto inferior direito para criar uma 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 Parâmetros de esquema e entrada.

213e4177e9e79544.png

Etapa 3

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

No editor de consultas, cole/digite esta consulta, substituindo demo, se necessário, pelo nome do 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 analisar os elementos principais da sintaxe para entender:

CREATE OR REPLACE MODEL
demo.cta_ridership_model

Essa instrução cria o modelo. Há variantes dessa instrução, por exemplo, CREATE MODEL, mas optamos por substituir um modelo existente com o mesmo nome aqui.

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

Aqui, definimos as opções do modelo, sendo a primeira o tipo de modelo. 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'

Esse parâmetro opcional permite incluir feriados no modelo. Como a análise de dados na etapa anterior mostrou que o número de passageiros era menor nos feriados, e os dados são de Chicago, IL, EUA, incluímos os feriados dos EUA no modelo.

AS SELECT ... FROM ...

Esta seção seleciona os dados de entrada que vamos usar para treinar o modelo.

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

Etapa 4

Vamos saber mais sobre nosso modelo. Depois que o treinamento terminar, 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á conferir os parâmetros p, d e q do modelo ARIMA, bem como a sazonalidade descoberta no modelo. Nesse caso, o modelo principal inclui sazonalidade semanal e anual.

5b5b1e129c70a340.png

Etapa 5

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

Cole/digite o seguinte (substituindo demo, se necessário):

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

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

b8a7f22657dc2d27.png

Excelente 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
  • Fazer previsões de várias etapas
  • Incluir outros recursos em um modelo de série temporal
  • Saiba mais sobre arquiteturas de redes neurais para previsão de séries temporais: LSTM e CNN
  • Saiba mais sobre modelos estatísticos, incluindo o alisamento exponencial de Holt-Winters
  • Modelos do conjunto

Etapa 1

No Vertex AI Workbench, acesse 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), mude as configurações de região, projeto e bucket em uma das primeiras células e execute cada uma.

Etapa 3

No notebook, você já conheceu várias arquiteturas de modelo: LSTM, CNN e modelos estatísticos. Para cada modelo, é possível conferir o desempenho dele em relação aos dados de teste:

a528df58f4e6d372.png

7. Treinar e prever na nuvem

Nesta seção, você:

  • Preparar dados e modelos para treinamento na nuvem
  • Treinar o modelo e monitorar o progresso do job com o AI Platform Training
  • Fazer previsões usando o modelo com o AI Platform Prediction

Etapa 1

No Vertex AI Workbench, acesse 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), mude as configurações de região, projeto e bucket em uma das primeiras células e execute cada uma.

Etapa 3

Na seção anterior, treinamos um modelo e fizemos previsões com ele, tudo em um notebook do Workbench. Nesta seção, mostramos como usar o SDK da Vertex AI para Python no notebook para usar os serviços da Vertex AI no treinamento e na implantação.

a3f6b5dc895a24fb.png

8. Desafio

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

Não vamos dar instruções detalhadas, apenas algumas dicas, se você quiser.

O objetivo é prever solicitações de serviço do 311 da cidade de Nova York. Essas solicitações não emergenciais incluem reclamações de ruído, problemas com iluminação pública 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 conhecer melhor os dados, teste algumas das consultas de exemplo listadas 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 Analisar e visualizar para trabalhar com esses dados.

Dicas

  • Duplique o notebook 01-explore.ipynb e comece a trabalhar com ele.
  • Para analisar os dados, tente 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 receber a contagem 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á outros recursos.
  • Considere mudar o nome do arquivo em que você exporta os dados 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:
  • De frequência para 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)
  • Períodos: 12 (a sazonalidade é de 12 meses)
  • Mude o nome do arquivo de entrada se você o tiver alterado no notebook anterior.
  • Se você executar a consulta no meio do mês, o total mensal do mês final será muito menor do que o esperado. Então, para os fins deste 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, pule ou comente essas células.
  • Ajuste as unidades LSTM e os filtros e o tamanho do kernel da CNN para esse novo modelo.

9. Limpeza

Se você quiser continuar usando esse notebook, recomendamos que o desative quando não estiver em uso. Na interface do Workbench no console do Cloud, selecione o notebook e clique em Parar:

57213ef2edad9257.png

Se 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 criados para armazenar os recursos do modelo. ATENÇÃO: faça isso apenas se você tiver criado novos buckets para este laboratório.