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

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

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

创建数据集

创建 BigQuery 数据集以存储机器学习模型。

控制台

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery 页面

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

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

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

    • 数据集 ID 部分,输入 bqml_tutorial

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

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

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"
  }
}

BigQuery DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

准备示例数据

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. 在左侧窗格中,点击 Explorer

    突出显示的“探索器”窗格按钮。

    如果您没有看到左侧窗格,请点击 展开左侧窗格以打开该窗格。

  3. 探索器窗格中,展开您的项目,然后点击数据集

  4. 点击 bqml_tutorial 数据集。您还可以使用搜索功能或过滤器查找数据集。

  5. 点击模型标签页。

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

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

    +-----------+--------------------+--------------------+
    | 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. 选择每位访问者的前 5 个结果。在查询编辑器中,粘贴以下查询,然后点击运行

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