Crear y usar un modelo de clasificación a partir de datos censales


En este tutorial, usarás un modelo de regresión logística binario en BigQuery ML para predecir el intervalo de ingresos de las personas en función de sus datos demográficos. Un modelo de regresión logística binaria predice si un valor se incluye en una de las dos categorías. En este caso, se trata de determinar si los ingresos anuales de una persona son superiores o inferiores a 50.000 USD.

En este tutorial se usa el conjunto de datos bigquery-public-data.ml_datasets.census_adult_income. Este conjunto de datos contiene información demográfica y sobre ingresos de residentes de EE. UU. de los años 2000 y 2010.

Objetivos

En este tutorial, realizarás las siguientes tareas:

  • Crea un modelo de regresión logística.
  • Evalúa el modelo.
  • Hacer predicciones con el modelo.
  • Explica los resultados que ha producido el modelo.

Costes

En este tutorial se usan componentes facturables de Google Cloud, incluidos los siguientes:

  • BigQuery
  • BigQuery ML

Para obtener más información sobre los costes de BigQuery, consulta la página de precios de BigQuery.

Para obtener más información sobre los costes de BigQuery ML, consulta los precios de BigQuery ML.

Antes de empezar

  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

Permisos obligatorios

Para crear el modelo con BigQuery ML, necesita los siguientes permisos de gestión de identidades y accesos:

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

Para ejecutar la inferencia, necesitas los siguientes permisos:

  • bigquery.models.getData en el modelo
  • bigquery.jobs.create

Introducción

Una tarea habitual en el aprendizaje automático es clasificar los datos en uno de los dos tipos, conocidos como etiquetas. Por ejemplo, un comercio podría querer predecir si un cliente concreto comprará un nuevo producto en función de otra información sobre ese cliente. En ese caso, las dos etiquetas podrían ser will buy y won't buy. El comercio puede crear un conjunto de datos de forma que una columna represente ambas etiquetas y también contenga información del cliente, como su ubicación, sus compras anteriores y sus preferencias declaradas. El comercio puede usar un modelo de regresión logística binaria que utilice esta información del cliente para predecir qué etiqueta representa mejor a cada cliente.

En este tutorial, crearás un modelo de regresión logística binaria que predice si los ingresos de una persona que ha respondido al censo de EE. UU. se encuentran en uno de los dos intervalos en función de los atributos demográficos de esa persona.

Crear conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, haz clic en el nombre de tu proyecto.

  3. Haz clic en Ver acciones > Crear conjunto de datos.

  4. En la página Crear conjunto de datos, haz lo siguiente:

    • En ID del conjunto de datos, introduce census.

    • En Tipo de ubicación, selecciona Multirregión y, a continuación, EE. UU. (varias regiones de Estados Unidos).

      Los conjuntos de datos públicos se almacenan en la US multirregión. Para simplificar el proceso, almacena el conjunto de datos en la misma ubicación.

    • Deje el resto de los ajustes predeterminados tal como están y haga clic en Crear conjunto de datos.

Examina los datos

Examina el conjunto de datos e identifica las columnas que se van a usar como datos de entrenamiento para el modelo de regresión logística. Selecciona 100 filas de la tabla census_adult_income:

SQL

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente consulta de 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. Los resultados deberían ser similares a los siguientes:

    Datos del censo

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo 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

Los resultados de la consulta muestran que la columna income_bracket de la tabla census_adult_income solo tiene uno de estos dos valores: <=50K o >50K.

Preparar los datos de muestra

En este tutorial, predecirás los ingresos de los participantes del censo en función de los valores de las siguientes columnas de la tabla census_adult_income:

  • age: la edad del encuestado.
  • workclass: clase de trabajo realizado. Por ejemplo, administración local, privada o autónomo.
  • marital_status
  • education_num: el nivel de estudios más alto del encuestado.
  • occupation
  • hours_per_week: horas trabajadas a la semana.

Excluye las columnas que duplican datos. Por ejemplo, la columna education, ya que los valores de las columnas education y education_num expresan los mismos datos en formatos diferentes.

La columna functional_weight es el número de personas que la organización del censo cree que representa una fila concreta. Como el valor de esta columna no está relacionado con el valor de income_bracket de ninguna fila, puede usar el valor de esta columna para separar los datos en conjuntos de entrenamiento, evaluación y predicción. Para ello, cree una columna dataframe derivada de la columna functional_weight. Etiqueta el 80% de los datos para entrenar el modelo, el 10% para la evaluación y el 10% para la predicción.

SQL

Crea una vista con los datos de muestra. Esta vista se usa en la instrucción CREATE MODEL más adelante en este tutorial.

Ejecuta la consulta que prepara los datos de muestra:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente 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. Consulta los datos de muestra:

    SELECT * FROM `census.input_data`;

BigQuery DataFrames

Crea un DataFrame llamado input_data. Usarás input_data más adelante en este tutorial para entrenar el modelo, evaluarlo y hacer predicciones.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo 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"]

Crear un modelo de regresión logística

Crea un modelo de regresión logística con los datos de entrenamiento que has etiquetado en la sección anterior.

SQL

Usa la instrucción CREATE MODEL y especifica LOGISTIC_REG para el tipo de modelo.

A continuación, se indican algunos aspectos útiles sobre la instrucción CREATE MODEL:

  • La opción input_label_cols especifica qué columna de la instrucción SELECT se debe usar como columna de etiqueta. En este caso, la columna de etiquetas es income_bracket, por lo que el modelo aprende cuál de los dos valores de income_bracket es más probable para una fila determinada en función de los demás valores presentes en esa fila.

  • No es necesario especificar si un modelo de regresión logística es binario o multiclase. BigQuery ML determina qué tipo de modelo se va a entrenar en función del número de valores únicos de la columna de etiquetas.

  • La opción auto_class_weights se ha definido como TRUE para equilibrar las etiquetas de clase en los datos de entrenamiento. De forma predeterminada, los datos de entrenamiento no tienen ponderación. Si las etiquetas de los datos de entrenamiento están desequilibradas, el modelo puede aprender a predecir la clase de etiquetas más popular con más intensidad. En este caso, la mayoría de los encuestados del conjunto de datos se encuentran en el tramo de ingresos más bajo. Esto puede llevar a un modelo que prediga demasiado la categoría de ingresos más baja. Los pesos de clase equilibran las etiquetas de clase calculando los pesos de cada clase en proporción inversa a la frecuencia de esa clase.

  • La opción enable_global_explain tiene el valor TRUE para que puedas usar la función ML.GLOBAL_EXPLAIN en el modelo más adelante en el tutorial.

  • La instrucción SELECT consulta la vista input_data, que contiene los datos de ejemplo. La cláusula WHERE filtra las filas para que solo se usen las filas etiquetadas como datos de entrenamiento para entrenar el modelo.

Ejecuta la consulta que crea tu modelo de regresión logística:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente 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. En el panel Explorador, haga clic en Conjuntos de datos.

  4. En el panel Conjuntos de datos, haz clic en census.

  5. Haz clic en el panel Modelos.

  6. Haz clic en census_model.

  7. En la pestaña Detalles se muestran los atributos que BigQuery ML ha usado para realizar la regresión logística.

BigQuery DataFrames

Usa el método fit para entrenar el modelo y el método to_gbq para guardarlo en tu conjunto de datos.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo 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,
)

Evaluar el rendimiento del modelo

Después de crear el modelo, evalúa su rendimiento en función de los datos de evaluación.

SQL

La función ML.EVALUATE evalúa los valores predichos generados por el modelo en comparación con los datos de evaluación.

Como entrada, la función ML.EVALUATE toma el modelo entrenado y las filas de la vista input_data que tienen evaluation como valor de la columna dataframe. La función devuelve una sola fila de estadísticas sobre el modelo.

Ejecuta la consulta ML.EVALUATE:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente consulta:

    SELECT
    *
    FROM
    ML.EVALUATE (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'
      )
    );
  3. Los resultados deberían ser similares a los siguientes:

    Salida de ML.EVALUATE

BigQuery DataFrames

Usa el método score para evaluar el modelo con los datos reales.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo 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

También puedes consultar el panel Evaluación del modelo en la Google Cloud consola para ver las métricas de evaluación calculadas durante el entrenamiento:

Salida de ML.EVALUATE

Predecir la franja de ingresos

Usa el modelo para predecir el tramo de ingresos más probable de cada encuestado.

SQL

Usa la función ML.PREDICT para hacer predicciones sobre el tramo de ingresos probable. Como entrada, la función ML.PREDICT toma el modelo entrenado y las filas de la vista input_data que tienen prediction como valor de la columna dataframe.

Ejecuta la consulta ML.PREDICT:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente consulta:

    SELECT
    *
    FROM
    ML.PREDICT (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'prediction'
      )
    );
  3. Los resultados deberían ser similares a los siguientes:

    Resultados de ML.PREDICT

La columna predicted_income_bracket contiene el tramo de ingresos previsto del encuestado.

BigQuery DataFrames

Usa el método predict para hacer predicciones sobre el tramo de ingresos probable.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo 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 los resultados de la predicción

Para saber por qué el modelo genera estos resultados de predicción, puedes usar la función ML.EXPLAIN_PREDICT.

ML.EXPLAIN_PREDICT es una versión ampliada de la función ML.PREDICT. ML.EXPLAIN_PREDICT no solo genera resultados de predicción, sino que también genera columnas adicionales para explicar los resultados de predicción. Para obtener más información sobre la interpretabilidad, consulta la información general sobre la IA interpretable de BigQuery ML.

Ejecuta la consulta ML.EXPLAIN_PREDICT:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente 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. Los resultados deberían ser similares a los siguientes:

    Resultado de ML.EXPLAIN_PREDICT

En los modelos de regresión logística, los valores de Shapley se usan para determinar la atribución relativa de cada característica del modelo. Como la opción top_k_features se ha definido como 3 en la consulta, ML.EXPLAIN_PREDICT muestra las tres principales atribuciones de la función de cada fila de la vista input_data. Estas atribuciones se muestran en orden descendente según el valor absoluto de la atribución.

Explica el modelo de forma global

Para saber qué características son las más importantes para determinar la franja de ingresos, usa la función ML.GLOBAL_EXPLAIN.

Obtener explicaciones globales del modelo:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente consulta para obtener explicaciones globales:

    SELECT
      *
    FROM
      ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
  3. Los resultados deberían ser similares a los siguientes:

    Resultado de ML.GLOBAL_EXPLAIN

Limpieza

Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

Eliminar un conjunto de datos

Si eliminas un proyecto, se eliminarán todos los conjuntos de datos y todas las tablas que contenga. Si prefieres reutilizar el proyecto, puedes eliminar el conjunto de datos que has creado en este tutorial:

  1. Si es necesario, abre la página de BigQuery en laGoogle Cloud consola.

    Ir a la página de BigQuery

  2. En el menú de navegación, haga clic en el conjunto de datos census que ha creado.

  3. Haz clic en Eliminar conjunto de datos, en la parte derecha de la ventana. Esta acción elimina el conjunto de datos y el modelo.

  4. En el cuadro de diálogo Eliminar conjunto de datos, confirma el comando de eliminación escribiendo el nombre de tu conjunto de datos (census) y, a continuación, haz clic en Eliminar.

Eliminar un proyecto

Para ello, sigue las instrucciones que aparecen a continuación:

  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.

Siguientes pasos

  • Para obtener una descripción general de BigQuery ML, consulta la introducción a BigQuery ML.
  • Para obtener información sobre cómo crear modelos, consulta la página de sintaxis de CREATE MODEL.