Crie e use um modelo de classificação em dados censitários


Neste tutorial, vai usar um modelo de regressão logística binário no BigQuery ML para prever o intervalo de rendimentos de indivíduos com base nos respetivos dados demográficos. Um modelo de regressão logística binária prevê se um valor se enquadra numa de duas categorias, neste caso,se o rendimento anual de um indivíduo é superior ou inferior a 50 000 $.

Este tutorial usa o conjunto de dados bigquery-public-data.ml_datasets.census_adult_income. Este conjunto de dados contém as informações demográficas e de rendimento dos residentes nos EUA de 2000 e 2010.

Objetivos

Neste tutorial, vai realizar as seguintes tarefas:

  • Crie um modelo de regressão logística.
  • Avalie o modelo.
  • Faça previsões com o modelo.
  • Explicar os resultados produzidos pelo 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

Introdução

Uma tarefa comum na aprendizagem automática é classificar os dados num de dois tipos, conhecidos como etiquetas. Por exemplo, um retalhista pode querer prever se um determinado cliente vai comprar um novo produto com base noutras informações sobre esse cliente. Nesse caso, as duas etiquetas podem ser will buy e won't buy. O retalhista pode criar um conjunto de dados de forma que uma coluna represente ambas as etiquetas e também contenha informações do cliente, como a localização do cliente, as compras anteriores e as preferências comunicadas. Em seguida, o retalhista pode usar um modelo de regressão logística binária que usa estas informações dos clientes para prever que etiqueta representa melhor cada cliente.

Neste tutorial, vai criar um modelo de regressão logística binária que prevê se o rendimento de um participante do censo dos EUA se enquadra num de dois intervalos com base nos atributos demográficos do participante.

Crie um conjunto de dados

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

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

    Aceda ao 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 census.

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

      Os conjuntos de dados públicos são armazenados na US região múltipla. Para simplificar, armazene o conjunto de dados na mesma localização.

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

Examine os dados

Examine o conjunto de dados e identifique as colunas a usar como dados de preparação para o modelo de regressão logística. Selecione 100 linhas da tabela census_adult_income:

SQL

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

    Aceda ao BigQuery

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

    SELECT
    age,
    workclass,
    marital_status,
    education_num,
    occupation,
    hours_per_week,
    income_bracket,
    functional_weight
    FROM
    `bigquery-public-data.ml_datasets.census_adult_income`
    LIMIT
    100;
  3. Os resultados têm um aspeto semelhante ao seguinte:

    Dados do recenseamento

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

df = bpd.read_gbq(
    "bigquery-public-data.ml_datasets.census_adult_income",
    columns=(
        "age",
        "workclass",
        "marital_status",
        "education_num",
        "occupation",
        "hours_per_week",
        "income_bracket",
        "functional_weight",
    ),
    max_results=100,
)
df.peek()
# Output:
# age      workclass       marital_status  education_num          occupation  hours_per_week income_bracket  functional_weight
#  47      Local-gov   Married-civ-spouse             13      Prof-specialty              40           >50K             198660
#  56        Private        Never-married              9        Adm-clerical              40          <=50K              85018
#  40        Private   Married-civ-spouse             12        Tech-support              40           >50K             285787
#  34   Self-emp-inc   Married-civ-spouse              9        Craft-repair              54           >50K             207668
#  23        Private   Married-civ-spouse             10   Handlers-cleaners              40          <=50K              40060

Os resultados da consulta mostram que a coluna income_bracket na tabela census_adult_income tem apenas um de dois valores: <=50K ou >50K.

Prepare os dados de amostra

Neste tutorial, vai prever o rendimento dos inquiridos do censo com base nos valores das seguintes colunas na tabela census_adult_income:

  • age: a idade do inquirido.
  • workclass: classe de trabalho realizado. Por exemplo, governo local, privado ou trabalhador por conta própria.
  • marital_status
  • education_num: o nível académico mais elevado do inquirido.
  • occupation
  • hours_per_week: horas trabalhadas por semana.

Exclui colunas que duplicam dados. Por exemplo, a coluna education, porque os valores das colunas education e education_num expressam os mesmos dados em formatos diferentes.

A coluna functional_weight é o número de indivíduos que a organização do censo considera que uma linha específica representa. Uma vez que o valor desta coluna não está relacionado com o valor de income_bracket para qualquer linha específica, usa o valor nesta coluna para separar os dados em conjuntos de preparação, avaliação e previsão criando uma nova coluna dataframe derivada da coluna functional_weight. Etiqueta 80% dos dados para preparar o modelo, 10% dos dados para avaliação e 10% dos dados para previsão.

SQL

Crie uma vista com os dados de amostra. Esta vista é usada pela declaração CREATE MODEL mais adiante neste tutorial.

Execute a consulta que prepara os dados de exemplo:

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

    Aceda ao BigQuery

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

    CREATE OR REPLACE VIEW
    `census.input_data` AS
    SELECT
    age,
    workclass,
    marital_status,
    education_num,
    occupation,
    hours_per_week,
    income_bracket,
    CASE
      WHEN MOD(functional_weight, 10) < 8 THEN 'training'
      WHEN MOD(functional_weight, 10) = 8 THEN 'evaluation'
      WHEN MOD(functional_weight, 10) = 9 THEN 'prediction'
    END AS dataframe
    FROM
    `bigquery-public-data.ml_datasets.census_adult_income`;
  3. Veja os dados de amostra:

    SELECT * FROM `census.input_data`;

DataFrames do BigQuery

Cria um DataFrame chamado input_data. Vai usar input_data mais tarde neste tutorial para preparar o modelo, avaliá-lo e fazer previsões.

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

input_data = bpd.read_gbq(
    "bigquery-public-data.ml_datasets.census_adult_income",
    columns=(
        "age",
        "workclass",
        "marital_status",
        "education_num",
        "occupation",
        "hours_per_week",
        "income_bracket",
        "functional_weight",
    ),
)
input_data["dataframe"] = bpd.Series("training", index=input_data.index,).case_when(
    [
        (((input_data["functional_weight"] % 10) == 8), "evaluation"),
        (((input_data["functional_weight"] % 10) == 9), "prediction"),
    ]
)
del input_data["functional_weight"]

Crie um modelo de regressão logística

Crie um modelo de regressão logística com os dados de preparação que etiquetou na secção anterior.

SQL

Use a declaração CREATE MODEL e especifique LOGISTIC_REG para o tipo de modelo.

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 deve ser usada como a coluna de etiqueta. Aqui, a coluna de etiqueta é income_bracket, pelo que o modelo aprende qual dos dois valores de income_bracket é mais provável para uma determinada linha com base nos outros valores presentes nessa linha.

  • Não é necessário especificar se um modelo de regressão logística é binário ou multiclasse. O BigQuery ML determina que tipo de modelo deve ser preparado com base no número de valores únicos na coluna de etiqueta.

  • A opção auto_class_weights está definida como TRUE para equilibrar as etiquetas de classe nos dados de preparação. Por predefinição, os dados de preparação não têm ponderação. Se as etiquetas nos dados de preparação estiverem desequilibradas, o modelo pode aprender a prever a classe de etiquetas mais popular de forma mais intensa. Neste caso, a maioria dos inquiridos no conjunto de dados pertence ao grupo de rendimentos mais baixo. Isto pode levar a um modelo que prevê demasiado a classe de rendimentos mais baixa. Os pesos das classes equilibram as etiquetas das classes calculando os pesos de cada classe na proporção inversa da frequência dessa classe.

  • A opção enable_global_explain está definida como TRUE para lhe permitir usar a função ML.GLOBAL_EXPLAIN no modelo mais tarde no tutorial.

  • A declaração SELECT consulta a vista input_data que contém os dados de exemplo. A cláusula WHERE filtra as linhas para que apenas as linhas etiquetadas como dados de preparação sejam usadas para preparar o modelo.

Execute a consulta que cria o seu modelo de regressão logística:

  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
    `census.census_model`
    OPTIONS
    ( model_type='LOGISTIC_REG',
      auto_class_weights=TRUE,
      enable_global_explain=TRUE,
      data_split_method='NO_SPLIT',
      input_label_cols=['income_bracket'],
      max_iterations=15) AS
    SELECT * EXCEPT(dataframe)
    FROM
    `census.input_data`
    WHERE
    dataframe = 'training'
  3. No painel Explorador, clique em Conjuntos de dados.

  4. No painel Conjuntos de dados, clique em census.

  5. Clique no painel Modelos.

  6. Clique em census_model.

  7. O separador Detalhes apresenta os atributos que o BigQuery ML usou para realizar a regressão logística.

DataFrames do BigQuery

Use o método fit para preparar o modelo e o método to_gbq para o guardar no seu conjunto de dados.

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.ml.linear_model

# input_data is defined in an earlier step.
training_data = input_data[input_data["dataframe"] == "training"]
X = training_data.drop(columns=["income_bracket", "dataframe"])
y = training_data["income_bracket"]

census_model = bigframes.ml.linear_model.LogisticRegression(
    # Balance the class labels in the training data by setting
    # class_weight="balanced".
    #
    # By default, the training data is unweighted. If the labels
    # in the training data are imbalanced, the model may learn to
    # predict the most popular class of labels more heavily. In
    # this case, most of the respondents in the dataset are in the
    # lower income bracket. This may lead to a model that predicts
    # the lower income bracket too heavily. Class weights balance
    # the class labels by calculating the weights for each class in
    # inverse proportion to the frequency of that class.
    class_weight="balanced",
    max_iterations=15,
)
census_model.fit(X, y)

census_model.to_gbq(
    your_model_id,  # For example: "your-project.census.census_model"
    replace=True,
)

Avalie o desempenho do modelo

Depois de criar o modelo, avalie o respetivo desempenho em função dos dados de avaliação.

SQL

A função ML.EVALUATE avalia os valores previstos gerados pelo modelo em comparação com os dados de avaliação.

Para a entrada, a função ML.EVALUATE usa o modelo preparado e as linhas da vista input_data que têm evaluation como o valor da coluna dataframe. A função devolve uma única linha de estatísticas sobre o modelo.

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 `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'
      )
    );
  3. Os resultados têm um aspeto semelhante ao seguinte:

    Resultado de ML.EVALUATE

DataFrames do BigQuery

Use o método score para avaliar o modelo em função dos dados reais.

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 model you'll use for predictions. `read_gbq_model` loads model
# data from BigQuery, but you could also use the `census_model` object
# from previous steps.
census_model = bpd.read_gbq_model(
    your_model_id,  # For example: "your-project.census.census_model"
)

# input_data is defined in an earlier step.
evaluation_data = input_data[input_data["dataframe"] == "evaluation"]
X = evaluation_data.drop(columns=["income_bracket", "dataframe"])
y = evaluation_data["income_bracket"]

# The score() method evaluates how the model performs compared to the
# actual data. Output DataFrame matches that of ML.EVALUATE().
score = census_model.score(X, y)
score.peek()
# Output:
#    precision    recall  accuracy  f1_score  log_loss   roc_auc
# 0   0.685764  0.536685   0.83819  0.602134  0.350417  0.882953

Também pode consultar o painel Avaliação do modelo na Google Cloud consola para ver as métricas de avaliação calculadas durante a preparação:

Resultado de ML.EVALUATE

Preveja o intervalo de rendimento

Use o modelo para prever o intervalo de rendimentos mais provável para cada participante.

SQL

Use a função ML.PREDICT para fazer previsões sobre a faixa de rendimentos provável. Para a entrada, a função ML.PREDICT usa o modelo preparado e as linhas da vista input_data que têm prediction como valor da coluna dataframe.

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 `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'prediction'
      )
    );
  3. Os resultados têm um aspeto semelhante ao seguinte:

    Resultados de ML.PREDICT

A coluna predicted_income_bracket contém o intervalo de rendimento previsto para o respondente.

DataFrames do BigQuery

Use o método predict para fazer previsões sobre a faixa de rendimento provável.

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 model you'll use for predictions. `read_gbq_model` loads model
# data from BigQuery, but you could also use the `census_model` object
# from previous steps.
census_model = bpd.read_gbq_model(
    your_model_id,  # For example: "your-project.census.census_model"
)

# input_data is defined in an earlier step.
prediction_data = input_data[input_data["dataframe"] == "prediction"]

predictions = census_model.predict(prediction_data)
predictions.peek()
# Output:
#           predicted_income_bracket                     predicted_income_bracket_probs  age workclass  ... occupation  hours_per_week income_bracket   dataframe
# 18004                    <=50K  [{'label': ' >50K', 'prob': 0.0763305999358786...   75         ?  ...          ?               6          <=50K  prediction
# 18886                    <=50K  [{'label': ' >50K', 'prob': 0.0448866871906495...   73         ?  ...          ?              22           >50K  prediction
# 31024                    <=50K  [{'label': ' >50K', 'prob': 0.0362982319421936...   69         ?  ...          ?               1          <=50K  prediction
# 31022                    <=50K  [{'label': ' >50K', 'prob': 0.0787836112058324...   75         ?  ...          ?               5          <=50K  prediction
# 23295                    <=50K  [{'label': ' >50K', 'prob': 0.3385373037905673...   78         ?  ...          ?              32          <=50K  prediction

Explique os resultados da previsão

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. Para mais informações acerca da explicabilidade, 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

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

    SELECT
    *
    FROM
    ML.EXPLAIN_PREDICT(MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'),
      STRUCT(3 as top_k_features));
  3. Os resultados têm um aspeto semelhante ao seguinte:

    Saída ML.EXPLAIN_PREDICT

Para modelos de regressão logística, os valores de Shapley são usados para determinar a atribuição de caraterísticas relativa para cada caraterística no modelo. Uma vez que a opção foi definida como top_k_features na consulta, 3 produz as três principais atribuições de funcionalidades para cada linha da vista ML.EXPLAIN_PREDICT.input_data Estas atribuições são apresentadas por ordem descendente do valor absoluto da atribuição.

Explicar o modelo globalmente

Para saber que funcionalidades são mais importantes para determinar o intervalo de rendimentos, use a função ML.GLOBAL_EXPLAIN.

Obtenha explicações globais para o modelo:

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

    Aceda ao BigQuery

  2. No editor de consultas, execute a seguinte consulta para obter explicações globais:

    SELECT
      *
    FROM
      ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
  3. Os resultados têm um aspeto semelhante ao seguinte:

    Saída ML.GLOBAL_EXPLAIN

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.

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 de censos que criou.

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

  4. Na caixa de diálogo Eliminar conjunto de dados, confirme o comando de eliminação escrevendo o nome do conjunto de dados (census) 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?