
Com o Google BigQuery ML, dá para prever seus gastos no Google Cloud em poucos minutos, sem sair do console do BigQuery.
Introdução
A regressão linear, apesar de bem simples, consegue gerar previsões precisas e eficientes para diversos problemas do mundo real. Justamente por essa simplicidade, treinar um modelo de regressão linear é fácil de configurar e tem a vantagem de uma convergência rápida.
Neste post, vou mostrar como analisar dados de billing do Google Cloud e construir um modelo de previsão simples para estimar o gasto mensal total. Para deixar a coisa mais interessante, vou usar só o Google BigQuery, mantendo todos os dados de billing dentro do ecossistema de data warehouse.
Neste exercício, vou usar o Google Billing Exports. A exportação de billing para o BigQuery permite que clientes exportem o uso e os encargos diários automaticamente ao longo do dia para um dataset do BigQuery que você definir. Saiba mais sobre o Google Billing Exports aqui.
Os dados e exemplos de código estão disponíveis aqui: https://github.com/doitintl/BigQueryML-Examples
Dados brutos
A tabela abaixo lista as cobranças de vários serviços consumidos por duas contas de billing do Google Cloud que temos.
Exemplo de dados no Google Billing Exports para o BigQuery
Modelo desejado
O objetivo é estimar o valor total da fatura do mês corrente com base em todas as cobranças recebidas até um determinado dia.
O modelo permite ao cliente não só estimar o gasto total, como também detectar anomalias e criar alertas para cobranças excessivas.
Premissas
O modelo parte do princípio de que a fatura mensal depende linearmente de 3 variáveis:

A primeira variável representa a tendência atual de consumo diário. As outras duas são o número de dias até o fim do mês e o saldo atual. Juntas, essas variáveis permitem ao modelo estimar o gasto restante do mês.
Agregando os dados em resolução diária
Como o modelo precisa de dados em resolução diária, vamos usar o BigQuery para agregar os dados por dia.
https://gist.github.com/gidutz/2ce58c9391c979b63ac1bbe3bfece7c5
O esquema resultante fica assim:
account_name — o id da conta
day — dias restantes até o fim do mês
month — mês de billing
year — ano de billing
daily_cost — o custo total pago por todos os serviços no dia de billing
monthly_cost — o rótulo, ou seja, a soma de todas as cobranças feitas no mês corrente, incluindo cobranças futuras
Com os dados agregados em resolução diária, salvo tudo em uma nova tabela e a uso para gerar um dataset de ML.

Calculando agregações em janela
O próximo passo é calcular quanto foi cobrado de cada conta desde o início do mês até o dia atual. Para isso, vamos usar uma função de janela agregada, que também nos permite calcular o gasto diário médio do mês até o dia atual.
A sintaxe da função de janela agregada está aqui: [1]
analytic_function_name ( [ argument_list ] ) OVER ( [ PARTITION BY partition_expression_list ] [ ORDER BY expression [{ ASC | DESC }] [, ...] ] [ window_frame_clause ] )Aplico a função na nossa tabela billing_daily_monthly assim:
https://gist.github.com/gidutz/da662ead3e013c45436b10b574585c06
Plotando os dados, dá para ver que a fatura mensal cresce de forma praticamente linear:

Os resultados acima reforçam que um modelo linear é uma escolha adequada para o problema de gasto. Além disso, o gradiente tem pouca variância entre os meses, o que sugere que as features escolhidas são estatísticas suficientes em relação à variável independente.
Claro, mais features e modelos mais complexos tendem a gerar previsões mais precisas — e isso pode ser feito com outras ferramentas, como o Google Cloud ML. Mas, por enquanto, a preparação dos dados está pronta.
(EBA!)
Treinando um modelo de regressão linear com BigQuery ML
Com os dados prontos, posso usar o BigQuery ML (lançado em agosto de 2018) para treinar um modelo de regressão linear.
Treinar o modelo no nosso dataset é absurdamente simples!
https://gist.github.com/gidutz/7a0bd510494285fd679cde71944e9d77
Fazendo previsões e avaliando o modelo
Depois de salvo, o modelo pode ser usado para fazer previsões. Para isso, uso a consulta a seguir, que estima o gasto final do mês e calcula o erro absoluto relativo das previsões por dia:
https://gist.github.com/gidutz/f7de19eee11478d75757e4bdc3b25001
Os resultados mostrados na tabela a seguir podem ser salvos e consumidos por outros componentes do sistema, como aplicações de monitoramento e alertas. O erro absoluto relativo médio do modelo é de cerca de 3,0%, o que não é nada mau. (Vale lembrar que os dados foram gerados especialmente para esta demo. Com dados reais, cheguei a cerca de 2,0% de erro.)
exemplo de previsão
Quer mais conteúdos? Confira nosso blog ou siga o Gad no Twitter.
Agradecimentos: Vadim Solovey — Edição
amiel m — Revisão técnica
Palavras-chave: BigQueryML, tutorial BigQuery ML, exemplo BigQuery ML