Usar BigQuery ML para predecir el peso de los pingüinos


En este tutorial, usarás un modelo de regresión lineal en BigQuery ML para predecir el peso de un pingüino en función de su información demográfica. Una regresión lineal es un tipo de modelo de regresión que genera un valor continuo a partir de una combinación lineal de las características de entrada.

En este tutorial se usa el conjunto de datos bigquery-public-data.ml_datasets.penguins.

Objetivos

En este tutorial, realizarás las siguientes tareas:

  • Crea un modelo de regresión lineal.
  • Evalúa el modelo.
  • Hacer predicciones con 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

Crear conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.

Consola

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

    Ir a la página de BigQuery

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

  3. Haga 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 bqml_tutorial.

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

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

bq

Para crear un conjunto de datos, usa el comando bq mk con la marca --location. Para ver una lista completa de los parámetros posibles, consulta la referencia del comando bq mk --dataset.

  1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos definida como US y la descripción BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    En lugar de usar la marca --dataset, el comando usa el acceso directo -d. Si omite -d y --dataset, el comando creará un conjunto de datos de forma predeterminada.

  2. Confirma que se ha creado el conjunto de datos:

    bq ls

API

Llama al método datasets.insert con un recurso de conjunto de datos definido.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

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 google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Crear el modelo

Crea un modelo de regresión lineal con el conjunto de datos de muestra de Analytics para BigQuery.

SQL

Puedes crear un modelo de regresión lineal usando la sentencia CREATE MODEL y especificando LINEAR_REG para el tipo de modelo. La creación del modelo incluye el entrenamiento del 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 etiquetas. En este caso, la columna de etiquetas es body_mass_g. En el caso de los modelos de regresión lineal, la columna de etiquetas debe tener valores reales, es decir, los valores de la columna deben ser números reales.
  • La instrucción SELECT de esta consulta usa las siguientes columnas de la tabla bigquery-public-data.ml_datasets.penguins para predecir el peso de un pingüino:

    • species: la especie de pingüino.
    • island: la isla en la que reside el pingüino.
    • culmen_length_mm: longitud del culmen del pingüino en milímetros.
    • culmen_depth_mm: la profundidad del culmen del pingüino en milímetros.
    • flipper_length_mm: longitud de las aletas del pingüino en milímetros.
    • sex: el sexo del pingüino.
  • La cláusula WHERE de la instrucción SELECT de esta consulta, WHERE body_mass_g IS NOT NULL, excluye las filas en las que la columna body_mass_g es NULL.

Ejecuta la consulta que crea tu modelo de regresión lineal:

  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 `bqml_tutorial.penguins_model`
    OPTIONS
      (model_type='linear_reg',
      input_label_cols=['body_mass_g']) AS
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE
      body_mass_g IS NOT NULL;
  3. El modelo penguins_model tarda unos 30 segundos en crearse. Para ver el modelo, ve al panel Explorador, despliega el conjunto de datos bqml_tutorial y, a continuación, la carpeta Modelos.

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.

from bigframes.ml.linear_model import LinearRegression
import bigframes.pandas as bpd

# Load data from BigQuery
bq_df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")

# Drop rows with nulls to get training data
training_data = bq_df.dropna(subset=["body_mass_g"])

# Specify your feature (or input) columns and the label (or output) column:
feature_columns = training_data.drop(columns=["body_mass_g"])
label_columns = training_data[["body_mass_g"]]

# Create the linear model
model = LinearRegression()
model.fit(feature_columns, label_columns)
model.to_gbq(
    your_model_id,  # For example: "bqml_tutorial.penguins_model"
    replace=True,
)

El modelo tarda unos 30 segundos en crearse. Para ver el modelo, vaya al panel Explorador, despliegue el conjunto de datos bqml_tutorial y, a continuación, la carpeta Modelos.

Obtener estadísticas de formación

Para ver los resultados del entrenamiento del modelo, puedes usar la función ML.TRAINING_INFO o consultar las estadísticas en la consola Google Cloud . En este tutorial, usarás la Google Cloud consola.

Un algoritmo de aprendizaje automático crea un modelo examinando muchos ejemplos e intentando encontrar un modelo que minimice las pérdidas. Este proceso se denomina minimización del riesgo empírico.

La pérdida es la penalización por una predicción incorrecta. Es un número que indica lo incorrecta que ha sido la predicción del modelo en un ejemplo concreto. Si las predicciones del modelo son perfectas, la pérdida será igual a 0; si no, será superior. El objetivo de entrenar un modelo es encontrar un conjunto de pesos y sesgos que tengan una pérdida baja, de media, en todos los ejemplos.

Consulta las estadísticas de entrenamiento del modelo que se generaron al ejecutar la consulta CREATE MODEL:

  1. En el panel Explorador, despliega el conjunto de datos bqml_tutorial y, a continuación, la carpeta Modelos. Haz clic en penguins_model para abrir el panel de información del modelo.

  2. Haga clic en la pestaña Entrenamiento y, a continuación, en Tabla. Los resultados deberían ser similares a los siguientes:

    Salida de ML.TRAINING_INFO

    La columna Pérdida de datos de entrenamiento representa la métrica de pérdida calculada después de que el modelo se haya entrenado con el conjunto de datos de entrenamiento. Como has realizado una regresión lineal, esta columna muestra el valor del error cuadrático medio. Para este entrenamiento se usa automáticamente una estrategia de optimización de normal_equation, por lo que solo se necesita una iteración para converger al modelo final. Para obtener más información sobre cómo definir la estrategia de optimización del modelo, consulte optimize_strategy.

Evaluar el modelo

Después de crear el modelo, evalúa su rendimiento con la función ML.EVALUATE o la función score de DataFrames de BigQuery para comparar los valores predichos generados por el modelo con los datos reales.

SQL

Como entrada, la función ML.EVALUATE toma el modelo entrenado y un conjunto de datos que coincida con el esquema de los datos que has usado para entrenar el modelo. En un entorno de producción, debe evaluar el modelo con datos distintos de los que ha usado para entrenarlo. Si ejecutas ML.EVALUATE sin proporcionar datos de entrada, la función recupera las métricas de evaluación calculadas durante el entrenamiento. Estas métricas se calculan usando el conjunto de datos de evaluación reservado automáticamente:

    SELECT
      *
    FROM
      ML.EVALUATE(MODEL bqml_tutorial.penguins_model);
    

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 `bqml_tutorial.penguins_model`,
          (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            body_mass_g IS NOT NULL));
      

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

# Select the model you will be evaluating. `read_gbq_model` loads model data from
# BigQuery, but you could also use the `model` object from the previous steps.
model = bpd.read_gbq_model(
    your_model_id,  # For example: "bqml_tutorial.penguins_model"
)

# Score the model with input data defined in an earlier step to compare
# model predictions on feature_columns to true labels in label_columns.
score = model.score(feature_columns, label_columns)
# Expected output results:
# index  mean_absolute_error  mean_squared_error  mean_squared_log_error  median_absolute_error  r2_score  explained_variance
#   0        227.012237         81838.159892            0.00507                173.080816        0.872377    0.872377
#   1 rows x 6 columns

Los resultados deberían ser similares a los siguientes:

Salida de ML.EVALUATE

Como has realizado una regresión lineal, los resultados incluyen las siguientes columnas:

  • mean_absolute_error
  • mean_squared_error
  • mean_squared_log_error
  • median_absolute_error
  • r2_score
  • explained_variance

Una métrica importante en los resultados de la evaluación es la puntuación R2. La puntuación R2 es una medida estadística que determina si las predicciones de regresión lineal se aproximan a los datos reales. Un valor de 0 indica que el modelo no explica ninguna de las variabilidades de los datos de respuesta en torno a la media. Un valor de 1 indica que el modelo explica toda la variabilidad de los datos de respuesta en torno a la media.

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

Salida de ML.EVALUATE

Usar el modelo para predecir resultados

Ahora que has evaluado tu modelo, el siguiente paso es usarlo para predecir un resultado. Puedes ejecutar la función ML.PREDICT o la función BigQuery DataFrames predict en el modelo para predecir la masa corporal en gramos de todos los pingüinos que residen en las islas Biscoe.

SQL

Como entrada, la función ML.PREDICT toma el modelo entrenado y un conjunto de datos que coincide con el esquema de los datos que usaste para entrenar el modelo, excepto la columna de etiquetas.

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 `bqml_tutorial.penguins_model`,
      (
      SELECT
        *
      FROM
        `bigquery-public-data.ml_datasets.penguins`
      WHERE island = 'Biscoe'));

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.

# Select the model you'll use for predictions. `read_gbq_model` loads
# model data from BigQuery, but you could also use the `model` object
# object from previous steps.
model = bpd.read_gbq_model(
    your_model_id,
    # For example: "bqml_tutorial.penguins_model",
)

# Load data from BigQuery
bq_df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")

# Use 'contains' function to filter by island containing the string
# "Biscoe".
biscoe_data = bq_df.loc[bq_df["island"].str.contains("Biscoe")]

result = model.predict(biscoe_data)

# Expected output results:
#     predicted_body_mass_g  	      species	                island	 culmen_length_mm  culmen_depth_mm   body_mass_g 	flipper_length_mm	sex
# 23	  4681.782896	   Gentoo penguin (Pygoscelis papua)	Biscoe	      <NA>	            <NA>	        <NA>	          <NA>	        <NA>
# 332	  4740.7907	       Gentoo penguin (Pygoscelis papua)	Biscoe	      46.2	            14.4	        214.0	          4650.0	    <NA>
# 160	  4731.310452	   Gentoo penguin (Pygoscelis papua)	Biscoe	      44.5	            14.3	        216.0	          4100.0	    <NA>

Los resultados deberían ser similares a los siguientes:

Salida de ML.PREDICT

Explicar los resultados de la predicción

SQL

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. En la práctica, puedes ejecutar ML.EXPLAIN_PREDICT en lugar de ML.PREDICT. Para obtener más información, consulta la información general sobre la IA explicable de BigQuery ML.

Ejecuta la consulta ML.EXPLAIN_PREDICT:

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

Ir a BigQuery

  1. En el editor de consultas, ejecuta la siguiente consulta:
SELECT
  *
FROM
  ML.EXPLAIN_PREDICT(MODEL `bqml_tutorial.penguins_model`,
    (
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE island = 'Biscoe'),
    STRUCT(3 as top_k_features));
  1. Los resultados deberían ser similares a los siguientes:

    Resultado de ML.EXPLAIN_PREDICT

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.

# Use 'predict_explain' function to understand why the model is generating these prediction results.
# 'predict_explain'is an extended version of the 'predict' function that not only outputs prediction results, but also outputs additional columns to explain the prediction results.
# Using the trained model and utilizing data specific to Biscoe Island, explain the predictions of the top 3 features
explained = model.predict_explain(biscoe_data, top_k_features=3)

# Expected results:
#   predicted_body_mass_g               top_feature_attributions	        baseline_prediction_value	prediction_value	approximation_error	              species	            island	culmen_length_mm	culmen_depth_mm	flipper_length_mm	body_mass_g	    sex
# 0	 5413.510134	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          5413.510134	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    45.2	              16.4	        223.0	           5950.0	    MALE
# 1	 4768.351092            [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          4768.351092	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    46.5	              14.5	        213.0	           4400.0	   FEMALE
# 2	 3235.896372	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          3235.896372	            0.0	        Adelie Penguin (Pygoscelis adeliae)	Biscoe	    37.7	              16.0          183.0	           3075.0	   FEMALE
# 3	 5349.603734	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          5349.603734	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    46.4	              15.6	        221.0	           5000.0	    MALE
# 4	 4637.165037	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          4637.165037	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    46.1	              13.2	        211.0	           4500.0	   FEMALE

En los modelos de regresión lineal, los valores de Shapley se usan para generar valores de atribución de características para cada característica del modelo. El resultado incluye las tres atribuciones de características principales por fila de la tabla penguins porque top_k_features se ha definido como 3. Estas atribuciones se ordenan por el valor absoluto de la atribución en orden descendente. En todos los ejemplos, la característica sex es la que más ha contribuido a la predicción general.

Explica el modelo de forma global

SQL

Para saber qué características son las más importantes para determinar el peso de los pingüinos, 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 definida como TRUE.

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

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

Ir a BigQuery

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

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model`
    OPTIONS (
      model_type = 'linear_reg',
      input_label_cols = ['body_mass_g'],
      enable_global_explain = TRUE)
    AS
    SELECT
    *
    FROM
    `bigquery-public-data.ml_datasets.penguins`
    WHERE
    body_mass_g IS NOT NULL;
  2. En el editor de consultas, ejecuta la siguiente consulta para obtener explicaciones globales:

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

    Resultado de ML.GLOBAL_EXPLAIN

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.

# To use the `global_explain()` function, the model must be recreated with `enable_global_explain` set to `True`.
model = LinearRegression(enable_global_explain=True)

# The model must the be fitted before it can be saved to BigQuery and then explained.
training_data = bq_df.dropna(subset=["body_mass_g"])
X = training_data.drop(columns=["body_mass_g"])
y = training_data[["body_mass_g"]]
model.fit(X, y)
model.to_gbq("bqml_tutorial.penguins_model", replace=True)

# Explain the model
explain_model = model.global_explain()

# Expected results:
#                       attribution
# feature
# island	            5737.315921
# species	            4073.280549
# sex	                622.070896
# flipper_length_mm	    193.612051
# culmen_depth_mm	    117.084944
# culmen_length_mm	    94.366793

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.

  • Puedes eliminar el proyecto que has creado.
  • También puedes conservar el proyecto y eliminar el conjunto de datos.

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 panel de navegación, haz clic en el conjunto de datos bqml_tutorial que has creado.

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

  4. En el cuadro de diálogo Eliminar conjunto de datos, confirma el comando de eliminación escribiendo el nombre del conjunto de datos (bqml_tutorial) 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.