

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

# 通过指标评估 Amazon Personalize 解决方案版本
<a name="working-with-training-metrics"></a>

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

 *离线指标* 是 Amazon Personalize 在您训练解决方案版本时生成的指标。您可使用离线指标来评估模型的性能。您可以查看修改解决方案超参数产生的影响，并且可以比较同一数据集组中使用*相同数据*但针对不同配方进行训练的模型的结果。

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

 为了获得性能指标，Amazon Personalize 将输入的交互数据拆分为训练集、测试集以及验证集（验证集适用于 PERSONALIZED\$1ACTIONS）。拆分取决于您选择的食谱类型：
+  对于 USER\$1SEGMENTATION 食谱，训练集由每个用户 80% 的交互数据组成，测试集由每个用户 20% 的交互数据组成。
+  对于所有其他食谱类型，训练集由 90% 的用户及其交互数据组成。测试集由剩余的 10% 的用户及其交互数据组成。

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

为了生成基准以进行比较，我们建议使用[热门程度-计数](native-recipe-popularity.md)食谱，该食谱会推荐前 K 项最受欢迎的物品。

**Topics**
+ [检索解决方案版本指标](#working-with-training-metrics-metrics)
+ [指标定义](#metric-definitions)
+ [示例](#working-with-training-metrics-example)
+ [其他资源](#additional-metrics-resources)

## 检索解决方案版本指标
<a name="working-with-training-metrics-metrics"></a>

创建解决方案版本后，您可以使用指标来评估其性能。您可以使用 Amazon Personalize 控制台Amazon Command Line Interface（Amazon CLI）和，检索解决方案版本的指标AmazonSDKs。

**Topics**
+ [检索解决方案版本指标（控制台）](#retrieving-solution-version-metrics-console)
+ [检索解决方案版本指标 (Amazon CLI)](#retrieve-metrics-cli)
+ [检索解决方案版本指标 (AmazonSDKs)](#retrieve-metrics-sdks)

### 检索解决方案版本指标（控制台）
<a name="retrieving-solution-version-metrics-console"></a>

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

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

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

1. 在导航窗格中，选择**自定义资源**，然后选择**解决方案和食谱**。

1. 选择您的解决方案。

1. 在**解决方案版本**中，选择您的解决方案版本以查看其详细信息页面。指标列在底部窗格的**解决方案版本指标**选项卡上。有关指标的定义，请参阅[指标定义](#metric-definitions)。

   既然您评估了解决方案版本，就可以通过最适合您使用案例的指标来部署解决方案版本，以创建市场活动。有关部署解决方案的更多信息，请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。

### 检索解决方案版本指标 (Amazon CLI)
<a name="retrieve-metrics-cli"></a>

您通过调用 [GetSolutionMetrics](API_GetSolutionMetrics.md) 操作为特定解决方案版本检索指标。以下代码显示了如何使用 Amazon CLI 检索指标。

```
personalize get-solution-metrics --solution-version-arn solution version ARN
```

以下是使用带有其他优化目标的 [User-Personalization](native-recipe-new-item-USER_PERSONALIZATION.md) 食谱创建的解决方案版本的输出示例。

```
{
    "solutionVersionArn": "arn:aws:personalize:us-west-2:acct-id:solution/SolutionName/<version-id>",
    "metrics": {
        "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,
        "average_rewards_at_k": 0.653
    }
}
```

有关每个指标的说明，请参阅[指标定义](#metric-definitions)。既然您评估了解决方案版本，就可以通过最适合您使用案例的指标来部署解决方案版本，以创建市场活动。有关部署解决方案的更多信息，请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。

### 检索解决方案版本指标 (AmazonSDKs)
<a name="retrieve-metrics-sdks"></a>

您通过调用 [GetSolutionMetrics](API_GetSolutionMetrics.md) 操作为特定解决方案版本检索指标。使用以下代码来检索指标。

------
#### [ SDK for Python (Boto3) ]

```
import boto3

personalize = boto3.client('personalize')

response = personalize.get_solution_metrics(
    solutionVersionArn = 'solution version arn')

print(response['metrics'])
```

------
#### [ SDK for Java 2.x ]

```
public static void getSolutionVersionMetrics(PersonalizeClient personalizeClient, String solutionVersionArn) {

    try {
        GetSolutionMetricsRequest request = GetSolutionMetricsRequest.builder()
                .solutionVersionArn(solutionVersionArn)
                .build();
        Map<String, Double> metrics = personalizeClient.getSolutionMetrics(request).metrics();
        metrics.forEach((key, value) -> System.out.println(key + " " + value));
    } catch (PersonalizeException e ) {
        System.err.println(e.awsErrorDetails().errorMessage());
        System.exit(1);
    }
}
```

------

以下是使用带有其他优化目标的 [User-Personalization](native-recipe-new-item-USER_PERSONALIZATION.md) 食谱创建的解决方案版本的输出示例。

```
{
    "solutionVersionArn": "arn:aws:personalize:us-west-2:acct-id:solution/MovieSolution/<version-id>",
    "metrics": {
        "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,
        "average_rewards_at_k": 0.653
    }
}
```

有关每个指标的说明，请参阅[指标定义](#metric-definitions)。既然您评估了解决方案版本，就可以通过最适合您使用案例的指标来部署解决方案版本，以创建市场活动。有关部署解决方案的更多信息，请参阅[通过市场活动部署 Amazon Personalize 解决方案版本创建市场活动](campaigns.md)。

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

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

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

**覆盖**  
*覆盖率*的值告诉您，Amazon Personalize 可能推荐的唯一物品（针对物品推荐）、操作（针对操作推荐）或用户（针对用户细分推荐）在您的数据集中的唯一记录总数中所占的比例。  
覆盖率分数越高，意味着 Amazon Personalize 建议的目录越多，而不是重复记录相同的物品。对于具有物品浏览功能的配方（例如 User-Personalization），其覆盖率比不具备该功能的配方（例如 Similar-Items）的覆盖率更高。

**前 25 项中平均倒数排名**  
该指标可指明，模型在排名靠前的位置生成相关物品建议的能力。  
 如果您要为用户生成物品搜索结果，且不希望用户选择列表中排名靠后的物品，则可以选择*前 25 项中平均倒数排名*较高的模型。例如，用户经常在搜索结果中选择第一个烹饪食谱。Amazon Personalize 不会为 PERSONALIZED\$1ACTIONS 或 USER\$1SEGMENTATION 配方生成此指标。  
 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。每条建议被折扣一倍（给定较低的权重），具体取决于其位置。最终指标是测试集中所有用户的平均 `NDCG at K`。`NDCG at 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，模型就越精确。

**精度**  
如果您使用 Next-Best-Action配方训练解决方案版本，Amazon Personalize 会生成一个`precision`指标，而不是`precision at K`。该指标告诉您，模型在预测用户实际采取的操作方面的表现如何。  
 为了计算 `precision`，对于数据集中的每个操作，Amazon Personalize 将经正确预测会采取该操作的用户数除以建议该操作的总次数。然后，Amazon Personalize 计算数据集中所有操作的平均值。  
例如，如果向 100 个用户建议了一个操作，60 个用户采取了该操作，而 40 个用户没有采取该操作，则该操作的 `precision` 为 `60 / 100 = .60`。然后，Amazon Personalize 将此计算应用于所有操作并返回平均值。  
此指标奖励相关操作的精准建议。分数越接近 1，模型就越精确。

**average\$1rewards\$1at\$1k**  
当您为具有优化目标的解决方案创建解决方案版本（训练模型）时，Amazon Personalize 会生成 `average_rewards_at_k` 指标。`average_rewards_at_k` 的分数可指明，解决方案版本在实现目标方面的性能如何。为了计算该指标，Amazon Personalize 按如下方式计算每位用户的奖励：  
`rewards_per_user = total rewards from the user's interactions with their top 25 reward generating recommendations / total rewards from the user's interactions with recommendations`  
最终 `average_rewards_at_k` 是所有 `rewards_per_user` 的平均值，即标准化为小于或等于 1 且大于 0 的十进制值。该值越接近 1，表示您期望从建议中获得的每个用户平均收益就越多。  
例如，如果您的目标是最大限度地提高单击收入，则 Amazon Personalize 将按以下方法计算每个用户分数：将用户单击的前 25 个最昂贵建议物品产生的总收入除以用户单击的所有推荐物品产生的总收入。然后，Amazon Personalize 会返回所有用户分数的标准化平均值。`average_rewards_at_k` 越接近 1，表示您期望从建议中获得的每个用户平均收入就越多。  
 有关更多信息，请参阅 [针对其他目标优化解决方案](optimizing-solution-for-objective.md)。

**normalized\$1discounted\$1cumulative\$1gain\$1with\$1event\$1weights\$1at\$1k**  
 当您为具有事件配置的解决方案创建解决方案版本（训练模型）时，Amazon Personalize 会生成 `normalized_discounted_cumulative_gain_with_event_weights_at_k` 指标。`normalized_discounted_cumulative_gain_with_event_weights_at_k` 的分数表示在考虑为每个事件类型设置的事件权重的情况下，解决方案版本的表现情况。  
 它与 k 阶标准化折损累积增益（NDCG）类似，只不过对每个正确预测的奖励分数会进行加权处理。与之不同的是，在原始 K 阶 NDCG 中，每个正确预测的权重均为 1。例如，如果“购买”权重为 0.3，“点击”权重为 0.1，正确预测“购买”项目将获得 1.5 的奖励分数，而预测“点击”项目将获得 0.5 的奖励分数。  
 有关更多信息，请参阅 [使用事件配置优化解决方案](optimizing-solution-events-config.md)。

**趋势预测准确度**  
如果您使用 [Trending-Now](native-recipe-trending-now.md) 食谱训练解决方案版本，则表示模型推荐的物品的受欢迎程度的增长率。趋势预测准确度越高（越接近 1），模型就越能正确识别热门物品。  
 为了计算受欢迎程度增长率，Amazon Personalize 将所有推荐物品的受欢迎程度增长率除以前 25 个热门物品的总受欢迎程度增长率。这些物品来自测试集中的实际交互。  
 根据您的数据分布和您选择的趋势发现频率，趋势预测准确度的值可以为 0.0。

**命中率（K 项命中率）**  
如果您使用 USER\$1SEGMENTATION 食谱训练解决方案版本，则表示预测的相关度最高的 K 个结果中与实际用户相匹配的平均用户数。实际用户是指与测试集中的物品进行实际交互的用户。K 是最相关的用户中前 1% 的用户。该值越高，表示预测越准确。

**查全率（K 项查全率）**  
如果您使用 USER\$1SEGMENTATION 食谱训练解决方案版本，则表示预测的相关度最高的 K 个结果中与实际用户相匹配的平均预测用户百分比。实际用户是指与测试集中的物品进行实际交互的用户。K 是最相关的用户中前 1% 的用户。该值越高，表示预测越准确。

**查全率**  
如果您使用 Next-Best-Action配方训练解决方案版本，则该指标会告诉您您的解决方案版本在发现用户将要与之交互的操作方面的表现如何。  
 为了计算 `recall`，对于数据集中的每个操作，Amazon Personalize 将经正确预测会采取该操作的用户数量除以测试集中实际采取该操作的总用户数量。然后，Amazon Personalize 计算数据集中所有操作的平均值。  
例如，如果 100 名用户在测试集中执行了操作，而 Amazon Personalize 预测其中有 50 名用户将采取该操作，则该操作的 `recall` 为 `50 / 100 = .50`。然后，Amazon Personalize 将此计算应用于所有操作并返回平均值。

**曲线下方的区域 (AUC)**  
如果您使用 PERSONALIZED\$1ACTIONS 配方训练了解决方案版本，则为您的解决方案版本的“接收者操作特征”曲线下方的区域。该指标告诉您，解决方案版本在正确识别用户将要采取的操作方面的表现如何。  
“接收者操作特征”曲线绘制了解决方案版本的性能。它绘制了不同阈值下的真阳性（正确预测为相关的操作）和假阳性（错误地预测为相关的操作）的比率。曲线下方的区域 (AUC) 是根据其曲线总结解决方案版本的性能的分数。  
 解决方案版本的 AUC 可介于 0 和 1 之间。越接近 1，模型就越能更好地预测用户的相关操作。

**物品受欢迎程度**  
如果您使用`aws-semantic-similarity`配方对解决方案版本进行了训练，则该指标会衡量一件商品相对于目录中其他商品的参与度（点赞、观看次数、分享次数等）。物品受欢迎程度分数越高（越接近 1），与其他物品相比，该物品累积的用户互动越多。  
为了计算商品的受欢迎程度，Amazon Personalize 会计算与每件商品互动的独立用户总数（通过浏览、点击、购买等事件）。然后，对数据集中所有项目的原始参与度进行标准化，得出的分数介于 0 和 1 之间。分数接近 0 表示参与度低，而接近 1 的分数表示目录中商品的平均参与度高。

**物品新鲜度**  
如果您使用`aws-semantic-similarity`配方对解决方案版本进行了训练，则该指标会衡量某项商品相对于其他商品最近添加到您的目录的时间。物品的新鲜度分数越高（越接近 1），则该物品的创建时间越短。  
为了计算商品的新鲜度，Amazon Personalize 使用商品数据集中的 CREATION\$1TIMESTAMP 来确定每件商品的存放时间。年龄是根据训练时间和项目创建时间戳之间的差额计算的。然后对所有物品的年龄进行标准化，较新的物品获得的分数接近 1。分数越接近 0 表示旧物品越多，而越接近 1 的分数表示目录中的平均新物品越多。

**物品相似度**  
如果您使用`aws-semantic-similarity`配方训练了解决方案版本，则此指标会根据其内容、属性和元数据来衡量推荐项目与您的输入项在语义上的相关程度。项目相似度分数越高（越接近 1），推荐的项目就越接近您的参考项目的特征。  
为了计算商品的相似度，Amazon Personalize 使用源自商品元数据和属性的语义嵌入来计算每件推荐商品和输入商品之间的相似度分数。分数接近 0 表示平均而言，目录中项目之间的语义相似度较低，而接近 1 的分数表示平均而言，目录中项目之间的语义相似度很高。该指标可帮助您了解模型在推荐中捕捉语义关系的效果如何。

## 示例
<a name="working-with-training-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"></a>

有关通过测试评估解决方案版本的信息，请参阅[使用 A/B A/B 测试来衡量 Amazon Personalize 生成的建议的有效性](https://www.amazonaws.cn/blogs/machine-learning/using-a-b-testing-to-measure-the-efficacy-of-recommendations-generated-by-amazon-personalize/)。要深入了解推荐器系统的不同类型的指标，请参阅以下外部资源：
+ [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) 
+  [接收者操作特征](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) 