Compila y usa un modelo de clasificación sobre datos censales


En este instructivo, usarás un modelo de regresión logística binario en BigQuery ML para predecir el rango de ingresos de las personas según sus datos demográficos. Un modelo de regresión logística binaria predice si un valor pertenece a una de dos categorías, en este caso si el ingreso anual de un individuo es superior o inferior a $50,000.

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

Objetivos

En este instructivo, realizarás las siguientes tareas:

  • Crearás un modelo de regresión logística.
  • Evalúa el modelo.
  • Haz predicciones mediante el modelo.
  • Explica los resultados que generó el modelo.

Costos

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

  • BigQuery
  • BigQuery ML

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

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

Antes de comenzar

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  3. Habilita la API de BigQuery.

    Habilita la API

Permisos necesarios

Para crear el modelo con BigQuery ML, necesitas los siguientes permisos de IAM:

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

Para ejecutar inferencias, necesitas los siguientes permisos:

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

Introducción

Una tarea común con el aprendizaje automático es clasificar los datos en uno de dos tipos, conocidos como etiquetas. Por ejemplo, es posible que un minorista quiera predecir si un cliente determinado comprará un producto nuevo 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 minorista puede crear un conjunto de datos de modo que una columna represente ambas etiquetas y también contenga información del cliente, como la ubicación del cliente, sus compras anteriores y las preferencias informadas. Luego, el minorista puede usar un modelo de regresión logística binaria que use esta información del cliente para predecir qué etiqueta representa mejor a cada cliente.

En este instructivo, crearás un modelo de regresión logística binaria que predice si el ingreso de un encuestado del censo de EE.UU. se encuentra en uno de dos rangos según los atributos demográficos del encuestado.

Crea un conjunto de datos

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

  1. En la consola de Google Cloud, ve a la página de 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.

    Crea un conjunto de datos.

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

    • En ID del conjunto de datos, ingresa census.

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

      Los conjuntos de datos públicos se almacenan en la multirregión US. Para que sea más simple, almacena tu conjunto de datos en la misma ubicación.

    • Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.

Examina los datos

Examina el conjunto de datos y, luego, identifica qué columnas 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 consola de Google Cloud, ve a la página de 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 son similares a los siguientes:

    Datos del censo

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames 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 BigQuery DataFrames.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para 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 tiene solo uno de dos valores: <=50K o >50K. La columna functional_weight es la cantidad de personas que la organización del censo cree que representa una fila en particular. Los valores de esta columna no están relacionados con el valor de income_bracket de una fila en particular.

Prepara los datos de muestra

En este instructivo, predecirás el ingreso del encuestado del censo en función de los siguientes atributos:

  • Edad
  • Tipo de trabajo realizado
  • Estado civil
  • Nivel de educación
  • Ocupación
  • Horas trabajadas por semana

Para crear esta predicción, deberás extraer información de los datos de los encuestados del censo en la tabla census_adult_income. Selecciona las columnas de atributos, que incluyen lo siguiente:

  • education_num, que representa el nivel de educación del encuestado
  • workclass, que representa el tipo de trabajo que realiza el encuestado

Excluye las columnas que dupliquen los datos. Por ejemplo:

  • education, ya que education y education_num expresan los mismos datos en diferentes formatos.

Separa los datos en conjuntos de entrenamiento, evaluación y predicción mediante la creación de una nueva columna dataframe derivada de la columna functional_weight. Etiqueta el 80% de la fuente de datos a fin de entrenar el modelo y reserva el 20% restante de los datos para la evaluación y predicción.

SQL

Para preparar tus datos de muestra, crea una vista que contenga los datos de entrenamiento. La declaración CREATE MODEL usa esta vista más adelante en este instructivo.

Ejecuta la consulta que prepara los datos de muestra:

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

    Ir a BigQuery

  2. En el Editor de consultas, ejecute 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. En el panel Explorador, expande el conjunto de datos census y ubica la vista input_data.

  4. Haz clic en el nombre de la vista para abrir el panel de información. El esquema de la vista aparece en la pestaña Esquema.

Resultados de la consulta

BigQuery DataFrames

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

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames 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 BigQuery DataFrames.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para 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"]

Crea un modelo de regresión logística

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

SQL

Usa la sentencia CREATE MODEL y especifica LOGISTIC_REG para el tipo de modelo

La siguiente información es útil para saber sobre la declaración CREATE MODEL:

  • La opción input_label_cols especifica qué columna de la declaración SELECT se usará como columna de la etiqueta. Aquí, la columna de la etiqueta 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 según los otros valores presentes en esa fila.

  • No es necesario especificar si un modelo de regresión logística es binario o multiclase. BigQuery puede determinar qué tipo de modelo entrenar en función de la cantidad de valores únicos en la columna de etiqueta.

  • La opción auto_class_weights se establece en TRUE para balancear las etiquetas de clase en los datos de entrenamiento. De forma predeterminada, los datos de entrenamiento no están ponderados. Si las etiquetas en los datos de entrenamiento están desequilibradas, el modelo puede aprender a predecir en mayor medida la clase de etiquetas más popular. En este caso, la mayoría de los encuestados en el conjunto de datos están en el segmento de ingresos más bajos. Esto puede ocasionar que un modelo prediga el rango de ingresos más bajos con demasiada frecuencia. 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 declaración SELECT consulta la vista input_data que contiene los datos de entrenamiento. La cláusula WHERE filtra las filas en input_data de modo que solo se usen para entrenar el modelo aquellas filas etiquetadas como datos de entrenamiento.

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

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

    Ir a BigQuery

  2. En el Editor de consultas, ejecute la siguiente consulta:

    CREATE OR REPLACE MODEL
    `census.census_model`
    OPTIONS
    ( model_type='LOGISTIC_REG',
      auto_class_weights=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, expande el conjunto de datos census y, luego, la carpeta Modelos.

  4. Haz clic en el modelo census_model para abrir el panel de información.

  5. Haz clic en la pestaña Esquema. El esquema del modelo enumera los atributos que BigQuery ML usó para realizar la regresión logística. El esquema debería ser similar al siguiente:

Información de esquema del clúster

BigQuery DataFrames

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

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames 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 BigQuery DataFrames.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para 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,
)

Evalúa el rendimiento del modelo

Después de crear el modelo, evalúa su rendimiento en comparación con los datos reales.

SQL

La función ML.EVALUATE evalúa los valores previstos que generó el modelo con los datos reales.

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

Ejecuta la consulta ML.EVALUATE:

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

    Ir a BigQuery

  2. En el Editor de consultas, ejecute la siguiente consulta:

    SELECT
    *
    FROM
    ML.EVALUATE (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'
      )
    )
    
  3. Los resultados son 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 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 BigQuery DataFrames.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para 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 ver el panel de información del modelo en la consola de Google Cloud para ver las métricas de evaluación calculadas durante el entrenamiento:

Salida de ML.EVALUATE

Predice el rango de ingresos

Identifica el rango de ingresos al que es probable que un encuestado en particular pertenezca al modelo.

SQL

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

Ejecuta la consulta ML.PREDICT:

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

    Ir a BigQuery

  2. En el Editor de consultas, ejecute la siguiente consulta:

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

    Resultados de ML.PREDICT

predicted_income_bracket es el valor previsto de income_bracket.

BigQuery DataFrames

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

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames 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 BigQuery DataFrames.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para 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

Explica los resultados de la predicción

Para comprender 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 extendida de la función ML.PREDICT. ML.EXPLAIN_PREDICT no solo genera resultados de predicción, sino también columnas adicionales para explicar los resultados de la predicción. En la práctica, puedes ejecutar ML.EXPLAIN_PREDICT en lugar de ML.PREDICT. Para obtener más información, consulta la descripción general de Explainable AI para BigQuery ML.

Ejecuta la consulta ML.EXPLAIN_PREDICT:

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

    Ir a BigQuery

  2. En el Editor de consultas, ejecute 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 son similares a los siguientes:

    Resultado de ML.EXPLAIN_PREDICT

En el caso de los modelos de regresión logística, los valores de Shapley se usan a fin de generar valores de atribución de atributos para cada atributo del modelo. ML.EXPLAIN_PREDICT genera las tres atribuciones de atributos principales por fila de la vista input_data porque top_k_features se configuró como 3 en la consulta. Estas atribuciones se ordenan por el valor absoluto de la atribución en orden descendente. En la fila 1 de este ejemplo, el atributo hours_per_week contribuyó más a la predicción general, pero en la fila 2, occupation fue el que más contribuyó a la predicción general.

Explica el modelo de forma global

Para saber qué características suelen ser las más importantes para determinar el rango de ingresos, puedes usar la función ML.GLOBAL_EXPLAIN. Para usar ML.GLOBAL_EXPLAIN, debes volver a entrenar el modelo con la opción ENABLE_GLOBAL_EXPLAIN configurada como TRUE.

Vuelve a entrenar y obtén explicaciones globales para el modelo:

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

    Ir a BigQuery

  2. En el Editor de consultas, ejecuta la siguiente consulta para volver a entrenar el modelo:

    CREATE OR REPLACE MODEL `census.census_model`
    OPTIONS
      ( model_type='LOGISTIC_REG',
        auto_class_weights=TRUE,
        enable_global_explain=TRUE,
        input_label_cols=['income_bracket']
      ) AS
    SELECT * EXCEPT(dataframe)
    FROM
      `census.input_data`
    WHERE
      dataframe = 'training'
    
  3. En el Editor de consultas, ejecuta la siguiente consulta para obtener explicaciones globales:

    SELECT
      *
    FROM
      ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
    
  4. Los resultados son similares a los siguientes:

    Resultado de ML.GLOBAL_EXPLAIN

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra tu conjunto de datos

Borrar tu proyecto quita todos sus conjuntos de datos y tablas. Si prefieres volver a usar el proyecto, puedes borrar el conjunto de datos que creaste en este instructivo:

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

    Ir a la página de BigQuery

  2. En la navegación, haz clic en el conjunto de datos census que creaste.

  3. Haz clic en Borrar conjunto de datos en el lado derecho de la ventana. Esta acción borra el conjunto de datos y el modelo.

  4. En el cuadro de diálogo Borrar conjunto de datos, ingresa el nombre del conjunto de datos (census) y, luego, haz clic en Borrar para confirmar el comando de borrado.

Borra tu proyecto

Para borrar el proyecto, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Próximos pasos