Criar e usar um modelo de classificação em dados de censo


Neste tutorial, você usa um modelo de regressão logística binário no BigQuery ML para prever a faixa de renda de indivíduos com base nos dados demográficos deles. Um modelo de regressão logística binária prevê se um valor se enquadra em uma das duas categorias. Nesse caso, se a renda anual de um indivíduo fica acima ou abaixo de US$ 50.000.

Neste tutorial, usamos o conjunto de dados bigquery-public-data.ml_datasets.census_adult_income. Esse conjunto contém as informações demográficas e de renda de residentes dos EUA entre 2000 e 2010.

Objetivos

Neste tutorial, você realizará as seguintes tarefas:

  • Criar um modelo de regressão logística
  • Avaliar o modelo.
  • Fazer previsões usando o modelo.
  • Explicar os resultados produzidos pelo modelo.

Custos

Neste tutorial, usamos componentes faturáveis do Trusted Cloud by S3NS, incluindo:

  • 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 Trusted Cloud console, on the project selector page, select or create a Trusted Cloud project.

    Go to project selector

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

  3. Enable the BigQuery API.

    Enable the API

Permissões necessárias

Para criar o modelo usando o BigQuery ML, você precisa das seguintes permissões do IAM:

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

Para executar a inferência, você precisa das seguintes permissões:

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

Introdução

Uma tarefa comum do aprendizado de máquina é a classificação dos dados em um de dois tipos, conhecidos como rótulos. Por exemplo, talvez um revendedor queira prever se determinado cliente comprará um novo produto com base em outras informações sobre essa pessoa. Nesse caso, os dois rótulos podem ser will buy e won't buy. O varejista pode criar um conjunto de dados em que uma coluna represente os dois rótulos e também contenha informações do cliente, como localização do cliente, compras anteriores e preferências informadas. O varejista pode usar um modelo de regressão logística binária que usa as informações desses clientes para prever qual rótulo representa melhor cada cliente.

Neste tutorial, você cria um modelo de regressão logística binária que prevê se a renda de um entrevistado do censo dos EUA se enquadra em uma das duas faixas com base nos atributos demográficos do entrevistado.

Criar um conjunto de dados

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

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

    Acessar o BigQuery

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

  3. Clique em Conferir 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 census.

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

      Os conjuntos de dados públicos são armazenados na multirregião US. Para simplificar, armazene seus conjuntos de dados no mesmo local.

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

analise os dados

Analise o conjunto de dados e identifique quais colunas usar como dados de treinamento para o modelo de regressão logística. Selecione 100 linhas da tabela census_adult_income:

SQL

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

    Acessar o BigQuery

  2. No editor de consultas, execute a seguinte consulta do 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 são semelhantes aos seguintes:

    Dados do censo

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 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 dos dois valores: <=50K ou >50K.

Preparar os dados de amostra

Neste tutorial, você prevê a renda dos entrevistados do censo com base nos valores das seguintes colunas na tabela census_adult_income:

  • age: a idade do entrevistado.
  • workclass: classe de trabalho realizado. Por exemplo, governo local, particular ou autônomo.
  • marital_status
  • education_num: o nível de escolaridade mais alto do participante.
  • occupation
  • hours_per_week: horas trabalhadas por semana.

Você 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 de censo acredita que uma linha específica representa. Como o valor dessa coluna não está relacionado ao valor de income_bracket para qualquer linha, use o valor nessa coluna para separar os dados em conjuntos de treinamento, avaliação e previsão criando uma nova coluna dataframe derivada da coluna functional_weight. Você rotula 80% dos dados para treinamento do modelo, 10% para avaliação e 10% para previsão.

SQL

Crie uma visualização com os dados de amostra. Essa visualização é usada pela instrução CREATE MODEL posteriormente neste tutorial.

Execute a consulta que prepara os dados de amostra:

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

    Acessar o BigQuery

  2. No Editor de consultas, execute esta 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. Confira os dados de amostra:

    SELECT * FROM `census.input_data`;

BigQuery DataFrames

Crie um DataFrame chamado input_data. Você usará input_data posteriormente neste tutorial para treinar o modelo, avaliá-lo e fazer previsões.

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 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"]

Criar um modelo de regressão logística

Crie um modelo de regressão logística com os dados de treinamento rotulados na seção anterior.

SQL

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

Confira abaixo informações úteis sobre a instrução CREATE MODEL:

  • A opção input_label_cols especifica qual coluna na instrução SELECT deve ser usada como a coluna de rótulo. Aqui, a coluna de rótulo é income_bracket, então 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 qual tipo de modelo treinar com base no número de valores exclusivos na coluna de rótulos.

  • A opção auto_class_weights está definida como TRUE para equilibrar os rótulos de classe nos dados de treinamento. Por padrão, os dados de treinamento não são ponderados. Se os rótulos nos dados de treinamento estiverem desequilibrados, o modelo poderá aprender a prever a classe mais comum de rótulos com mais intensidade. Nesse caso, a maioria dos entrevistados no conjunto de dados está na faixa de renda mais baixa. Isso pode levar a um modelo que prevê a faixa de renda mais baixa de maneira exagerada. Os pesos das classes equilibram os rótulos. Isso é feito por meio do cálculo dos pesos de cada classe em proporção inversa à frequência dessa classe.

  • A opção enable_global_explain é definida como TRUE para permitir que você use a função ML.GLOBAL_EXPLAIN no modelo mais adiante no tutorial.

  • A instrução SELECT consulta a visualização input_data que contém os dados de amostra. A cláusula WHERE filtra as linhas para que apenas as linhas rotuladas como dados de treinamento sejam usadas para treinar o modelo.

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

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

    Acessar o BigQuery

  2. No Editor de consultas, execute esta 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 Explorer, 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. A guia Detalhes lista os atributos que o BigQuery ML usou para realizar a regressão logística.

BigQuery DataFrames

Use o método fit para treinar o modelo e o método to_gbq para salvá-lo no seu conjunto de dados ,

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 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,
)

Avaliar o desempenho do modelo

Depois de criar o modelo, avalie o desempenho dele em relação aos dados de avaliação.

SQL

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

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

Execute a consulta ML.EVALUATE:

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

    Acessar o BigQuery

  2. No Editor de consultas, execute esta consulta:

    SELECT
    *
    FROM
    ML.EVALUATE (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'
      )
    );
  3. Os resultados são semelhantes aos seguintes:

    Saída de ML.EVALUATE

BigQuery DataFrames

Use o método score para avaliar o modelo com os dados reais.

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.

# 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 é possível consultar o painel Avaliação do modelo no console Trusted Cloud para conferir as métricas de avaliação calculadas durante o treinamento:

Saída de ML.EVALUATE

Prever a faixa de renda

Use o modelo para prever a faixa de renda mais provável de cada entrevistado.

SQL

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

Execute a consulta ML.PREDICT:

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

    Acessar o BigQuery

  2. No Editor de consultas, execute esta consulta:

    SELECT
    *
    FROM
    ML.PREDICT (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'prediction'
      )
    );
  3. Os resultados são semelhantes aos seguintes:

    Resultados de ML.PREDICT

A coluna predicted_income_bracket contém a faixa de renda prevista para o entrevistado.

BigQuery DataFrames

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

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.

# 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

Explicar os resultados da previsão

Para entender por que o modelo está gerando esses resultados de previsão, use a função ML.EXPLAIN_PREDICT.

ML.EXPLAIN_PREDICT é uma versão estendida da função ML.PREDICT. ML.EXPLAIN_PREDICT não apenas gera resultados de previsão, mas também gera colunas extras para explicar os resultados da previsão. Para mais informações sobre explicabilidade, consulte Visão geral da IA explicável do BigQuery ML.

Execute a consulta ML.EXPLAIN_PREDICT:

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

    Acessar o BigQuery

  2. No Editor de consultas, execute esta 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 são semelhantes aos seguintes:

    Saída MML.EXPLAIN_PREDICT

Para modelos de regressão logística, os valores de Shapley são usados para determinar a atribuição relativa de recursos para cada recurso no modelo. Como a opção top_k_features foi definida como 3 na consulta, ML.EXPLAIN_PREDICT gera as três principais atribuições de recursos para cada linha da visualização input_data. Essas atribuições são mostradas em ordem decrescente pelo valor absoluto da atribuição.

Explicar o modelo globalmente

Para saber quais recursos são os mais importantes para determinar a faixa de renda, use a função ML.GLOBAL_EXPLAIN.

Receba explicações globais para o modelo:

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

    Acessar o BigQuery

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

    SELECT
      *
    FROM
      ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
  3. Os resultados são semelhantes aos seguintes:

    Saída ML.GLOBAL_EXPLAIN

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Excluir o conjunto de dados

A exclusão do seu projeto removerá todos os conjuntos de dados e tabelas no projeto. Caso prefira reutilizá-lo, exclua o conjunto de dados criado neste tutorial:

  1. Se necessário, abra a página do BigQuery no console doTrusted Cloud .

    Acesse a página do BigQuery

  2. Na navegação, clique no conjunto de dados do census que você criou.

  3. Clique em Excluir conjunto de dados no lado direito da janela. Essa ação exclui o conjunto de dados e o modelo.

  4. Na caixa de diálogo Excluir conjunto de dados, confirme o comando de exclusão digitando o nome do seu conjunto de dados (census). Em seguida, clique em Excluir.

Excluir o projeto

Para excluir o projeto:

  1. In the Trusted 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.

A seguir