Realizar la ingeniería de funciones con la cláusula TRANSFORM

En este tutorial se explica cómo usar la cláusula TRANSFORM de la instrucción CREATE MODEL para aplicar ingeniería de funciones al mismo tiempo que creas y entrenas un modelo. Con la cláusula TRANSFORM, puedes especificar una o varias funciones de preprocesamiento para transformar los datos de entrada que usas para entrenar el modelo. El preprocesamiento que apliques al modelo se aplicará automáticamente cuando lo uses con las funciones ML.EVALUATE y ML.PREDICT.

En este tutorial se usa el conjunto de datos público bigquery-public-data.ml_datasets.penguin.

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 para predecir el peso de los pingüinos y entrénalo con la tabla de ejemplo penguins.

La cláusula OPTIONS(model_type='linear_reg', input_label_cols=['body_mass_g']) indica que vas a crear un modelo de regresión lineal. Un modelo de regresión lineal genera un valor continuo a partir de una combinación lineal de las características de entrada. La columna body_mass_g es la columna de etiquetas de entrada. 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 cláusula TRANSFORM de esta consulta usa las siguientes columnas de la instrucción SELECT:

  • body_mass_g: se usa en el entrenamiento sin ningún cambio.
  • culmen_depth_mm: se usa en el entrenamiento sin ningún cambio.
  • flipper_length_mm: se usa en el entrenamiento sin ningún cambio.
  • bucketized_culmen_length: se genera a partir de culmen_length_mm mediante la creación de contenedores de culmen_length_mm en función de los cuantiles con la función analítica ML.QUANTILE_BUCKETIZE().
  • culmen_length_mm: valor culmen_length_mm original, convertido en un valor STRING y usado en el entrenamiento.
  • species_sex: se genera al cruzar species y sex con la función ML.FEATURE_CROSS.

No es necesario que uses todas las columnas de la tabla de entrenamiento en la cláusula TRANSFORM.

La cláusula WHEREWHERE body_mass_g IS NOT NULL AND RAND() < 0.2— excluye las filas en las que el peso de los pingüinos es NULL y usa la función RAND para extraer una muestra aleatoria de los datos.

Sigue estos pasos para crear el modelo:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    CREATE OR REPLACE MODEL `bqml_tutorial.penguin_transform`
      TRANSFORM(
        body_mass_g,
        culmen_depth_mm,
        flipper_length_mm,
        ML.QUANTILE_BUCKETIZE(culmen_length_mm, 10) OVER () AS bucketized_culmen_length,
        CAST(culmen_length_mm AS string) AS culmen_length_mm,
        ML.FEATURE_CROSS(STRUCT(species, sex)) AS species_sex)
      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
      AND RAND() < 0.2;

    La consulta tarda unos 15 minutos en completarse. Después, el modelo penguin_transform aparece en el panel Explorador. Como la consulta usa una instrucción CREATE MODEL para crear un modelo, no se muestran resultados.

Evaluar el modelo

Evalúa el rendimiento del modelo con la función ML.EVALUATE. La función ML.EVALUATE evalúa los pesos de los pingüinos predichos devueltos por el modelo en comparación con los pesos reales de los pingüinos de los datos de entrenamiento.

La instrucción SELECT anidada y la cláusula FROM de esta consulta son las mismas que las de la consulta CREATE MODEL. Como has usado la cláusula TRANSFORM al crear el modelo, no tienes que especificar las columnas y las transformaciones de nuevo en la función ML.EVALUATE. La función los obtiene automáticamente del modelo.

Sigue estos pasos para evaluar el modelo:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
      *
    FROM
      ML.EVALUATE(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            body_mass_g IS NOT NULL
        ));

    Los resultados deberían ser similares a los siguientes:

    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    | mean_absolute_error | mean_squared_error | mean_squared_log_error | median_absolute_error |      r2_score      | explained_variance |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    |   64.21134350607677 | 13016.433317859564 |   7.140935762696211E-4 |     15.31788461553515 | 0.9813042531507734 | 0.9813186268757634 |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    

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

    Para obtener más información sobre el resultado de la función ML.EVALUATE, consulta Resultado.

    También puedes llamar a ML.EVALUATE sin proporcionar los datos de entrada. Usará las métricas de evaluación calculadas durante el entrenamiento.

Usar el modelo para predecir el peso de los pingüinos

Usa el modelo con la función ML.PREDICT para predecir el peso de los pingüinos macho.

La función ML.PREDICT muestra el valor previsto en la columna predicted_label_column_name, que en este caso es predicted_body_mass_g.

Cuando usas la función ML.PREDICT, no tienes que incluir todas las columnas que se han usado en el entrenamiento del modelo. Solo son obligatorias las columnas que hayas usado en la cláusula TRANSFORM. Al igual que ML.EVALUATE, la función ML.PREDICT recupera automáticamente las columnas y las transformaciones TRANSFORM del modelo.

Sigue estos pasos para obtener predicciones del modelo:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
      predicted_body_mass_g
    FROM
      ML.PREDICT(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            sex = 'MALE'
        ));

    Los resultados deberían ser similares a los siguientes:

    +-----------------------+
    | predicted_body_mass_g |
    +-----------------------+
    |    2810.2868541725757 |
    +-----------------------+
    |    3813.6574220842676 |
    +-----------------------+
    |     4098.844698262214 |
    +-----------------------+
    |     4256.587135004173 |
    +-----------------------+
    |     3008.393497302691 |
    +-----------------------+
    |     ...               |
    +-----------------------+