Use o BigQuery ML para prever o peso dos pinguins


Neste tutorial, vai usar um modelo de regressão linear no BigQuery ML para prever o peso de um pinguim com base nas informações demográficas do pinguim. Uma regressão linear é um tipo de modelo de regressão que gera um valor contínuo a partir de uma combinação linear de caraterísticas de entrada.

Este tutorial usa o conjunto de dados bigquery-public-data.ml_datasets.penguins.

Objetivos

Neste tutorial, vai realizar as seguintes tarefas:

  • Crie um modelo de regressão linear.
  • Avalie o modelo.
  • Faça previsões com o modelo.

Custos

Este tutorial usa componentes faturáveis do Google Cloud, incluindo o seguinte:

  • BigQuery
  • BigQuery ML

Para mais informações sobre os custos do BigQuery, consulte a página de preços do BigQuery.

Para mais informações sobre os custos do BigQuery ML, consulte os preços do BigQuery ML.

Antes de começar

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

Autorizações necessárias

Para criar o modelo com o BigQuery ML, precisa das seguintes autorizações de IAM:

  • bigquery.jobs.create
  • bigquery.models.create
  • bigquery.models.getData
  • bigquery.models.updateData
  • bigquery.models.updateMetadata

Para executar a inferência, precisa das seguintes autorizações:

  • bigquery.models.getData no modelo
  • bigquery.jobs.create

Crie um conjunto de dados

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

Consola

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda à página do BigQuery

  2. No painel Explorador, clique no nome do 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 ID do conjunto de dados, introduza bqml_tutorial.

    • Em Tipo de localização, selecione Várias regiões e, de seguida, selecione EUA (várias regiões nos Estados Unidos).

    • Deixe as restantes predefinições como estão e clique em Criar conjunto de dados.

bq

Para criar um novo conjunto de dados, use o comando bq mk com a flag --location. Para uma lista completa de parâmetros possíveis, consulte a referência do comando bq mk --dataset.

  1. Crie um conjunto de dados com o nome bqml_tutorial com a localização dos dados definida 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 omitir -d e --dataset, o comando cria um conjunto de dados por predefinição.

  2. Confirme que 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"
  }
}

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure 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)

Crie o modelo

Crie um modelo de regressão linear com o conjunto de dados de exemplo do Analytics para o BigQuery.

SQL

Pode criar um modelo de regressão linear usando a declaração CREATE MODEL e especificando LINEAR_REG para o tipo de modelo. A criação do modelo inclui a preparação do mesmo.

Seguem-se aspetos úteis a ter em conta acerca da declaração CREATE MODEL:

  • A opção input_label_cols especifica que coluna na declaração SELECT usar como coluna de etiqueta. Aqui, a coluna de etiquetas é body_mass_g. Para os modelos de regressão linear, a coluna de etiqueta tem de ter valores reais, ou seja, os valores da coluna têm de ser números reais.
  • A declaração SELECT desta consulta usa as seguintes colunas na tabela bigquery-public-data.ml_datasets.penguins para prever o peso de um pinguim:

    • species: a espécie de pinguim.
    • island: a ilha onde o pinguim reside.
    • culmen_length_mm: o comprimento do culmen do pinguim em milímetros.
    • culmen_depth_mm: a profundidade do culmen do pinguim em milímetros.
    • flipper_length_mm: o comprimento das barbatanas do pinguim em milímetros.
    • sex: o sexo do pinguim.
  • A cláusula WHERE na declaração SELECT desta consulta, WHERE body_mass_g IS NOT NULL, exclui as linhas onde a coluna body_mass_g é NULL.

Execute a consulta que cria o modelo de regressão linear:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte consulta:

    CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model`
    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;
  3. A criação do modelo penguins_model demora cerca de 30 segundos. Para ver o modelo, aceda ao painel Explorador, expanda o conjunto de dados bqml_tutorial e, em seguida, expanda a pasta Modelos.

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

from bigframes.ml.linear_model import LinearRegression
import bigframes.pandas as bpd

# Load data from BigQuery
bq_df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")

# Drop rows with nulls to get training data
training_data = bq_df.dropna(subset=["body_mass_g"])

# Specify your feature (or input) columns and the label (or output) column:
feature_columns = training_data.drop(columns=["body_mass_g"])
label_columns = training_data[["body_mass_g"]]

# Create the linear model
model = LinearRegression()
model.fit(feature_columns, label_columns)
model.to_gbq(
    your_model_id,  # For example: "bqml_tutorial.penguins_model"
    replace=True,
)

A criação do modelo demora cerca de 30 segundos. Para ver o modelo, aceda ao painel Explorador, expanda o conjunto de dados bqml_tutorial e, de seguida, expanda a pasta Modelos.

Obtenha estatísticas de treino

Para ver os resultados da preparação do modelo, pode usar a função ML.TRAINING_INFO ou ver as estatísticas na Google Cloud consola. Neste tutorial, vai usar a Google Cloud consola.

Um algoritmo de aprendizagem automática cria um modelo examinando muitos exemplos e tentando encontrar um modelo que minimize a perda. Este processo é denominado minimização de risco empírico.

A perda é a penalização por uma má previsão. É um número que indica o quão má foi a previsão do modelo num único exemplo. Se a previsão do modelo for perfeita, a perda é zero; caso contrário, a perda é superior. O objetivo da preparação de um modelo é encontrar um conjunto de ponderações e desvios que tenham uma perda baixa, em média, em todos os exemplos.

Veja as estatísticas de preparação do modelo que foram geradas quando executou a consulta CREATE MODEL:

  1. No painel Explorador, expanda o conjunto de dados bqml_tutorial e, em seguida, a pasta Modelos. Clique em penguins_model para abrir o painel de informações do modelo.

  2. Clique no separador Formação e, de seguida, clique em Tabela. Os resultados devem ser semelhantes aos seguintes:

    Resultado ML.TRAINING_INFO

    A coluna Perda de dados de preparação representa a métrica de perda calculada após a preparação do modelo no conjunto de dados de preparação. Uma vez que fez uma regressão linear, esta coluna mostra o valor do erro quadrático médio. É usada automaticamente uma estratégia de otimização de normal_equation para esta preparação, pelo que só é necessária uma iteração para convergir para o modelo final. Para mais informações sobre como definir a estratégia de otimização do modelo, consulte optimize_strategy.

Avalie o modelo

Depois de criar o modelo, avalie o respetivo desempenho através da ML.EVALUATE função ou da score função BigQuery DataFrames para avaliar os valores previstos gerados pelo modelo em comparação com os dados reais.

SQL

Para a entrada, a função ML.EVALUATE usa o modelo preparado e um conjunto de dados que corresponde ao esquema dos dados que usou para preparar o modelo. Num ambiente de produção, deve avaliar o modelo com dados diferentes dos dados que usou para preparar o modelo. Se executar ML.EVALUATE sem fornecer dados de entrada, a função obtém as métricas de avaliação calculadas durante a preparação. Estas métricas são calculadas com o conjunto de dados de avaliação reservado automaticamente:

    SELECT
      *
    FROM
      ML.EVALUATE(MODEL bqml_tutorial.penguins_model);
    

Execute a consulta ML.EVALUATE:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte consulta:

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

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

import bigframes.pandas as bpd

# Select the model you will be evaluating. `read_gbq_model` loads model data from
# BigQuery, but you could also use the `model` object from the previous steps.
model = bpd.read_gbq_model(
    your_model_id,  # For example: "bqml_tutorial.penguins_model"
)

# Score the model with input data defined in an earlier step to compare
# model predictions on feature_columns to true labels in label_columns.
score = model.score(feature_columns, label_columns)
# Expected output results:
# index  mean_absolute_error  mean_squared_error  mean_squared_log_error  median_absolute_error  r2_score  explained_variance
#   0        227.012237         81838.159892            0.00507                173.080816        0.872377    0.872377
#   1 rows x 6 columns

Os resultados devem ter um aspeto semelhante ao seguinte:

Resultado de ML.EVALUATE

Como fez uma regressão linear, os resultados incluem as seguintes colunas:

  • mean_absolute_error
  • mean_squared_error
  • mean_squared_log_error
  • median_absolute_error
  • r2_score
  • explained_variance

Uma métrica importante nos resultados da avaliação é a classificaçã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 nenhuma da variabilidade dos dados de resposta em torno da média. Um valor de 1 indica que o modelo explica toda a variabilidade dos dados de resposta em torno da média.

Também pode consultar o painel de informações do modelo na Google Cloud consola para ver as métricas de avaliação:

Resultado de ML.EVALUATE

Use o modelo para prever resultados

Agora que avaliou o seu modelo, o passo seguinte é usá-lo para prever um resultado. Pode executar a função predictBigQuery DataFrames no modelo para prever a massa corporal em gramas de todos os pinguins que residem nas ilhas Biscoe.ML.PREDICT

SQL

Para a entrada, a função ML.PREDICT usa o modelo preparado e um conjunto de dados que corresponde ao esquema dos dados que usou para preparar o modelo, excluindo a coluna de etiqueta.

Execute a consulta ML.PREDICT:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte consulta:

    SELECT
    *
    FROM
    ML.PREDICT(MODEL `bqml_tutorial.penguins_model`,
      (
      SELECT
        *
      FROM
        `bigquery-public-data.ml_datasets.penguins`
      WHERE island = 'Biscoe'));

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

# Select the model you'll use for predictions. `read_gbq_model` loads
# model data from BigQuery, but you could also use the `model` object
# object from previous steps.
model = bpd.read_gbq_model(
    your_model_id,
    # For example: "bqml_tutorial.penguins_model",
)

# Load data from BigQuery
bq_df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")

# Use 'contains' function to filter by island containing the string
# "Biscoe".
biscoe_data = bq_df.loc[bq_df["island"].str.contains("Biscoe")]

result = model.predict(biscoe_data)

# Expected output results:
#     predicted_body_mass_g  	      species	                island	 culmen_length_mm  culmen_depth_mm   body_mass_g 	flipper_length_mm	sex
# 23	  4681.782896	   Gentoo penguin (Pygoscelis papua)	Biscoe	      <NA>	            <NA>	        <NA>	          <NA>	        <NA>
# 332	  4740.7907	       Gentoo penguin (Pygoscelis papua)	Biscoe	      46.2	            14.4	        214.0	          4650.0	    <NA>
# 160	  4731.310452	   Gentoo penguin (Pygoscelis papua)	Biscoe	      44.5	            14.3	        216.0	          4100.0	    <NA>

Os resultados devem ter um aspeto semelhante ao seguinte:

Resultado de ML.PREDICT

Explique os resultados da previsão

SQL

Para compreender por que motivo o modelo está a gerar estes resultados de previsão, pode usar a função ML.EXPLAIN_PREDICT.

ML.EXPLAIN_PREDICT é uma versão expandida da função ML.PREDICT. ML.EXPLAIN_PREDICT não só produz resultados de previsão, como também produz colunas adicionais para explicar os resultados de previsão. Na prática, pode executar ML.EXPLAIN_PREDICT em vez de ML.PREDICT. Para mais informações, consulte a Vista geral da IA explicável do BigQuery ML.

Execute a consulta ML.EXPLAIN_PREDICT:

  1. Na Google Cloud consola, aceda à página BigQuery.

Aceda ao BigQuery

  1. No editor de consultas, execute a seguinte consulta:
SELECT
  *
FROM
  ML.EXPLAIN_PREDICT(MODEL `bqml_tutorial.penguins_model`,
    (
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE island = 'Biscoe'),
    STRUCT(3 as top_k_features));
  1. Os resultados devem ter um aspeto semelhante ao seguinte:

    Saída ML.EXPLAIN_PREDICT

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

# Use 'predict_explain' function to understand why the model is generating these prediction results.
# 'predict_explain'is an extended version of the 'predict' function that not only outputs prediction results, but also outputs additional columns to explain the prediction results.
# Using the trained model and utilizing data specific to Biscoe Island, explain the predictions of the top 3 features
explained = model.predict_explain(biscoe_data, top_k_features=3)

# Expected results:
#   predicted_body_mass_g               top_feature_attributions	        baseline_prediction_value	prediction_value	approximation_error	              species	            island	culmen_length_mm	culmen_depth_mm	flipper_length_mm	body_mass_g	    sex
# 0	 5413.510134	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          5413.510134	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    45.2	              16.4	        223.0	           5950.0	    MALE
# 1	 4768.351092            [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          4768.351092	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    46.5	              14.5	        213.0	           4400.0	   FEMALE
# 2	 3235.896372	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          3235.896372	            0.0	        Adelie Penguin (Pygoscelis adeliae)	Biscoe	    37.7	              16.0          183.0	           3075.0	   FEMALE
# 3	 5349.603734	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          5349.603734	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    46.4	              15.6	        221.0	           5000.0	    MALE
# 4	 4637.165037	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          4637.165037	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    46.1	              13.2	        211.0	           4500.0	   FEMALE

Para modelos de regressão linear, os valores de Shapley são usados para gerar valores de atribuição de funcionalidades para cada funcionalidade no modelo. O resultado inclui as três principais atribuições de funcionalidades por linha da tabela penguins porque top_k_features foi definido como 3. Estas atribuições são ordenadas pelo valor absoluto da atribuição por ordem descendente. Em todos os exemplos, a funcionalidade sex foi a que mais contribuiu para a previsão geral.

Explicar o modelo globalmente

SQL

Para saber que funcionalidades são geralmente as mais importantes para determinar o peso dos pinguins, pode usar a função ML.GLOBAL_EXPLAIN. Para usar o ML.GLOBAL_EXPLAIN, tem de voltar a preparar o modelo com a opção ENABLE_GLOBAL_EXPLAIN definida como TRUE.

Treine novamente e receba explicações globais para o modelo:

  1. Na Google Cloud consola, aceda à página BigQuery.

Aceda ao BigQuery

  1. No editor de consultas, execute a seguinte consulta para voltar a preparar o modelo:

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model`
    OPTIONS (
      model_type = 'linear_reg',
      input_label_cols = ['body_mass_g'],
      enable_global_explain = TRUE)
    AS
    SELECT
    *
    FROM
    `bigquery-public-data.ml_datasets.penguins`
    WHERE
    body_mass_g IS NOT NULL;
  2. No editor de consultas, execute a seguinte consulta para obter explicações globais:

    SELECT
    *
    FROM
    ML.GLOBAL_EXPLAIN(MODEL `bqml_tutorial.penguins_model`)
  3. Os resultados devem ter um aspeto semelhante ao seguinte:

    Saída ML.GLOBAL_EXPLAIN

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

# To use the `global_explain()` function, the model must be recreated with `enable_global_explain` set to `True`.
model = LinearRegression(enable_global_explain=True)

# The model must the be fitted before it can be saved to BigQuery and then explained.
training_data = bq_df.dropna(subset=["body_mass_g"])
X = training_data.drop(columns=["body_mass_g"])
y = training_data[["body_mass_g"]]
model.fit(X, y)
model.to_gbq("bqml_tutorial.penguins_model", replace=True)

# Explain the model
explain_model = model.global_explain()

# Expected results:
#                       attribution
# feature
# island	            5737.315921
# species	            4073.280549
# sex	                622.070896
# flipper_length_mm	    193.612051
# culmen_depth_mm	    117.084944
# culmen_length_mm	    94.366793

Limpar

Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

  • Pode eliminar o projeto que criou.
  • Em alternativa, pode manter o projeto e eliminar o conjunto de dados.

Elimine o conjunto de dados

A eliminação do projeto remove todos os conjuntos de dados e todas as tabelas no projeto. Se preferir reutilizar o projeto, pode eliminar o conjunto de dados que criou neste tutorial:

  1. Se necessário, abra a página do BigQuery na Google Cloud consola.

    Aceda à página do BigQuery

  2. Na navegação, clique no conjunto de dados bqml_tutorial que criou.

  3. Clique em Eliminar conjunto de dados no lado direito da janela. Esta ação elimina o conjunto de dados, a tabela e todos os dados.

  4. Na caixa de diálogo Eliminar conjunto de dados, confirme o comando de eliminação escrevendo o nome do conjunto de dados (bqml_tutorial) e, de seguida, clique em Eliminar.

Elimine o projeto

Para eliminar o projeto:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

O que se segue?