
Con Google BigQuery ML ya puedes predecir tu gasto en Google Cloud en pocos minutos y sin salir de la consola de BigQuery.
Introducción
La regresión lineal, pese a su sencillez, permite generar predicciones precisas para todo tipo de problemas reales de forma eficiente. Al ser tan simple, su entrenamiento es fácil de configurar y converge rápido.
En este artículo te explico cómo analizar los datos de facturación de Google Cloud y armar un modelo de predicción sencillo para estimar el gasto mensual total esperado. Para hacerlo más interesante, voy a usar únicamente Google BigQuery, de modo que todos los datos de facturación se queden dentro del ecosistema del data warehouse.
En este ejercicio voy a usar Google Billing Exports. La exportación de facturación a BigQuery permite exportar de forma automática el uso y los cargos diarios a lo largo del día hacia el dataset de BigQuery que tú elijas. Puedes leer más sobre Google Billing Exports aquí.
Los datos y los ejemplos de código están disponibles aquí: https://github.com/doitintl/BigQueryML-Examples
Datos en bruto
La siguiente tabla muestra los cargos de los distintos servicios consumidos por dos cuentas de facturación de Google Cloud que tenemos.
Datos de muestra en Google Billing Exports a BigQuery
El modelo que queremos
El objetivo es estimar la factura total del mes en curso a partir de todos los cargos recibidos hasta un día determinado.
El modelo no solo le permitirá al cliente estimar el gasto total, sino también detectar anomalías y disparar alertas ante sobrecargos.
Supuestos
El modelo parte de la base de que la factura mensual depende linealmente de 3 variables:

La primera variable refleja la tendencia de consumo diario actual. Las otras dos son los días que faltan para fin de mes y el saldo actual. En conjunto, estas tres variables le permiten al modelo estimar el gasto mensual restante.
Agregando los datos a resolución diaria
Como el modelo necesita los datos a resolución diaria, vamos a usar BigQuery para agregarlos por día.
https://gist.github.com/gidutz/2ce58c9391c979b63ac1bbe3bfece7c5
El esquema resultante es el siguiente:
account_name — el id de la cuenta
day — días que faltan para fin de mes
month — mes de facturación
year — año de facturación
daily_cost — el costo total pagado por todos los servicios durante el día de facturación
monthly_cost — la etiqueta: la suma de todos los cargos del mes en curso, incluida la facturación futura
Una vez agregados los datos a resolución diaria, los guardo como una nueva tabla y los uso para generar un dataset de ML.

Cómo calcular agregaciones por ventana
El siguiente paso es calcular cuánto se le ha facturado a cada cuenta desde el inicio del mes hasta el día actual. Para esto vamos a usar una función de ventana agregada, que además nos servirá para calcular el gasto diario promedio del mes hasta hoy.
La sintaxis de la función de ventana agregada está aquí: [1]
analytic_function_name ( [ argument_list ] ) OVER ( [ PARTITION BY partition_expression_list ] [ ORDER BY expression [{ ASC | DESC }] [, ...] ] [ window_frame_clause ] )Aplico la función a nuestra tabla billing_daily_monthly de la siguiente manera:
https://gist.github.com/gidutz/da662ead3e013c45436b10b574585c06
Al graficar los datos se ve que la factura mensual crece de forma bastante lineal:

Estos resultados nos dan confianza de que un modelo lineal es la opción adecuada para el problema del gasto. Además, el gradiente varía poco entre meses, lo que sugiere que las features elegidas son estadísticos suficientes respecto a la variable independiente.
Por supuesto, con más features y modelos más complejos lo más probable es que se obtengan predicciones más precisas, y eso se puede construir con otras herramientas como Google Cloud ML. Pero, por ahora, parece que ya terminamos de preparar los datos.
(¡WOO HOO!)
Cómo ajustar un modelo de regresión lineal con BigQuery ML
Con los datos listos, puedo usar la nueva herramienta BigQuery ML (lanzada en agosto de 2018) para ajustar un modelo de regresión lineal a los datos.
¡Ajustar el modelo a nuestro dataset es increíblemente fácil!
https://gist.github.com/gidutz/7a0bd510494285fd679cde71944e9d77
Predicciones y evaluación del modelo
Una vez guardado, el modelo se puede usar para hacer predicciones. Para eso uso la siguiente consulta, que estima el gasto mensual final y calcula el Error Absoluto Relativo de las predicciones por día:
https://gist.github.com/gidutz/f7de19eee11478d75757e4bdc3b25001
Los resultados que aparecen en la siguiente tabla se pueden guardar y reutilizar en otros componentes del sistema, como aplicaciones de monitoreo y alertas. El Error Absoluto Relativo Medio del modelo es de aproximadamente 3.0%, lo cual no está nada mal. (Nota: los datos se generaron específicamente para esta demo. Con datos reales logré un error cercano al 2.0%).
predicción de muestra
¿Quieres más contenido como este? Pásate por nuestro blog o sigue a Gad en Twitter.
Agradecimientos: Vadim Solovey — Edición
amiel m — Revisión técnica
Palabras clave: BigQueryML, tutorial de BigQuery ML, ejemplo de BigQuery ML