亚马逊AWS官方博客

运用上下文信息提升 Amazon Personalize 推荐结果的相关性

Original URL : https://aws.amazon.com/cn/blogs/machine-learning/increasing-the-relevance-of-your-amazon-personalize-recommendations-by-leveraging-contextual-information/

 

选取适当的时机,在用户面前展示高相关性推荐,已经成为成功实现个性化策略的关键一步。但是,客户的决策过程可能根据推荐过程与具体交互方式而随时变化。在本文中,我们将介绍如何设置Amazon Personalize,并在可以感知上下文的部署中进行查询。

Amazon Personalize为大家提供Amazon.com二十多年来使用的同一套机器学习(ML)技术方案,可以轻松在应用程序当中添加复杂的个性化功能,且无需任何机器学习专业知识。Amazon Personalize还支持根据用户的上下文信息(例如设备类型、所在位置、当前时间或者其他具体信息)自动调整推荐内容。

哈佛大学发布的研究论文《情境如何影响选择(How Context Affects Choice)》,将情境(或者上下文)定义为一类能够影响决策过程、进而改变选择结果的重要因素。作为业务经营者,您需要通过分析客户在手机和计算机上访问商品列表并进行购物时的不同表现,或者发现客户在晴天和阴天情况下的购物选择变化,整理出可靠的模式与消费偏好。

使用用户上下文信息,我们可以为现有用户提供个性化程度更高的体验,这也有助于缩短为新用户或匿名用户提供良好服务的冷启动时间。所谓冷启动时间,是指由于缺少对当前用户历史信息的了解,而导致推荐引擎无法提供个性化推荐预测的阶段。

向Amazon Personalize添加上下文信息

我们可以通过四个简单步骤,在Amazon Personalize当中设置并使用上下文信息:

  1. 将用户的上下文信息添加至用户-项目交互历史数据集中。
  2. 使用User Personalization 或 Personalized Ranking 配方训练一套上下文感知型解决方案。这里的配方,是指使用交互数据集中的行为数据以及用户或者项目的元数据,对推荐器进行训练的具体算法。
  3. 在使用GetRecommendations 或 GetPersonalizedRanking查询实时推荐结果时,使用与指定用户相关联的上下文信息。
  4. 在使用event tracker进行事件记录时,引入用户上下文信息。

下图展示了上述流程的架构。

在构建数据集时,我们也需要明确考虑各类重要的上下文信息。设备类型就是客户经常涉及的一类常见上下文示例,具体包括智能手机、平板电脑或者台式机等。设备类型在电子商务中的购买行为有着巨大影响:荷兰屯特大学的一项探索性研究The Effect of Device Type on Buying Behavior in Ecommerce: An Exploratory Study证明,设备类型与购买行为直接相关——如果他们使用的上网设备不够顺手,很可能会推迟购买决定。因此,我们应该将设备类型上下文嵌入至数据集之内,由Amazon Personalize学习这种模式,并在推理时结合这一用户上下文给出最合理的推荐内容。

推荐用例

在本文的用例中,我们将旅行爱好者设定为潜在客户。在考虑选择出行的航空公司时,他们会综合多项相关因素进行评估。例如,这场旅途是短途飞行还是长途飞行?他们打算用现金还是里程积分预订机票?他们是一个人出行吗?他们从哪里出发又返回到哪里?在整理了这些初步问题之后,下一项重大决策就是选择客舱类型。如果我们的旅行爱好者选择了高端客舱,则可以假设他们更重视航空公司所提供的旅途飞行体验。现在我们已经对用户的需求拥有了比较充分的了解,现在是购买的时候了!

接下来考虑这一决策流程中的变量因素。虽然我们无法控制这些因素,但却可以据此对推荐内容做出调整。首先,确定可能影响用户行为的共通点。仍然以旅行客户为例,飞行时长与客舱类型无疑是非常理想的上下文信息,而旅行者类型与旅行者居住地则代表着推荐数据集中的高质量用户元数据。所谓元数据,是指我们明确了解的、与用户及项目相关的信息,能够在一段时间内一定程度上保持不变;而上下文则属于环境信息,可能随时间推移而迅速变化,并极大影响到客户的感知与行为。

在训练数据集中选择相关度最高的元数据字段,并结合上下文丰富您的交互数据集,即可生成更适合用户的推荐结果。在本文中,我们将构建一套Amazon Personalize部署方案,由其返回适合客户偏好的航空公司推荐列表。我们将客舱类型设定为上下文,将旅行者住址设定为元数据字段,并观察推荐结果如何根据上下文与元数据而调整变化。

先决条件

我们首先需要设置以下Amazon Personalize资源。关于完整操作说明,请参阅入门指南(控制台)以完成以下操作步骤:

  1. 创建一个数据集组,在本文中我们将其命名为 airlines-blog-example
  2. 使用以下schema创建 Interactions 数据集,并使用 interactions_dataset.csv 文件导入数据:
{
  "type": "record",
  "name": "Interactions",
  "namespace": "com.amazonaws.personalize.schema",
  "fields": [
{
          "name": "ITEM_ID",
          "type": "string"
      },
      {
          "name": "USER_ID",
          "type": "string"
      },
      {
          "name": "TIMESTAMP",
          "type": "long"
      },
      {
          "name":"CABIN_TYPE",
          "type": "string",
          "categorical": true
      },
      {
        "name": "EVENT_TYPE",
        "type": "string"
      },
      {
        "name": "EVENT_VALUE",
        "type": "float"
      }
  ],
  "version": "1.0"
}

 

3. 使用以下schema创建 Users 数据集,并使用 users_dataset.csv 文件导入数据:

{
  "type": "record",
  "name": "Users",
  "namespace": "com.amazonaws.personalize.schema",
  "fields": [
    {
      "name": "USER_ID",
      "type": "string"
    },
    {
      "name": "USER_RESIDENCE",
      "type": "string",
      "categorical": true
    }
  ],
  "version": "1.0"
}

 

  1. 创建一个解决方案(solution)。在本文,我们使用默认解决方案配置,只对以下几项做出调整:
    1. Recipe – aws-hrnn-metadata
    2. Event type – RATING
    3. Perform HPO – True

如果您希望Amazon Personalize能够并行训练与试验,借此确定性能最高的超参数,则建议大家使用超参数优化(HPO)。关于更多详细信息,请参阅超参数与超参数优化(HPO)

4. 创建一项活动(campaign)

您可以在Amazon Personalize控制台上,或按照GitHub repo上的Jupyter notebook personalize_hrnn_metadata_contextual_example.ipynb 示例设置上述资源。

探索各项Amazon Personalize资源

现在,我们已经创建了多项Amazon Personalize资源,包括名为airlines-blog-example的数据集组。这套数据集组中包含两个数据集,分别为interactions 与 users,它们包括了用于Amazon Personalize模型(也称解决方案)训练的数据。此外,我们还创建了一项campaign,用于提供实时推荐。

现在,我们将进一步探讨数据集interactionsusers如何帮助我们的模型利用数据集中嵌入的上下文及元数据进行学习。

Interactions数据集

我们为Amazon Personalize提供一套包含数字评分(EVENT_TYPE + EVENT_VALUE的组合)的交互式数据集,这一评分为用户(USER_ID)在特定时间(TIMESTAMP)乘坐某种客舱类型(CABIN_TYPE)时,为航空公司(ITEM_ID)打出的体验评价。通过在数据集与schema中向Amazon Personalize提供这些信息,我们可以在查询特定用户推荐并通过event tracker记录新交互时,将CABIN_TYPE作为上下文信息添加进来。在训练过程中,我们的模型会自动从数据中识别出重要特征(在本用例中,即在各类客舱类型中得分最高的航空公司)。

以下截屏为interactions_dataset.csv文件中的部分内容。

User数据集

我们还需要向Amazon Personalize提供一套user数据集,其中包含在interactions数据集内提交评分的用户(USER_ID),且假定他们是从其常住地(USER_RESIDENCE)打出相应评分的。在本用例中,USER_RESIDENCE是我们为这些用户选择的元数据。通过用户元数据USER_RESIDENCE,我们的模型能够学习到各国家/地区的用户与哪些航空公司交互次数最多;因此在查询推荐结果时,模型会将USER_RESIDENCE纳入考量。例如,与南美或欧洲的用户相比,亚洲用户所看到的航空公司选项将有所不同。

以下截屏为 user_dataset.csv 文件中的部分内容。

Skytrax提供的各航空公司用户评分原始数据集中包含20列,记录超过40000多条。在本文中,我们将使用此数据集的精简版本,并将原始数据集中相关度最高的列拆分为两套数据集(users 与 interactions)。关于在Jupyter notebook中拆分数据的更多详细信息,请参阅GitHub repo上的personalize_hrnn_metadata_contextual_example.ipynb

在下一节中,我们将介绍上下文与元数据如何影响Amazon Personalize中campaign给出的实时推荐结果。

在Amazon Personalize实时推荐查询中应用上下文信息

在测试过程中,我们观察到上下文将对提供给用户的推荐结果产生重要影响。在我们的用例中,我们使用一套来自众多用户的航空公司数字评分交互数据集。在schema中,客舱类型将作为interactions数据集中的一项分类值被包含在内,而用户居住地址则作为 users数据集内的元数据字段。我们的理论是,通过将客舱类型设定为上下文,模型将会在提供航空公司推荐时考虑到这项影响因素对用户偏好产生的影响。

  1. 在Amazon Personalize数据集组仪表板上,选择View campaigns。
  2. 选择您刚刚创建完成的campaign。
  3. User ID部分,输入 JDowns
  4. 选择 Get recommendations获取推荐

这时,大家应该看到类似于以下截屏的Test campaign results页面。

我们起初在不使用任何上下文的前提下,查询得出一份航空公司推荐列表。我们现在关注其中的前10项推荐,并验证其是否会根据上下文信息的变化而有所变动。我们可以通过控制台以提供键值对的方式添加上下文。在本用例中,键为CABIN_TYPE,而其值可以为以下之一:

  • Economy
  • Premium Economy
  • Business Class
  • First Class

以下两幅截屏展示了我们在面向同一用户时,分别将Economy与 First Class作为CABIN_TYPE上下文的值时查询得出的推荐结果。在将客舱类型设置为Economy 时,推荐列表的前10位并没有出现变化;但在上下文中设置客舱类型为First Class时,推荐列表的顺序发生了一些变动——阿拉斯加航空公司(Alaska Airlines)跃居榜首。

您可以浏览users_dataset.csv文件以寻找更多用户评分,借此测试您的推荐API,并根据您在API调用中使用的上下文进行类似的转换。此外,我们发现航空公司推荐列表还将根据User Residency元数据字段的改变而有所变化。例如,以下截屏展示了为JDowns用户的前10条推荐结果,该用户的User Residency值被设置为United States;而PhillipHarris用户的User Residency值则会被设置为 France

总结

如本文所述,在使用Amazon Personalize时,将上下文信息添加至推荐策略当中,是一项非常强大且易于实现的实践。使用上下文丰富推荐结果,您的用户参与度将显著增加,从而真正将推荐系统转化为提升收入的重要工具。

本文还向大家展示了如何创建Amazon Personalize上下文感知的部署方案,以及如何通过Amazon Personalize控制台使用上下文为实时推荐进行端到端的测试。关于使用Jupyter环境设置Amazon Personalize并通过Boto3 Python SDK获取推荐结果的具体操作说明,请参阅GitHub repo上的personalize_hrnn_metadata_contextual_example.ipynb

当然,大家还可以使用Amazon Personalize实现更多其他用例。关于更多核心用例及自动化示例的详细信息,请参阅 GitHub repo

如果本文对您有所帮助,或者给您的问题解决思路带来一点启发,请和我们分享您的心得与体会。

 

本篇作者

Luis Lopez Soria

AWS机器学习团队AI/ML专业解决方案架构师。他与AWS客户合作,帮助他们大规模采用机器学习技术。在业余时间,他喜爱运动、环游世界,以及体验新的食物与文化。