

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 评估 Amazon Personalize 域推荐器
<a name="evaluating-recommenders"></a>

 您可通过离线和在线指标来评估您的推荐器的性能。*在线指标* 是您在用户与实时建议的交互中观察到的实证结果。例如，您可以记录用户在浏览您的目录时的点击率。您负责生成和记录任何在线指标。

 *离线指标* 是 Amazon Personalize 在您创建推荐器时生成的指标。您可使用离线指标来评估推荐器底层模型的性能。您可以查看修改推荐器配置产生的影响，并且可以比较同一数据集组中使用*相同数据*但针对不同应用场景进行训练的推荐器的结果。

避免比较使用不同数据训练的不同推荐器的指标。指标的差异可能源于数据的差异，而不是源于模型性能。例如，您可能有一个数据集组，其中包含每个用户的稀疏 `purchase` 事件数据，而另一个数据集组则包含可靠的 `view` 事件数据。根据像 `precision at K` 这样的指标，由于交互次数较多，根据查看事件数据训练的推荐器可能会错误地表现得更好。

 为了获得性能指标，Amazon Personalize 将输入的交互数据拆分为训练集和测试集。训练集由 90% 的用户及其交互数据组成。测试集由剩余的 10% 的用户及其交互数据组成。

 然后，Amazon Personalize 使用训练集创建推荐器。训练完成后，Amazon Personalize 会向新推荐器提供测试集中每位用户 90% 的最早数据作为输入。然后，Amazon Personalize 通过将推荐器生成的建议与测试集中每位用户 10% 的最新数据中的实际交互进行比较，计算指标。

**Topics**
+ [检索指标](#retrieving-recommender-metrics)
+ [指标定义](#metric-definitions-recommenders)
+ [示例](#working-with-recommender-metrics-example)
+ [其他资源](#additional-metrics-resources-recommenders)

## 检索指标
<a name="retrieving-recommender-metrics"></a>

在您的推荐器处于活动状态后，您可以在 Amazon Personalize 控制台中查看推荐器的指标，或者通过调用 [DescribeRecommender](API_DescribeRecommender.md) 操作来检索指标。

**Topics**
+ [查看指标（控制台）](#retrieving-recommender-metrics-console)
+ [检索指标 (AWS CLI)](#retrieving-recommender-metrics-cli)
+ [检索指标 (AWS SDKs)](#retrieving-recommender-metrics-sdk)

### 查看指标（控制台）
<a name="retrieving-recommender-metrics-console"></a>

要在控制台中查看推荐器指标，请导航到推荐器的详细信息页面。

1. 在[https://console.aws.amazon.com/personalize/家](https://console.aws.amazon.com/personalize/home)中打开 Amazon Personalize 控制台并登录您的账户。

1. 在**数据集组**页面上，选择您的域数据集组。

1. 在导航窗格中，选择**推荐器**。

1. 从推荐器列表中，选择要查看其指标的那个推荐器。

### 检索指标 (AWS CLI)
<a name="retrieving-recommender-metrics-cli"></a>

以下代码显示了如何使用 AWS CLI获取推荐器的指标。

```
aws personalize describe-recommender \
--recommender-arn recommender arn
```

以下是为 VIDEO\$1ON\$1DEMAND 域的*热门精选* 使用案例创建的推荐器指标输出的示例。

```
{
    "recommender": {
        "recommenderArn": "arn:aws:personalize:region:acct-id:recommender/recommenderName",
        "datasetGroupArn": "arn:aws:personalize:region:acct-id:dataset-group/dsGroupName",
        "name": "name123",
        "recipeArn": "arn:aws:personalize:::recipe/aws-vod-top-picks",
        "modelMetrics": {
            "coverage": 0.27,
            "mean_reciprocal_rank_at_25": 0.0379,
            "normalized_discounted_cumulative_gain_at_5": 0.0405,
            "normalized_discounted_cumulative_gain_at_10": 0.0513,
            "normalized_discounted_cumulative_gain_at_25": 0.0828,
            "precision_at_5": 0.0136,
            "precision_at_10": 0.0102,
            "precision_at_25": 0.0091,
        }
        "recommenderConfig": {},
        "creationDateTime": "2022-05-06T10:11:24.589000-07:00",
        "lastUpdatedDateTime": "2022-05-06T10:34:33.270000-07:00",
        "status": "ACTIVE",
    }
}
```

### 检索指标 (AWS SDKs)
<a name="retrieving-recommender-metrics-sdk"></a>

以下代码显示了如何使用 SDK for Python (Boto3) 获取推荐器的指标。

```
import boto3

personalize = boto3.client('personalize')

response = personalize.describe_recommender(
    recommenderArn = 'recommender_arn'
)
print(response['recommender']['modelMetrics'])
```

以下是为 VIDEO\$1ON\$1DEMAND 域的*热门精选* 使用案例创建的推荐器指标输出的示例。

```
{
    "recommender": {
        "recommenderArn": "arn:aws:personalize:region:acct-id:recommender/recommenderName",
        "datasetGroupArn": "arn:aws:personalize:region:acct-id:dataset-group/dsGroupName",
        "name": "name123",
        "recipeArn": "arn:aws:personalize:::recipe/aws-vod-top-picks",
        "modelMetrics": {
            "coverage": 0.27,
            "mean_reciprocal_rank_at_25": 0.0379,
            "normalized_discounted_cumulative_gain_at_5": 0.0405,
            "normalized_discounted_cumulative_gain_at_10": 0.0513,
            "normalized_discounted_cumulative_gain_at_25": 0.0828,
            "precision_at_5": 0.0136,
            "precision_at_10": 0.0102,
            "precision_at_25": 0.0091,
        }
        "recommenderConfig": {},
        "creationDateTime": "2022-05-06T10:11:24.589000-07:00",
        "lastUpdatedDateTime": "2022-05-06T10:34:33.270000-07:00",
        "status": "ACTIVE",
    }
}
```

## 指标定义
<a name="metric-definitions-recommenders"></a>

下文使用以下术语描述了 Amazon Personalize 为推荐器生成的指标：
+ *相关建议* 是针对用户实际与之交互的物品的建议。这些物品来自测试集中每个用户 10% 的最新交互数据。
+ *排名* 是指推荐项在推荐列表中的位置。位置 1（列表的顶部）被假定为与用户最相关。

对于每个指标，数字越大（越接近 1）越好。要深入了解相关信息，请参阅[其他资源](#additional-metrics-resources-recommenders)中列出的资源。

**覆盖**  
 *覆盖率* 的值可指明，Amazon Personalize 可能推荐的唯一物品占交互数据集和物品数据集中唯一物品总数的比例。覆盖率分数越高，意味着 Amazon Personalize 推荐的物品越多，而不是向不同用户重复推荐相同的几件物品。针对具有物品浏览功能的使用案例（例如*热门精选* (VIDEO\$1ON\$1DEMAND) 和*为您推荐* (ECOMMERCE)），其覆盖率比不具备这一功能的使用案例更高。

**前 25 项中平均倒数排名**  
该指标可指明，模型在排名靠前的位置生成相关建议的能力。如果您要为用户生成相关搜索结果，且不希望用户选择列表中排名靠后的物品，则可以选择*前 25 项中平均倒数排名* 较高的模型。例如，用户经常在搜索结果中选择第一个烹饪食谱。  
 Amazon Personalize 使用建议请求的平均倒数排名分数来计算该指标。每个倒数排名分数的计算方法如下：`1 / the rank of the highest item interacted with by the user`，其中可能的总排名为 25。用户与之交互的其他排名较低的物品将被忽略。如果用户选择了第一个物品，则分数为 1。如果没有选择任何物品，则分数为 0。  
 例如，您可以向三个不同的用户分别显示 25 条建议：  
+ 如果用户 1 单击排名为 *4* 的物品和排名为 *10* 的物品，则其倒数排名分数为 *1/4*。
+ 如果用户 2 单击排名为 *2* 的物品、排名为 *4* 的物品以及排名为 *12* 的物品，则其倒数排名分数为 1/2。
+ 如果用户 3 单击排名为 *6* 的单个物品，则其倒数排名分数为 1/6。
 所有建议请求的平均倒数排名（在本例中为 3）的计算公式为 `(1/4 + 1/2 + 1/6) / 3 = .3056`。  


**K（5、10 或 25）项标准化折扣累计增益 (NDCG)**  
该指标可指明模型对建议的排名，其中 K 是样本大小，即 5、10 或 25 条建议。如果您最感兴趣的是建议的排名，而不仅仅是排名最高的物品，则此指标非常有用（有关此信息，请参阅 `mean reciprocal rank at 25`）。例如，如果您的应用程序在轮播中一次最多显示 10 部电影，则 `NDCG at 10` 分数将非常有用。  
Amazon Personalize 根据测试集中每位用户的排名位置为建议分配权重，来计算 NDCG。每条建议被折扣一倍（给定较低的权重），具体取决于其位置。最终指标是测试集中所有用户的平均值。K 项标准化折扣累计增益假定列表中排名较低的推荐与列表中排名较高的推荐相比相关性更低。  
Amazon Personalize 使用加权系数 `1/log(1 + position)`，其中列表的顶部是位置 `1`。

**K 项精度**  
该指标可指明，根据样本大小 K（5、10 或 25）条建议，模型建议的相关性。  
 Amazon Personalize 按照以下方法计算此指标：测试集中每个用户前 K 条建议中的相关建议数量除以 K，其中 K 为 5、10 或 25。最终指标是测试集中所有用户的平均值。  
例如，如果您向用户推荐 10 个物品，而用户与其中 3 个物品交互，则 K 项精度为：3 个正确预测的物品除以总计 10 个建议物品 (`3 / 10 = .30`)。  
此指标奖励相关物品的精准建议。分数越接近 1，模型就越精确。

## 示例
<a name="working-with-recommender-metrics-example"></a>

以下是可为特定用户生成建议列表的推荐器的简单示例。第二个和第五个推荐与此用户的测试数据中的记录匹配。这些是相关的推荐。如果将 `K` 设置为 `5`，将为该用户生成以下指标。

**reciprocal\$1rank**  
计算：1/2  
结果：0.5000

**normalized\$1discounted\$1cumulative\$1gain\$1at\$15**  
计算：(1/log(1 \$1 2) \$1 1/log(1 \$1 5)) / (1/log(1 \$1 1) \$1 1/log(1 \$1 2))  
结果：0.6241

**precision\$1at\$15**  
计算：2/5  
结果：0.4000

## 其他资源
<a name="additional-metrics-resources-recommenders"></a>

要深入了解推荐器系统的不同类型的指标，请参阅以下外部资源：
+ [MRR vs MAP vs NDCG：排名感知评估指标及何时使用这些指标](https://medium.com/swlh/rank-aware-recsys-evaluation-metrics-5191bba16832/)
+  [折扣累计增益：您应该了解的排名指标](https://medium.com/@maeliza.seymour/discounted-cumulative-gain-the-ranking-metrics-you-should-know-about-e1d1623f8cd9) 
+  [推荐器系统的 K 项查全率和精度](https://medium.com/@bond.kirill.alexandrovich/precision-and-recall-in-recommender-systems-and-some-metrics-stuff-ca2ad385c5f8) 
+  [推荐器系统的排名评估指标](https://towardsdatascience.com/ranking-evaluation-metrics-for-recommender-systems-263d0a66ef54) 