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


本教程介绍了如何创建矩阵分解模型,并在公开 GA360_test.ga_sessions_sample中的 Google Analytics 360 用户会话数据上对其进行训练。然后,您可以使用矩阵分解模型为网站用户生成内容推荐。

使用间接的客户偏好信息(例如用户会话时长)来训练模型称为使用隐式反馈训练。当您使用隐式反馈作为训练数据时,系统会使用加权交替最小二乘算法训练矩阵分解模型。

目标

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

费用

本教程使用 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.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 如需运行推理,您需要以下权限:

    • 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 多区域中。为简单起见,请将数据集存储在同一位置。

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

    填充了值的“创建数据集”页面。

bq

如需创建新数据集,请使用带有 --location 标志的 bq mk 命令。 如需查看完整的潜在参数列表,请参阅 bq mk --dataset 命令参考文档。

  1. 创建一个名为 bqml_tutorial 的数据集,并将数据位置设置为 US,说明为 BigQuery ML tutorial dataset

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

    该命令使用的不是 --dataset 标志,而是 -d 快捷方式。如果省略 -d--dataset,该命令会默认创建一个数据集。

  2. 确认已创建数据集:

    bq ls

API

使用已定义的数据集资源调用 datasets.insert 方法。

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

准备示例数据

GA360_test.ga_sessions_sample 表中的数据转换为更适合模型训练的结构,然后将这些数据写入 BigQuery 表。以下查询会计算每位用户对每项内容的会话时长,然后您可以将其用作隐式反馈来推断用户对相应内容的偏好。

请按照以下步骤创建训练数据表:

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

    转到 BigQuery

  2. 创建训练数据表。在查询编辑器中,粘贴以下查询,然后点击运行

    CREATE OR REPLACE TABLE `bqml_tutorial.analytics_session_data`
    AS
    WITH
      visitor_page_content AS (
        SELECT
          fullVisitorID,
          (
            SELECT
              MAX(
                IF(
                  index = 10,
                  value,
                  NULL))
            FROM
              UNNEST(hits.customDimensions)
          ) AS latestContentId,
          (LEAD(hits.time, 1) OVER (PARTITION BY fullVisitorId ORDER BY hits.time ASC) - hits.time)
            AS session_duration
        FROM
          `cloud-training-demos.GA360_test.ga_sessions_sample`,
          UNNEST(hits) AS hits
        WHERE
          # only include hits on pages
          hits.type = 'PAGE'
        GROUP BY
          fullVisitorId,
          latestContentId,
          hits.time
      )
    # aggregate web stats
    SELECT
      fullVisitorID AS visitorId,
      latestContentId AS contentId,
      SUM(session_duration) AS session_duration
    FROM
      visitor_page_content
    WHERE
      latestContentId IS NOT NULL
    GROUP BY
      fullVisitorID,
      latestContentId
    HAVING
      session_duration > 0
    ORDER BY
      latestContentId;
  3. 查看部分训练数据。在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT * FROM `bqml_tutorial.analytics_session_data` LIMIT 5;

    结果应如下所示:

    +---------------------+-----------+------------------+
    | visitorId           | contentId | session_duration |
    +---------------------+-----------+------------------+
    | 7337153711992174438 | 100074831 | 44652            |
    +---------------------+-----------+------------------+
    | 5190801220865459604 | 100170790 | 121420           |
    +---------------------+-----------+------------------+
    | 2293633612703952721 | 100510126 | 47744            |
    +---------------------+-----------+------------------+
    | 5874973374932455844 | 100510126 | 32109            |
    +---------------------+-----------+------------------+
    | 1173698801255170595 | 100676857 | 10512            |
    +---------------------+-----------+------------------+
    

创建模型

创建矩阵分解模型,并根据 analytics_session_data 表中的数据对其进行训练。该模型经过训练,可为每个 visitorId-contentId 对预测置信度评分。系统创建置信度评分的方法是,按会话时长中位数确定中心值并进行扩缩。系统会将会话时长超过中位数 3.33 倍的记录过滤为离群值。

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

  • visitorId - 访问者 ID。
  • contentId - 内容 ID。
  • rating - 为每个访问者-内容对计算的隐式评分(从 0 到 1,居中和缩放)。
  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

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

    CREATE OR REPLACE MODEL `bqml_tutorial.mf_implicit`
      OPTIONS (
        MODEL_TYPE = 'matrix_factorization',
        FEEDBACK_TYPE = 'implicit',
        USER_COL = 'visitorId',
        ITEM_COL = 'contentId',
        RATING_COL = 'rating',
        L2_REG = 30,
        NUM_FACTORS = 15)
    AS
    SELECT
      visitorId,
      contentId,
      0.3 * (1 + (session_duration - 57937) / 57937) AS rating
    FROM `bqml_tutorial.analytics_session_data`
    WHERE 0.3 * (1 + (session_duration - 57937) / 57937) < 1;

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

获取训练统计信息

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

机器学习算法通过使用不同的参数创建模型的多个迭代,然后选择可最大限度降低损失的模型版本来构建模型。该过程称为经验风险最小化。 借助模型的训练统计信息,您可以查看与模型的每次迭代相关联的损失。

请按照以下步骤查看模型的训练统计信息:

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

    转到 BigQuery

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

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

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

    +-----------+--------------------+--------------------+
    | Iteration | Training Data Loss | Duration (seconds) |
    +-----------+--------------------+--------------------+
    |  5        | 0.0027             | 47.27              |
    +-----------+--------------------+--------------------+
    |  4        | 0.0028             | 39.60              |
    +-----------+--------------------+--------------------+
    |  3        | 0.0032             | 55.57              |
    +-----------+--------------------+--------------------+
    |  ...      | ...                | ...                |
    +-----------+--------------------+--------------------+
    

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

评估模型

使用 ML.EVALUATE 函数评估模型的性能。ML.EVALUATE 函数根据训练期间计算得出的评估指标来评估模型返回的预测内容评分。

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

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

    转到 BigQuery

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

    SELECT
      *
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.mf_implicit`);

    结果应如下所示:

    +------------------------+-----------------------+---------------------------------------+---------------------+
    | mean_average_precision |  mean_squared_error   | normalized_discounted_cumulative_gain |    average_rank     |
    +------------------------+-----------------------+---------------------------------------+---------------------+
    |     0.4434341257478137 | 0.0013381759837648962 |                    0.9433280547112802 | 0.24031636088594222 |
    +------------------------+-----------------------+---------------------------------------+---------------------+
    

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

获取部分“访问者与内容”对的预测评分

使用 ML.RECOMMEND 获取五位网站访问者对每项内容的预测评分。

请按照以下步骤获取预测评分:

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

    转到 BigQuery

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

    SELECT
      *
    FROM
      ML.RECOMMEND(
        MODEL `bqml_tutorial.mf_implicit`,
        (
          SELECT
            visitorId
          FROM
            `bqml_tutorial.analytics_session_data`
          LIMIT 5
        ));

    结果应如下所示:

    +-------------------------------+---------------------+-----------+
    | predicted_rating_confidence   | visitorId           | contentId |
    +-------------------------------+---------------------+-----------+
    | 0.0033608418060270262         | 7337153711992174438 | 277237933 |
    +-------------------------------+---------------------+-----------+
    | 0.003602395397293956          | 7337153711992174438 | 158246147 |
    +-------------------------------+---------------------+--  -------+
    | 0.0053197670652785356         | 7337153711992174438 | 299389988 |
    +-------------------------------+---------------------+-----------+
    | ...                           | ...                 | ...       |
    +-------------------------------+---------------------+-----------+
    

生成推荐

使用预测评分为每个访问者 ID 生成前五个推荐内容 ID。

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

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

    转到 BigQuery

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

    CREATE OR REPLACE TABLE `bqml_tutorial.recommend_content`
    AS
    SELECT
      *
    FROM
      ML.RECOMMEND(MODEL `bqml_tutorial.mf_implicit`);
  3. 选择每个访问者的前五个结果。在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
      visitorId,
      ARRAY_AGG(
        STRUCT(contentId, predicted_rating_confidence)
        ORDER BY predicted_rating_confidence DESC
        LIMIT 5) AS rec
    FROM
      `bqml_tutorial.recommend_content`
    GROUP BY
      visitorId;

    结果应如下所示:

    +---------------------+-----------------+---------------------------------+
    | visitorId           | rec:contentId   | rec:predicted_rating_confidence |
    +---------------------+-----------------+-------------------------  ------+
    | 867526255058981688  | 299804319       | 0.88170525357178664             |
    |                     | 299935287       | 0.54699439944935124             |
    |                     | 299410466       | 0.53424780863188659             |
    |                     | 299826767       | 0.46949603950374219             |
    |                     | 299809748       | 0.3379991197434149              |
    +---------------------+-----------------+---------------------------------+
    | 2434264018925667659 | 299824032       | 1.3903516407308065              |
    |                     | 299410466       | 0.9921995618196483              |
    |                     | 299903877       | 0.92333625294129218             |
    |                     | 299816215       | 0.91856701667757279             |
    |                     | 299852437       | 0.86973661454890561             |
    +---------------------+-----------------+---------------------------------+
    | ...                 | ...             | ...                             |
    +---------------------+-----------------+---------------------------------+
    

清理

为避免因本教程中使用的资源导致您的 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.

后续步骤