使用矩阵分解模型根据显式反馈创建推荐


本教程将介绍如何创建矩阵分解模型,并使用 movielens1m 数据集中的客户电影评分对其进行训练。然后,您可以使用矩阵分解模型为用户生成电影推荐。

使用客户提供的评分来训练模型称为“使用显式反馈进行训练”。当您使用显式反馈作为训练数据时,系统会使用交替最小二乘算法训练矩阵分解模型。

目标

本教程将指导您完成以下任务:

费用

本教程使用 Google Cloud 的收费组件,包括以下组件:

  • BigQuery
  • BigQuery ML

如需了解有关 BigQuery 费用的更多信息,请参阅 BigQuery 价格页面。

如需详细了解 BigQuery ML 费用,请参阅 BigQuery ML 价格

准备工作

  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。如需在现有项目中激活 BigQuery,请前往

    Enable the BigQuery API.

    Enable the API

所需权限

  • 如需创建数据集,您需要拥有 bigquery.datasets.create IAM 权限。
  • 如需创建连接资源,您需要以下权限:

    • bigquery.connections.create
    • bigquery.connections.get
  • 如需创建模型,您需要以下权限:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 如需运行推理,您需要以下权限:

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

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅 IAM 简介

创建数据集

创建 BigQuery 数据集以存储您的机器学习模型:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery 页面

  2. 探索器窗格中,点击您的项目名称。

  3. 点击 查看操作 > 创建数据集

    创建数据集。

  4. 创建数据集页面上,执行以下操作:

    • 数据集 ID 部分,输入 bqml_tutorial

    • 位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。

      公共数据集存储在 US 多区域中。为简单起见,请将数据集存储在同一位置。

    • 保持其余默认设置不变,然后点击创建数据集

      创建数据集页面。

上传 Movielens 数据

使用 bq 命令行工具movielens1m 数据上传到 BigQuery。

请按照以下步骤上传 movielens1m 数据:

  1. 打开 Cloud Shell:

    激活 Cloud Shell

  2. 将评分数据上传到 ratings 表中。在命令行中,粘贴以下查询并按 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. 将电影数据上传到 movies 表中。在命令行中,粘贴以下查询并按 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
    

创建模型

创建一个矩阵分解模型,并使用 ratings 表中的数据对其进行训练。该模型经过训练,可根据客户提供的电影评分,为每个用户-推荐项对预测评分。

以下 CREATE MODEL 语句使用以下列生成推荐内容:

  • user_id - 用户 ID。
  • item_id - 电影 ID。
  • rating - 用户对内容给出的明确评分(从 1 到 5)。

请按照以下步骤创建模型:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    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`;

    查询大约需要 10 分钟才能完成,之后 mf_explicit 模型会显示在探索器窗格中。由于查询使用 CREATE MODEL 语句来创建模型,因此您看不到查询结果。

获取训练统计信息

您还可以选择在 Google Cloud 控制台中查看模型的训练统计信息。

机器学习算法通过使用不同的参数对模型进行多次迭代,然后选择能使损失最小化的模型版本,从而构建模型。该过程称为经验风险最小化。通过模型的训练统计信息,您可以查看与模型的每次迭代相关联的损失。

如需查看模型的训练统计信息,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 探索器窗格中,展开您的项目,展开 bqml_tutorial 数据集,然后展开模型文件夹。

  3. 点击 mf_explicit 模型,然后点击训练标签页

  4. 查看方式部分,点击表格。结果应如下所示:

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

    训练数据丢失列表示在训练模型后计算得出的损失指标。由于这是矩阵分解模型,因此此列显示均方误差

您还可以使用 ML.TRAINING_INFO 函数查看模型训练统计信息。

评估模型

使用 ML.EVALUATE 函数评估模型的性能。ML.EVALUATE 函数根据训练数据中的实际用户电影评分来评估模型返回的预测电影评分。

请按照以下步骤评估模型:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

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

    结果应如下所示:

    +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+
    | 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 |
    +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+
    

    评估结果中的一项重要指标为 R2 得分。R2 得分为统计测量结果,用于确定线性回归预测是否接近实际数据。0 值表示该模型未能说明响应数据相对于平均值的可变性。1 值表示该模型说明了响应数据相对于平均值的所有可变性。

    如需详细了解 ML.EVALUATE 函数输出,请参阅矩阵分解模型

您也可以在不提供输入数据的情况下调用 ML.EVALUATE。它将使用在训练期间计算得出的评估指标。

获取部分“用户-推荐项”对的预测评分

使用 ML.RECOMMEND 获取五位用户对每部电影的预测评分。

如需获取预测分级,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

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

    结果应如下所示:

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

生成推荐

使用预测的评分为每位用户生成前五部推荐电影。

请按照以下步骤生成建议:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 将预测的评分写入表中。在查询编辑器中,粘贴以下查询并点击运行

    CREATE OR REPLACE TABLE `bqml_tutorial.recommend`
    AS
    SELECT
      *
    FROM
      ML.RECOMMEND(MODEL `bqml_tutorial.mf_explicit`);
  3. 将预测评分与电影信息联接起来,然后为每位用户选择前五名结果。在查询编辑器中,粘贴以下查询并点击运行

    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;

    结果应如下所示:

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

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  • 删除您在教程中创建的项目。
  • 或者,保留项目但删除数据集。

删除数据集

删除项目也将删除项目中的所有数据集和所有表。如果您希望重复使用该项目,则可以删除在本教程中创建的数据集:

  1. 如有必要,请在 Google Cloud 控制台中打开 BigQuery 页面。

    转到 BigQuery 页面

  2. 在导航窗格中,点击您创建的 bqml_tutorial 数据集。

  3. 点击窗口右侧的删除数据集。此操作会删除相关数据集、表和所有数据。

  4. 删除数据集对话框中,通过输入数据集的名称 (bqml_tutorial) 来确认该删除命令,然后点击删除

删除项目

要删除项目,请执行以下操作:

  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.

后续步骤