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. Ejecuta una consulta de GoogleSQL para mostrar 100 filas de la tabla census_adult_income:

  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
      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ía ser similar al siguiente:

    Datos del censo

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 hacerlo, debes crear una vista que contenga los datos que se usarán para entrenar y evaluar el modelo, y también para hacer predicciones. La declaración CREATE MODEL usa esta vista más adelante en este instructivo.

La consulta que crea la vista extrae datos de los encuestados del censo, como education_num, que representa el nivel de educación del encuestado; y workclass, que representa el tipo de trabajo que realiza el encuestado. Esta consulta excluye varias columnas que duplican datos, por ejemplo, las columnas education y education_num de la tabla census_adult_income expresan los mismos datos en formatos diferentes, por lo que esta consulta excluye la columna education. Se crea una columna dataframe nueva que usa la columna functional_weight de la tabla census_adult_income para etiquetar el 80% de la fuente de datos para entrenar el modelo y reserva los datos restantes para la evaluación y predicción.

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

Crea un modelo de regresión logística

Crea un modelo de regresión logística usando la declaración CREATE MODEL y especificando LOGISTIC_REG para el tipo de modelo. Parte de la creación del modelo incluye el entrenamiento del modelo con los datos de entrenamiento que etiquetaste en la sección anterior.

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

Usa la función ML.EVALUATE para evaluar el modelo

Después de crear el modelo, evalúa su rendimiento mediante la función ML.EVALUATE. 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 debería ser similar al siguiente:

    Salida de ML.EVALUATE

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

Usa la función ML.PREDICT para predecir el rango de ingresos

Para identificar el rango de ingresos al que pertenece un encuestado en particular, usa la función ML.PREDICT.

Como entrada, la función ML.PREDICT toma el modelo entrenado y las filas de la vista input_data que tienen prediction como el valor de la 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 debería ser similar al siguiente:

    Resultados de ML.PREDICT

    predicted_income_bracket es el valor previsto de income_bracket.

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 debería ser similar al siguiente:

    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 estableció en 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 debería ser similar al siguiente:

    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