Realizar engenharia de atributos com a cláusula TRANSFORM

Neste tutorial, ensinamos a usar a cláusula TRANSFORM da instrução CREATE MODEL para realizar a engenharia de atributos ao mesmo tempo em que você cria e treina um modelo. Com a cláusula TRANSFORM, é possível especificar uma ou mais funções de pré-processamento para transformar os dados de entrada usados no treinamento do modelo. O pré-processamento aplicado ao modelo é feito automaticamente quando você usa o modelo com as funções ML.EVALUATE e ML.PREDICT.

Neste tutorial, usamos o conjunto de dados público bigquery-public-data.ml_datasets.penguin.

crie um conjunto de dados

Crie um conjunto de dados do BigQuery para armazenar seu modelo de ML.

Console

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar a página do BigQuery

  2. No painel Explorer, clique no nome do seu projeto.

  3. Clique em Ver ações > Criar conjunto de dados.

  4. Na página Criar conjunto de dados, faça o seguinte:

    • Para o código do conjunto de dados, insira bqml_tutorial.

    • Em Tipo de local, selecione Multirregião e EUA (várias regiões nos Estados Unidos).

    • Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.

bq

Para criar um novo conjunto de dados, utilize o comando bq mk com a sinalização --location. Para obter uma lista completa de parâmetros, consulte a referência comando bq mk --dataset.

  1. Crie um conjunto de dados chamado bqml_tutorial com o local dos dados definido como US e uma descrição de BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    Em vez de usar a flag --dataset, o comando usa o atalho -d. Se você omitir -d e --dataset, o comando vai criar um conjunto de dados por padrão.

  2. Confirme se o conjunto de dados foi criado:

    bq ls

API

Chame o método datasets.insert com um recurso de conjunto de dados definido.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

Antes de testar esta amostra, siga as instruções de configuração dos BigQuery DataFrames no Guia de início rápido do BigQuery: como usar os BigQuery DataFrames. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, consulte Configurar o ADC para um ambiente de desenvolvimento local.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Criar o modelo

Crie um modelo de regressão linear para prever o peso dos pinguins e treine-o na tabela de amostra penguins.

A cláusula OPTIONS(model_type='linear_reg', input_label_cols=['body_mass_g']) indica que você está criando um modelo de regressão linear. Um modelo de regressão linear gera um valor contínuo a partir de uma combinação linear de recursos de entrada. A coluna body_mass_g é a coluna do rótulo de entrada. Para modelos de regressão linear, é preciso que a coluna de rótulo tenha valor real, isto é, os valores da coluna precisam ser números reais.

A cláusula TRANSFORM desta consulta usa as seguintes colunas da instrução SELECT:

  • body_mass_g: usado no treinamento sem nenhuma mudança.
  • culmen_depth_mm: usado no treinamento sem nenhuma mudança.
  • flipper_length_mm: usado no treinamento sem nenhuma mudança.
  • bucketized_culmen_length: gerado a partir de culmen_length_mm, dividindo culmen_length_mm com base em quantis com a função analítica ML.QUANTILE_BUCKETIZE();
  • culmen_length_mm: o valor culmen_length_mm original, convertido em um valor STRING e usado no treinamento.
  • species_sex: gerado a partir do cruzamento de species e sex usando a função ML.FEATURE_CROSS.

Não é necessário usar todas as colunas da tabela de treinamento na cláusula TRANSFORM.

A cláusula WHEREWHERE body_mass_g IS NOT NULL AND RAND() < 0.2 — exclui linhas em que o peso dos pinguins é NULL e usa a função RAND para extrair uma amostra aleatória dos dados.

Siga estas etapas para criar o modelo:

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. No Editor de consultas, cole a consulta a seguir e clique em Executar:

    CREATE OR REPLACE MODEL `bqml_tutorial.penguin_transform`
      TRANSFORM(
        body_mass_g,
        culmen_depth_mm,
        flipper_length_mm,
        ML.QUANTILE_BUCKETIZE(culmen_length_mm, 10) OVER () AS bucketized_culmen_length,
        CAST(culmen_length_mm AS string) AS culmen_length_mm,
        ML.FEATURE_CROSS(STRUCT(species, sex)) AS species_sex)
      OPTIONS (
        model_type = 'linear_reg',
        input_label_cols = ['body_mass_g'])
    AS
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE
      body_mass_g IS NOT NULL
      AND RAND() < 0.2;

    A consulta leva cerca de 15 minutos para ser concluída. Depois disso, o modelo penguin_transform aparece no painel Explorer. Como a consulta usa uma instrução CREATE MODEL para criar um modelo, não é possível ver os resultados dela.

Avaliar o modelo

Avalie o desempenho do modelo usando a função ML.EVALUATE. A função ML.EVALUATE avalia os pesos previstos dos pinguins retornados pelo modelo em relação aos pesos reais dos pinguins nos dados de treinamento.

A cláusula FROM e a instrução SELECT aninhada desta consulta são as mesmas da consulta CREATE MODEL. Como você usou a cláusula TRANSFORM ao criar o modelo, não é necessário especificar as colunas e transformações novamente na função ML.EVALUATE. A função os recupera automaticamente do modelo.

Siga estas etapas para avaliar o modelo:

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. No Editor de consultas, cole a consulta a seguir e clique em Executar:

    SELECT
      *
    FROM
      ML.EVALUATE(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            body_mass_g IS NOT NULL
        ));

    A resposta deve ficar assim:

    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    | mean_absolute_error | mean_squared_error | mean_squared_log_error | median_absolute_error |      r2_score      | explained_variance |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    |   64.21134350607677 | 13016.433317859564 |   7.140935762696211E-4 |     15.31788461553515 | 0.9813042531507734 | 0.9813186268757634 |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    

    Uma métrica importante nos resultados da avaliação é a pontuação R2. A pontuação R2 é uma medida estatística que determina se as previsões de regressão linear se aproximam dos dados reais. Um valor de 0 indica que o modelo não explica a variabilidade dos dados de resposta em torno da média. Um valor 1 indica que o modelo explica toda a variabilidade dos dados de resposta em torno da média.

    Para mais informações sobre a saída da função ML.EVALUATE, consulte Saída.

    Também é possível chamar ML.EVALUATE sem fornecer os dados de entrada. Ela usará as métricas de avaliação calculadas durante o treinamento.

Usar o modelo para prever o peso de pinguins

Use o modelo com a função ML.PREDICT para prever o peso dos pinguins machos.

A função ML.PREDICT gera o valor previsto na coluna predicted_label_column_name, neste caso, predicted_body_mass_g.

Ao usar a função ML.PREDICT, não é preciso transmitir todas as colunas usadas no treinamento de modelo. Apenas as colunas usadas na cláusula TRANSFORM são obrigatórias. Assim como a ML.EVALUATE, a função ML.PREDICT recupera automaticamente as colunas e transformações TRANSFORM do modelo.

Siga estas etapas para receber previsões do modelo:

  1. No console do Google Cloud , acesse a página BigQuery.

    Acessar o BigQuery

  2. No Editor de consultas, cole a consulta a seguir e clique em Executar:

    SELECT
      predicted_body_mass_g
    FROM
      ML.PREDICT(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            sex = 'MALE'
        ));

    A resposta deve ficar assim:

    +-----------------------+
    | predicted_body_mass_g |
    +-----------------------+
    |    2810.2868541725757 |
    +-----------------------+
    |    3813.6574220842676 |
    +-----------------------+
    |     4098.844698262214 |
    +-----------------------+
    |     4256.587135004173 |
    +-----------------------+
    |     3008.393497302691 |
    +-----------------------+
    |     ...               |
    +-----------------------+