Predicción de calificaciones de películas con BQML mediante SQL

1. Introducción

En este codelab, crearemos un modelo de predicción de calificaciones de películas con un modelo personalizado de BigQuery ML usando solo SQL y lo implementaremos en Vertex AI. Aprenderás a hacer lo siguiente:

  1. Cómo crear un conjunto de datos de BigQuery con Cloud Shell y cargar datos desde un archivo
  2. Cómo usar BigQuery ML para el aprendizaje supervisado y crear un modelo de predicción de regresión multiclase para la predicción de calificaciones de películas sin mucho código, sino solo con consultas en SQL

Qué compilarás

Crearás lo siguiente:

  • Un conjunto de datos de BigQuery que contenga los componentes de la tabla y del modelo
  • Un modelo de BigQuery ML para predecir la calificación de la película con consultas en SQL
  • Implementar el modelo en Vertex AI Model Registry

Requisitos

  • Un navegador, como Chrome o Firefox.
  • Un proyecto de Google Cloud con la facturación habilitada.

2. Crea tu proyecto

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.
  3. Navega a BigQuery para habilitar la API. También puedes abrir la IU web de BigQuery directamente si ingresas la siguiente URL en tu navegador: https://console.cloud.google.com/bigquery

3. Activar Cloud Shell

  1. Usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud y que viene precargado con bq: En Cloud Console, haz clic en Activar Cloud Shell en la esquina superior derecha: 6757b2fb50ddcc2d.png
  2. Una vez que estés conectado a Cloud Shell, deberías ver que ya se autenticó y que el proyecto ya se configuró con tu ID de proyecto. En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list
  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto.
gcloud config list project
  1. Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:
gcloud config set project <PROJECT_ID>

Consulta la documentación para ver los comandos y el uso de gcloud.

4. Prepara los datos de entrenamiento

Este es un paso importante en todos los proyectos, productos y apps relacionados con los datos que requieren mucha experiencia en el dominio, además de la tecnología para preparar un conjunto de datos óptimo y prepararlo para tu proyecto de AA. Para los fines de este codelab, usaremos el archivo de datos que ya está preparado.

5. Crea y carga el conjunto de datos

Un conjunto de datos de BigQuery es una colección de tablas. Todas las tablas de un conjunto de datos se almacenan en la misma ubicación de datos location. También puedes adjuntar controles de acceso personalizados para limitar el acceso a un conjunto de datos y sus tablas.

  1. En Cloud Shell, usa el comando bq mk para crear un conjunto de datos llamado "movies".
bq mk --location=<<LOCATION>> movies

Configura la ubicación en una región (asia-south1).

  1. Asegúrate de tener listo el archivo de datos (.csv). Ejecuta los siguientes comandos en Cloud Shell para clonar el repositorio y navegar al proyecto:
git clone <<repository link>>

cd movie-score
  1. Usa el comando bq load para cargar tu archivo CSV en una tabla de BigQuery (ten en cuenta que también puedes subirlo directamente desde la IU de BigQuery):
bq load --source_format=CSV --skip_leading_rows=1 movies.movies_score \
./movies_bq_src.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string

Descripción de las opciones: –source_format=CSV: Usa el formato de datos CSV cuando analiza el archivo de datos. –skip_leading_rows=1: Omite la primera línea del archivo CSV porque es una fila de encabezado. Movies.movies: El primer argumento posicional define en qué tabla se deben cargar los datos. ./movies.csv: El segundo argumento posicional define qué archivo se debe cargar. Además de los archivos locales, el comando bq load puede cargar archivos de Cloud Storage con URI gs://my_bucket/path/to/file. Un esquema, que se puede definir en un archivo de esquema JSON o como una lista separada por comas (usé una lista separada por comas). ¡Claro! Nuestros datos CSV ahora se cargan en la tabla movies.movies.

  1. Consulta de una de las 3 maneras:

Podemos interactuar con BigQuery de tres maneras, probaremos dos de ellas: a. IU web de BigQuery b. El comando bq c. API

SELECT name, rating, genre, runtime FROM movies.movies_score limit 3;

Usé el espacio de trabajo de SQL web de BigQuery para ejecutar consultas. El espacio de trabajo de SQL se ve de la siguiente manera:

109a0b2c7155e9b3.png

Usa el comando bq:

bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movies.movies_score limit 3;

6. Predice la calificación de la película en una escala del 1 al 10

BigQuery ML admite el aprendizaje supervisado con el tipo de modelo de regresión logística. Puedes usar el tipo de modelo de regresión logística binaria para predecir si un valor pertenece a una de dos categorías, o bien, puedes usar el tipo de modelo de regresión de varias clases para predecir si un valor pertenece a una de varias categorías. Estos problemas se conocen como problemas de clasificación, ya que intentan clasificar los datos en dos o más categorías.

Una nota rápida sobre la elección del modelo: Esta es una elección experimental del modelo que se eligió aquí, según la evaluación de los resultados que ejecuté en varios modelos inicialmente y, finalmente, continué con LOGISTIC REG para mantenerlo simple y obtener resultados más cercanos a la calificación real de la película de varias bases de datos. Ten en cuenta que esto debe considerarse solo como una muestra para implementar el modelo y NO es necesariamente el modelo recomendado para este caso de uso. Otra forma de implementar esto es predecir el resultado de la película como BUENO o MALO con este modelo de regresión logística en lugar de predecir la calificación.

Selecciona tus datos de entrenamiento

Ya dividimos los datos de la película (en CSV) en 3 categorías en la tabla con el campo "data_cat" que tiene uno de los 3 valores: TRAIN, TEST y PREDICT. Dividir el conjunto de datos para fines de prueba y entrenamiento es un aspecto importante del modelo. Si necesitas más información para comprender la división del conjunto de datos, consulta la documentación.

Crea el modelo de regresión logística

Podemos usar la instrucción CREATE MODEL con la opción "LOGISTIC_REG" para crear y entrenar un modelo de regresión logística.

Ejecuta la siguiente consulta en el espacio de trabajo de SQL de la IU web de BigQuery:

CREATE OR REPLACE MODEL
  `movies.movies_score_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
   data_split_method='NO_SPLIT',
    input_label_cols=[score']
  ) AS
SELECT
  * EXCEPT(id, data_cat)
FROM
  ‘movies.movies_score'
WHERE
  data_cat = 'TRAIN';

Detalles de la consulta:

  1. La instrucción CREATE MODEL entrena un modelo con los datos de entrenamiento en la instrucción SELECT.
  2. La cláusula OPTIONS especifica el tipo de modelo y las opciones de entrenamiento. Aquí, la opción LOGISTIC_REG especifica un tipo de modelo de regresión logística. No es necesario especificar un modelo de regresión logística binaria frente a un modelo de regresión logística de varias clases: BigQuery ML puede determinar cuál entrenar según la cantidad de valores únicos en la columna de la etiqueta.
  3. data_split_method=‘NO_SPLIT' obliga a BQML a entrenar los datos según las condiciones de la consulta (data_cat = ‘TRAIN'). También ten en cuenta que es mejor usar ‘AUTO_SPLIT' en esta opción para permitir que el framework (o el servicio en este caso) aleatorice la partición de las divisiones de entrenamiento y prueba.
  4. La opción input_label_cols especifica qué columna de la instrucción SELECT se usará como columna de la etiqueta. Aquí, la columna de la etiqueta es score, por lo que el modelo aprenderá cuál de los 10 valores de score es más probable que se base en los demás valores presentes en cada fila.
  5. La opción ‘auto_class_weights=TRUE' equilibra 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.
  6. La instrucción SELECT consulta la tabla que cargamos con los datos CSV. La cláusula WHERE filtra las filas de la tabla de entrada para que solo se seleccione el conjunto de datos TRAIN en este paso.

Una vez creado, aparecerá lo siguiente en la sección SCHEMA del espacio de trabajo de SQL de BigQuery:

Etiquetas

93efd0c1a7883690.png

Funciones

8c539338df1a9652.png

Evalúa tu modelo de regresión logística

Después de crear el modelo, debes evaluar su rendimiento con la función ML.EVALUATE. La función ML.EVALUATE compara los valores predichos con los datos reales. La consulta para evaluar el modelo es la siguiente:

SELECT
  *
FROM
  ML.EVALUATE (MODEL movies.movies_score_model,
    (
    SELECT
      *
    FROM
      movies.movies_score
    WHERE
      data_cat= TEST'
    )
  )

La función ML.EVALUATE toma el modelo entrenado en el paso anterior y los datos de evaluación que muestra una subconsulta SELECT. La función muestra una sola fila de estadísticas del modelo.

b54b0ebd6514a498.png

Debido a que realizaste una regresión logística, los resultados incluyen las métricas que ves en la captura de pantalla anterior: precisión, recuperación, exactitud, puntuación F1, log_loss y roc_auc, que son fundamentales para evaluar el rendimiento del modelo. También puedes llamar a ML.EVALUATE sin proporcionar datos de entrada. ML.EVALUATE recupera las métricas de evaluación derivadas durante el entrenamiento, que usa el conjunto de datos de evaluación reservado de forma automática.

Métricas clave de un vistazo:

Precisión: ¿Qué proporción de identificaciones positivas fue correcta? Precisión = Verdadero positivo / (Verdadero positivo + Falso positivo) Recuperación: ¿Qué proporción de positivos reales se identificó en forma correcta? Recuperación = Verdadero positivo / (Verdadero positivo + Falso negativo) Exactitud: Es una métrica para evaluar los modelos de clasificación. Es la fracción de predicciones que nuestro modelo realmente obtuvo de forma correcta. Exactitud = Cantidad de predicciones correctas / Cantidad total de predicciones

Predice la calificación de la película con ML.PREDICT

La siguiente consulta predice la calificación de cada película en la parte PREDICT del conjunto de datos.

SELECT
  *
FROM
  ML.PREDICT (MODEL movies.movies_score_model,
    (
    SELECT
      *
    FROM
      movies.movies_score
    WHERE
      data_cat= PREDICT'
     )
  )

A continuación, se incluye un fragmento de los resultados:

1efb91967acc1f0c.png

El resultado del modelo muestra la CALIFICACIÓN predicha de la película en una escala del 1 al 10 (clasificación). Te preguntarás por qué hay varias filas de predicción para cada película. Esto se debe a que el modelo mostró las posibles etiquetas predichas y la probabilidad de ocurrencia de cada una en orden descendente.

Analiza los resultados predichos y el modelo

Además, puedes realizar dos excelentes pasos de análisis como parte de los resultados de la predicción:

  1. Para comprender por qué el modelo genera estos resultados de predicción, puedes usar la función ML.EXPLAIN_PREDICT.
  2. Para saber qué atributos son los más importantes para determinar el rango de ingresos en general, puedes usar la función ML.GLOBAL_EXPLAIN.

Puedes leer sobre estos pasos en detalle en la documentación.

7. Predice la calificación de la película con BigQuery AutoML

AutoML es ideal si quieres permitir que el servicio de BigQuery cree el modelo por ti y relajarte hasta que se generen los resultados del modelo. La capacidad de AutoML está disponible directamente en BQML (model_type=AUTOML_CLASSIFIER o AUTOML_REGRESSOR) y es mucho más fácil de llamar si los datos ya están en BigQuery.

CREATE OR REPLACE MODEL movies.auto_movies
       OPTIONS(model_type='AUTOML_CLASSIFIER',
               input_label_cols=['score'],
               budget_hours=1.0)
AS 
SELECT
  * EXCEPT(id, data_cat)
FROM
  movies.movies_score;

Una vez que se crea el modelo, puedes llevar a cabo los pasos para EVALUATE, PREDICT y EXPLAIN_PREDICT tal como analizamos en el modelo BQML personalizado. Obtén más información sobre BigQuery AutoML en la documentación.

8. Un clic para implementar modelos de BQML en Vertex AI Model Registry

Ahora puedes ver todos tus modelos de AA en Vertex AI Model Registry, lo que facilita que tu organización administre y, también, implemente modelos. Esto incluye modelos compilados con BigQuery ML, AutoML y modelos entrenados de forma personalizada. A continuación, le mostramos cómo hacerlo:

CREATE OR REPLACE MODEL
  `movies.movies_score_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
   data_split_method='NO_SPLIT',
   model_registry='vertex_ai',
  vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
    input_label_cols=[score']
  ) AS
SELECT
  * EXCEPT(id, data_cat)
FROM
  ‘movies.movies_score'
WHERE
  data_cat = 'TRAIN';

Incluye la opción model_registry="vertex_ai" en la consulta CREATE MODEL para que BigQuery ML pueda elegir qué modelos desea registrar de forma explícita en Vertex AI Model Registry. Puedes leer más sobre esto en este blog.

9. Resumen

En menos de 30 minutos, hicimos lo siguiente:

  1. Configuramos BigQuery como nuestra base de datos para el proyecto de estadísticas.
  2. Creamos un modelo de predicción personalizado usando solo SQL de datos de BigQuery y sin ninguna otra codificación.
  3. Creamos un modelo de BQ Auto ML usando solo consultas en SQL.
  4. Implementamos el modelo de BQML en Vertex AI Model Registry.

10. Limpia

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta publicación:

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

11. Felicitaciones

¡Felicitaciones! Creaste correctamente un modelo de predicción de calificaciones de películas con BQML personalizado y AutoML, y lo implementaste en Vertex AI Model Registry. Todo esto solo con SQL.