Crea recomendaciones basadas en comentarios explícitos con un modelo de factorización de matrices


En este instructivo, aprenderás a crear un modelo de factorización de matrices y a entrenarlo con las calificaciones de películas de los clientes en el conjunto de datos movielens1m. Luego, usa el modelo de factorización de matrices para generar recomendaciones de películas para los usuarios.

El uso de calificaciones proporcionadas por los clientes para entrenar el modelo se denomina entrenamiento con comentarios explícitos. Los modelos de factorización de matrices se entrenan con el algoritmo de mínimos cuadrados alternos cuando usas comentarios explícitos como datos de entrenamiento.

Objetivos

En este instructivo, se te guiará para completar las siguientes tareas:

  • Crear un modelo de factorización de matrices con la sentencia CREATE MODEL
  • Evalúa el modelo con la función ML.EVALUATE.
  • Generar recomendaciones de películas para los usuarios con el modelo con la función ML.RECOMMEND

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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. BigQuery se habilita automáticamente en proyectos nuevos. Para activar BigQuery en un proyecto existente, ve a

    Enable the BigQuery API.

    Enable the API

Permisos necesarios

  • Para crear el conjunto de datos, necesitas el permiso bigquery.datasets.create de IAM.
  • Para crear el recurso de conexión, necesitas los siguientes permisos:

    • bigquery.connections.create
    • bigquery.connections.get
  • Para crear el modelo, necesitas los siguientes permisos:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • Para ejecutar inferencias, necesitas los siguientes permisos:

    • bigquery.models.getData
    • bigquery.jobs.create

Para obtener más información sobre los roles y permisos de IAM en BigQuery, consulta Introducción a IAM.

Crea un conjunto de datos

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

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

    Ir a la página de 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 bqml_tutorial.

    • 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.

      Página Crear un conjunto de datos

Sube los datos de MovieLens

Sube los datos de movielens1m a BigQuery con la herramienta de línea de comandos de bq.

Sigue estos pasos para subir los datos de movielens1m:

  1. Abre Cloud Shell:

    Activa Cloud Shell

  2. Sube los datos de las calificaciones a la tabla ratings. En la línea de comandos, pega la siguiente consulta y presiona Enter:

    curl -O 'http://files.grouplens.org/datasets/movielens/ml-1m.zip'
    unzip ml-1m.zip
    sed 's/::/,/g' ml-1m/ratings.dat > ratings.csv
    bq load --source_format=CSV bqml_tutorial.ratings ratings.csv \
      user_id:INT64,item_id:INT64,rating:FLOAT64,timestamp:TIMESTAMP
    
  3. Sube los datos de las películas a la tabla movies. En la línea de comandos, pega la siguiente consulta y presiona Enter:

    sed 's/::/@/g' ml-1m/movies.dat > movie_titles.csv
    bq load --source_format=CSV --field_delimiter=@ \
    bqml_tutorial.movies movie_titles.csv \
    movie_id:INT64,movie_title:STRING,genre:STRING
    

Crea el modelo

Crea un modelo de factorización de matrices y entrena en los datos de la tabla ratings. El modelo se entrena para predecir una calificación para cada par de usuario y elemento, según las calificaciones de las películas que proporciona el cliente.

La siguiente sentencia CREATE MODEL usa estas columnas para generar recomendaciones:

  • user_id: El ID de usuario.
  • item_id: Es el ID de la película.
  • rating: Es la calificación explícita del 1 al 5 que el usuario otorgó al elemento.

Sigue estos pasos para crear 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, pega la siguiente consulta y haz clic en Ejecutar:

    CREATE OR REPLACE MODEL `bqml_tutorial.mf_explicit`
      OPTIONS (
        MODEL_TYPE = 'matrix_factorization',
        FEEDBACK_TYPE = 'explicit',
        USER_COL = 'user_id',
        ITEM_COL = 'item_id',
        L2_REG = 9.83,
        NUM_FACTORS = 34)
    AS
    SELECT
      user_id,
      item_id,
      rating
    FROM `bqml_tutorial.ratings`;

    La consulta tarda unos 10 minutos en completarse, después de lo cual el modelo mf_explicit aparece en el panel Explorador. Debido a que en la consulta se usa una sentencia CREATE MODEL para crear un modelo, no se muestran los resultados.

Obtén estadísticas de entrenamiento

De manera opcional, puedes ver las estadísticas de entrenamiento del modelo en la consola de Google Cloud.

Para compilar un modelo, los algoritmos de aprendizaje automático crean muchas iteraciones del modelo con diferentes parámetros y, luego, seleccionan la versión del modelo que minimiza la pérdida. Este proceso se llama minimización del riesgo empírico. Las estadísticas de entrenamiento del modelo te permiten ver la pérdida asociada con cada iteración del modelo.

Sigue estos pasos para ver las estadísticas de entrenamiento del modelo:

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

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto, expande el conjunto de datos bqml_tutorial y, luego, expande la carpeta Modelos.

  3. Haz clic en el modelo mf_explicit y, luego, en la pestaña Entrenamiento.

  4. En la sección Ver como, haz clic en Tabla. Los resultados debería ser similares al siguiente:

    +-----------+--------------------+--------------------+
    | Iteration | Training Data Loss | Duration (seconds) |
    +-----------+--------------------+--------------------+
    |  11       | 0.3943             | 42.59              |
    +-----------+--------------------+--------------------+
    |  10       | 0.3979             | 27.37              |
    +-----------+--------------------+--------------------+
    |   9       | 0.4038             | 40.79              |
    +-----------+--------------------+--------------------+
    |  ...      | ...                | ...                |
    +-----------+--------------------+--------------------+
    

    La columna Training Data Loss (Pérdida de datos de entrenamiento) representa la métrica de pérdida calculada después de que se entrena el modelo. Debido a que este es un modelo de factorización de matrices, esta columna muestra el error cuadrático medio.

También puedes usar la función ML.TRAINING_INFO para ver las estadísticas de entrenamiento de modelos.

Evalúa el modelo

Evalúa el rendimiento del modelo con la función ML.EVALUATE. La función ML.EVALUATE evalúa las calificaciones de películas previstas que muestra el modelo en comparación con las calificaciones reales de las películas de los usuarios de los datos de entrenamiento.

Sigue estos pasos para evaluar 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, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
      *
    FROM
      ML.EVALUATE(
        MODEL `bqml_tutorial.mf_explicit`,
        (
          SELECT
            user_id,
            item_id,
            rating
          FROM
            `bqml_tutorial.ratings`
        ));

    Los resultados debería ser similar al siguiente:

    +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+
    | mean_absolute_error | mean_squared_error  | mean_squared_log_error | median_absolute_error |      r2_score      | explained_variance |
    +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+
    | 0.48494444327829156 | 0.39433706592870565 |   0.025437895793637522 |   0.39017059802629905 | 0.6840033369412044 | 0.6840033369412264 |
    +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+
    

    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 0 indica que el modelo no explica nada de la variabilidad de los datos de respuesta alrededor de la media. Un valor 1 indica que el modelo explica toda la variabilidad de los datos de respuesta alrededor de la media.

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

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

Obtén las calificaciones previstas de un subconjunto de pares de usuario y elemento

Usa ML.RECOMMEND para obtener la calificación prevista de cada película para cinco usuarios.

Sigue estos pasos para obtener clasificaciones previstas:

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

    Ir a BigQuery

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

    SELECT
      *
    FROM
      ML.RECOMMEND(
        MODEL `bqml_tutorial.mf_explicit`,
        (
          SELECT
            user_id
          FROM
            `bqml_tutorial.ratings`
          LIMIT 5
        ));

    Los resultados debería ser similar al siguiente:

    +--------------------+---------+---------+
    | predicted_rating   | user_id | item_id |
    +--------------------+---------+---------+
    | 4.2125303962491873 | 4       | 3169    |
    +--------------------+---------+---------+
    | 4.8068920531981263 | 4       | 3739    |
    +--------------------+---------+---------+
    | 3.8742203494732403 | 4       | 3574    |
    +--------------------+---------+---------+
    | ...                | ...     | ...     |
    +--------------------+---------+---------+
    

Genera recomendaciones

Usa las calificaciones previstas para generar las cinco películas recomendadas más populares para cada usuario.

Sigue estos pasos para generar recomendaciones:

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

    Ir a BigQuery

  2. Escribe las calificaciones previstas en una tabla. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    CREATE OR REPLACE TABLE `bqml_tutorial.recommend`
    AS
    SELECT
      *
    FROM
      ML.RECOMMEND(MODEL `bqml_tutorial.mf_explicit`);
  3. Une las calificaciones previstas con la información de la película y selecciona los cinco resultados más populares por usuario. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
      user_id,
      ARRAY_AGG(STRUCT(movie_title, genre, predicted_rating) ORDER BY predicted_rating DESC LIMIT 5)
    FROM
      (
        SELECT
          user_id,
          item_id,
          predicted_rating,
          movie_title,
          genre
        FROM
          `bqml_tutorial.recommend`
        JOIN
          `bqml_tutorial.movies`
          ON
            item_id = movie_id
      )
    GROUP BY
      user_id;

    Los resultados debería ser similar al siguiente:

    +---------+-------------------------------------+------------------------+--------------------+
    | user_id | f0_movie_title                      | f0_genre               | predicted_rating   |
    +---------+-------------------------------------+------------------------+--------------------+
    | 4597    | Song of Freedom (1936)              | Drama                  | 6.8495752907364009 |
    |         | I Went Down (1997)                  | Action/Comedy/Crime    | 6.7203235758772877 |
    |         | Men With Guns (1997)                | Action/Drama           | 6.399407352232001  |
    |         | Kid, The (1921)                     | Action                 | 6.1952890198126731 |
    |         | Hype! (1996)                        | Documentary            | 6.1895766097451475 |
    +---------+-------------------------------------+------------------------+--------------------+
    | 5349    | Fandango (1985)                     | Comedy                 | 9.944574012151549  |
    |         | Breakfast of Champions (1999)       | Comedy                 | 9.55661860430112   |
    |         | Funny Bones (1995)                  | Comedy                 | 9.52778917835076   |
    |         | Paradise Road (1997)                | Drama/War              | 9.1643621767929133 |
    |         | Surviving Picasso (1996)            | Drama                  | 8.807353289233772  |
    +---------+-------------------------------------+------------------------+--------------------+
    | ...     | ...                                 | ...                    | ...                |
    +---------+-------------------------------------+------------------------+--------------------+
    

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.

  • Puedes borrar el proyecto que creaste.
  • De lo contrario, puedes mantener el proyecto y borrar el conjunto de datos.

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 el panel de navegación, haz clic en el conjunto de datos bqml_tutorial 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, la tabla y todos los datos.

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

Borra tu proyecto

Para borrar el proyecto, haz lo siguiente:

  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.

¿Qué sigue?