Treinamento inteligente de modelos BigQuery ML com dbt

Dec 16 2022
Os modelos de aprendizado de máquina podem ser muito úteis para tomar decisões de negócios baseadas em evidências. Dependendo do seu negócio, pode ser usado para segmentação de clientes, previsão de demanda e muito mais.
src: Unsplash e getdbt.com

Os modelos de aprendizado de máquina podem ser muito úteis para tomar decisões de negócios baseadas em evidências. Dependendo do seu negócio, pode ser usado para segmentação de clientes, previsão de demanda e muito mais. No entanto, uma das maiores barreiras para começar a trabalhar com ML é a falta de conhecimento de python, estruturas de ML e o incômodo de manter pipelines complexos. Ao mesmo tempo, novas ferramentas de ML para a pilha de dados moderna estão surgindo constantemente, dificultando a navegação e o conhecimento do que vale a pena adotar. Nesta postagem do blog, mostrarei como criar um pipeline de ML completo com retreinamento de modelo automatizado e criar painéis sobre ele simplesmente combinando BigQuery ML com dbt.

Embora suponha que sua pilha de dados seja criada com BigQuery e dbt, talvez você ainda não esteja familiarizado com o BigQuery ML. Como o Google descreve, “o BigQuery ML permite criar e executar modelos de aprendizado de máquina no BigQuery usando consultas SQL padrão” [1]. Não é o caminho a seguir quando você precisa de modelos altamente personalizados, mas é uma excelente opção quando deseja incorporar um modelo de ML padrão em seus painéis de BI com apenas algumas linhas de código . Vamos demonstrar com um exemplo!

Aproveitaremos o pacote dbt dbt_ml para criar um modelo K-means BigQuery ML que basicamente agrupa membros semelhantes (clientes/usuários) com base nos recursos que incluímos nos dados de treinamento. Ao exibir os clusters em um painel do Looker (ou usar alguma outra ferramenta de BI), a equipe de marketing pode adaptar suas campanhas e acompanhar as alterações na base de usuários.

Depois de seguir as instruções de instalação dbt_ml aqui , os dados de treinamento podem primeiro ser criados como um modelo dbt normal ( member_cluster_training_data.sql). O código por trás dele é omitido aqui, pois é específico da empresa, mas algumas linhas de exemplo se parecem com isso no meu caso:

As 5 principais linhas dos dados de treinamento, uma por membro

Em um arquivo denominado member_cluster_model.sql , o modelo K-means pode ser facilmente configurado da seguinte maneira:

{{
    config(
        materialized='model',
        ml_config={
            'model_type': 'kmeans',
            'num_clusters': dbt_ml.hparam_candidates([3, 4, 5, 6]),
            'num_trials': 100,
            'max_iterations': 20,
        }
    )
}}

SELECT * EXCEPT(holder_member_id) FROM {{ref('member_cluster_training_data')}}

Detalhes sobre o treinamento do modelo podem ser encontrados pesquisando por member_cluster_model e clicando nele na GUI do BigQuery

Depois de treinar o modelo usando dbt run como qualquer outro modelo dbt, ele pode ser referenciado em modelos dbt downstream usando a predictmacro. Nesse caso, um modelo de dbt subsequente ( member_cluster_allocations.sql ) que contém as atribuições de cluster é criado da seguinte maneira:

{{config(materialized='table')}}
with eval_data as (
SELECT * FROM {{ref('member_cluster_training_data')}}
),

clusters_added AS (
SELECT *
FROM {{ dbt_ml.predict(ref('member_cluster_model'), 'eval_data') }}

),

-- optional CTE to get the distance to nearest cluster center
get_min_dist AS (
SELECT c.holder_member_id, MIN(dist.DISTANCE) AS distance_to_center
FROM clusters_added c CROSS JOIN UNNEST(c.NEAREST_CENTROIDS_DISTANCE) dist
GROUP BY 1
),

join_cluster_dist AS (
SELECT c.* EXCEPT (NEAREST_CENTROIDS_DISTANCE),
       g.distance_to_center,
       CURRENT_TIMESTAMP() AS allocations_created_at
FROM get_min_dist g
INNER JOIN clusters_added c
USING (holder_member_id)
)

SELECT * FROM join_cluster_dist

A tabela de saída member_cluster_allocations.sql atribuindo cada membro a um cluster, denominado CLUSTER_ID
Um painel simples no Looker, onde nomeamos os perfis (valor médio por cluster) A, B, C e D. “In Profile Variation” é definido como a distância média de um perfil para o centro.

No entanto, há uma armadilha a ser observada aqui! O problema de usar BigQuery ML e dbt imediatamente dessa forma é que seus modelos serão treinados novamente toda vez que alguém executar dbt run. Como o treinamento dos modelos de ML geralmente leva um pouco de tempo, isso pode prolongar os ciclos de desenvolvimento do dbt e aumentar os custos computacionais. Retreinar os modelos em produção pode ser necessário apenas uma vez por mês, enquanto o restante de seus modelos provavelmente deve ser materializado com mais frequência.

O truque é desativar o modelo executado em dbt por padrão e ativá-lo apenas para execuções específicas. Basta adicionar o código abaixo ao seu arquivo dbt_project.yml e ignorar tudo na pasta models/bg_ml, onde você pode colocar o código ML. dbt run

models:
    hedvig:
        bq_ml:
            +enabled: "{{ var('bq_ml', false) | as_bool }}" # RUN WITH FLAG --vars 'bq_ml: true' TO ENABLE

# NOTE: This is NOT a complete version of the file
name: hedvig
version: '1.0'

config-version: 2

# This setting configures which "profile" dbt uses for this project. Profiles contain
# database connection information.
profile: 'bigquery'

# These configurations specify where dbt should look for different types of files.
# The `model-paths` config, for example, states that source models can be found
# in the "models/" directory.
model-paths: ["models"]
analysis-paths: ["analysis"] 
test-paths: ["tests"]
seed-paths: ["data"]
macro-paths: ["macros"]

dbt run --vars 'bq_ml: true' # run all models
dbt run --models <model_name> --vars 'bq_ml: true' # run only <model_name>

Isenções de responsabilidade e requisitos

Executei tudo com sucesso do meu mac local usando PyCharm e, em seguida, agendei execuções com dbt cloud com as seguintes versões instaladas:

dbt=1.0.8 
bigquery=1.0.0

packages:
  - package: dbt-labs/dbt_utils
    version: 0.8.0
  - package: dbt-labs/codegen
    version: 0.5.0
  - package: kristeligt-dagblad/dbt_ml
    version: 0.5.1

Sinta-se à vontade para entrar em contato comigo no LinkedIn se tiver algum feedback ou comentário. É muito apreciado!

Se você também deseja trabalhar com dados em uma insurtech em rápido crescimento, confira a página de carreiras de Hedvig .

Referências

[1]https://cloud.google.com/bigquery-ml/docs/introduction