推荐引擎的好坏取决于用于预备的数据。将原始数据转换成适合模型的格式,是为了为最终用户提供更好的个性化推荐。
在本文中,我们将详细介绍如何准备和导入MovieLens数据集,这是由明尼苏达大学的GroupLens研究小组准备的数据集,其中包含各种电影的用户排名,使用亚马逊个性化和亚马逊SageMaker数据整理器。
解决方案概述
亚马逊个性化是一个托管服务,其核心价值在于能够从用户过去的行为中学习用户偏好,并快速调整这些学习到的偏好以考虑到用户行为的变化。为了能够对用户进行这种了解,亚马逊个性化需要根据历史用户行为进行训练,以找到可推广到未来的模式。具体而言,亚马逊个性化从称为交互数据集的数据中学习,该数据是一个包含至少三个关键列(userID
、itemID
和timestamp
)的表格数据集,表示用户和物品之间的正向交互发生在特定时间。亚马逊个性化需要用户上传包含他们自己客户交互的数据,以便模型能够学习这些行为趋势。尽管亚马逊个性化内部算法是基于亚马逊在机器学习领域的经验选择的,但个性化模型不会预装任何数据,而是根据每个客户定制的基础上进行模型训练。
本教程中探讨的MovieLens数据集不符合上述格式,因此我们使用SageMaker数据整理器来准备它,这是一个专为机器学习设计的数据聚合和准备工具。它具有超过300个预配置的数据转换,以及以PySpark、SQL和各种数据处理库(如pandas)编写自定义转换的能力。
前提条件
首先,我们需要设置一个亚马逊SageMaker Studio域。有关设置方法的详细信息,请参阅使用快速设置上手亚马逊SageMaker域。
此外,我们需要使用AWS身份和访问管理(IAM)为亚马逊个性化和亚马逊SageMaker服务角色设置正确的权限,以便它们能够访问所需的功能。
您可以创建一个新的亚马逊个性化数据集组来在本教程中使用,或者使用现有的数据集组。
最后,我们需要下载和解压MovieLens数据集,并将其放置在亚马逊简单存储服务(Amazon S3)存储桶中。
从亚马逊个性化启动SageMaker数据整理器
要开始使用亚马逊个性化的SageMaker数据整理器集成,请完成以下步骤:
- 在亚马逊个性化控制台上,转到数据集群组的概述页面。
- 根据数据集类型选择导入交互数据、导入用户数据或导入物品数据(本教程选择导入交互数据)。
- 对于导入方法,选择使用Data Wrangler导入数据。
- 选择下一步。
- 指定之前作为先决条件创建的SageMaker域、用户配置文件和IAM服务角色。
- 选择下一步。
- 按步骤继续启动SageMaker Data Wrangler示例。
初次设置环境可能需要最多5分钟。
将原始数据导入SageMaker Data Wrangler
在使用SageMaker Data Wrangler准备和导入数据时,我们使用数据流。数据流定义了一系列对数据进行转换和分析的步骤,以准备创建机器学习模型所需的数据。每次我们添加一个步骤到数据流中,SageMaker Data Wrangler会对数据进行一些操作,例如与另一个数据集进行合并或删除某些行和列。
首先,让我们导入原始数据。
- 在数据流页面上,选择导入数据。
使用SageMaker Data Wrangler,我们可以从50多种支持的数据源导入数据。
- 对于数据源,选择Amazon S3。
- 选择您上传到S3存储桶的数据集。
SageMaker Data Wrangler会自动显示数据的预览。
- 保持默认设置,选择导入。
数据导入后,SageMaker Data Wrangler会自动对数据集进行验证,并根据取样检测列的数据类型。
- 选择数据流页顶部的数据类型,以查看主要数据流,然后进行下一步。
SageMaker Data Wrangler的主要优点之一是在对整个数据集应用转换之前,能够对数据的一个小子集运行预览。要在Amazon S3中的多个分区文件上运行相同的转换,可以使用参数。
转换数据
要在SageMaker Data Wrangler中转换数据,您需要在数据流中添加一个转换步骤。SageMaker Data Wrangler包含300多个可用于准备数据的转换,包括用于Amazon Personalize的映射列转换。您可以使用通用的SageMaker Data Wrangler转换来解决异常值、类型问题和缺失值等问题,或应用数据预处理步骤。
使用Amazon Personalize,您所提供的交互数据集中的数据必须与您的数据集模式匹配。对于我们的电影推荐引擎,建议的交互数据集模式包括:
user_id
(字符串)item_id
(字符串)event_type
(字符串)timestamp
(以Unix纪元时间格式)
要了解更多关于Amazon Personalize数据集和模式的信息,请参阅数据集和模式。
以前一节中的最后一步显示的ratings.csv文件包含评分为1至5的电影。我们希望根据此构建一个电影推荐引擎。为此,我们必须完成以下步骤:
- 修改列的数据类型。
- 创建两个事件类型:点击和观看。
- 将所有评分为2及以上的电影分配为点击,将评分为4及以上的电影分配为点击和观看。
- 删除
ratings
列。 - 将列映射到Amazon Personalize的交互数据集模式。
- 验证我们的时间戳是否为Unix纪元时间。
请注意,不需要执行第3步来创建个性化模型。如果我们想使用Amazon Personalize的一种简化的角视频点播领域推荐器,例如为您推荐的热门选择,则需要点击和观看作为事件类型。然而,如果我们没有这些,我们可以不包含事件类型字段(或添加自己的事件类型,例如原始用户评分),并使用自定义配方,例如用户个性化。无论我们使用何种类型的推荐引擎,我们都需要确保我们的数据集只包含积极用户意图的表示。因此,无论您选择哪种方法,都需要删除所有的一星评分(可能还包括两星评分)。
现在让我们使用SageMaker Data Wrangler执行上述步骤。
- 在数据流页面上,选择第一个转换,名为数据类型。
- 为每个列更新类型。
- 选择预览以反映更改,然后选择更新。
- 要在数据流中添加步骤,请选择要对其执行转换的步骤旁边的加号,然后选择添加转换。
- 要将事件点击从电影评分中过滤出来,我们添加一个“过滤数据”步骤,以过滤掉评分为2及以上的电影。
- 添加另一个自定义转换步骤,以添加一个名为
eventType
的新列,其分配值为点击。 - 选择预览以审查您的转换,以确保结果符合预期,然后选择添加。
- 在此案例中,我们编写一些PySpark代码,添加一个名为
eventType
的列,其值将对我们的所有评分为2星至5星的电影统一设置为点击:
from pyspark.sql.functions import litdf = df.withColumn("eventType", lit("Click"))
- 对于观看事件,请重复前面的步骤,针对评分为4或更高的电影,将观看值分配给数据类型步骤中。我们的PySpark代码如下:
from pyspark.sql.functions import litdf = df.withColumn("eventType", lit("Watch"))
到这一步为止,数据流应该如下截图所示。
连接数据集
因为我们有两个关于观看和点击事件的数据集,让我们看看如何将它们连接成一个交互数据集。
- 在数据流页面上,选择创建观看事件旁边的加号,然后选择连接。
- 选择另一个终止步骤(创建点击事件),这应该会自动将两个集合映射(汇聚)成一个连接预览。
- 选择配置以查看连接数据集的预览。
- 给该步骤添加一个名称。
- 选择添加以添加该步骤。
数据流现在看起来如下截图所示。
- 现在,让我们添加一个管理列的步骤来删除原始评分列。
Amazon Personalize为用户、物品和时间戳设有默认列名。这些默认列名为user_id
、item_id
和timestamp
。
- 让我们添加一个Amazon Personalize步骤来替换现有的列头为默认列头。
- 在我们的情况下,我们也使用
event_type
字段,所以让我们也将其映射过去。
通过这个步骤,数据转换活动完成,交互数据集准备好进行下一步操作。
接下来,让我们验证时间戳。
- 我们可以通过添加自定义转换步骤来实现。对于这篇文章,我们选择Python(用户定义函数)。
- 选择时间戳作为输入列,并创建一个名为
readable_timestamp
的新列作为输出。 - 选择Python作为转换的模式,并插入以下Python函数的代码:
def custom_func(value: int) → str: return datetime.utcfromtimestamp(value).strftime('%Y-%m-%d %H:%M:%S')
- 选择预览以查看更改。
在这种情况下,我们看到的是2000年代的日期,因为MovieLens开始在1996年收集数据,这与预期一致。如果我们不选择添加,这个转换就不会被添加到我们的数据流中。
- 由于这只是一个健全性检查,您可以通过选择左上角的数据流返回到数据流中。
最后,我们添加一个分析步骤来创建有关数据集的摘要报告。此步骤执行分析以评估数据集是否适用于Amazon Personalize。
- 选择数据流的最后一步旁边的加号,然后选择添加分析。
- 对于分析类型,选择Amazon Personalize的数据质量和洞察报告。
- 对于数据集类型,选择交互。
- 选择创建。
MovieLens数据集非常干净,因此分析显示没有问题。如果发现了一些问题,您可以对数据集进行迭代,并重新运行分析,直到解决问题。
请注意,默认情况下,分析的样本行数为50,000行。
将数据集导入到Amazon Personalize
此时,我们的原始数据已经转换完毕,我们准备将转换后的交互数据集导入到Amazon Personalize。SageMaker Data Wrangler允许您将数据导出到S3存储桶中的位置。您可以使用以下方法之一指定位置:
- 目标节点 – SageMaker Data Wrangler在处理完数据后将其存储的位置
- 导出到 – 将转换结果数据导出到Amazon S3
- 导出数据 – 对于小型数据集,您可以快速导出转换后的数据
使用目标节点方法导出数据时,您需要创建目标节点和一个SageMaker Data Wrangler作业。创建SageMaker Data Wrangler作业会启动SageMaker处理作业以导出您的流程。在创建了目标节点后,您可以选择要导出的目标节点。
- 选择表示您要导出的转换的节点旁边的加号。
- 选择导出到,然后选择Amazon S3(通过Jupyter Notebook)。
请注意,我们还可以选择通过SageMaker Data Wrangler中的Jupyter笔记本将数据导出到Amazon Personalize。
- 对于数据集名称,输入一个名称,该名称将用作作为目标提供的S3存储桶中的文件夹名称。
- 您可以指定文件类型、字段分隔符和压缩方法。
- 可选地,指定分区的数量和列。
- 选择添加目标。
数据流应该如下屏幕截图所示。
- 创建一个作业来处理数据流,并将数据存储在之前配置的目标(S3存储桶)中。
- 输入一个作业名称,然后选择配置作业。
SageMaker Data Wrangler提供了配置实例类型、实例数量和作业配置的能力,以及创建作业的计划能力。有关选择实例数的指导,请参阅创建和使用Data Wrangler Flow。
要监视作业的状态,请导航到SageMaker控制台上的仪表盘页面。 处理部分显示已完成和已创建的作业数量。您可以深入了解有关已完成作业的更多详细信息。
作业完成后,将在指定的目标位置创建转换后的数据文件。
- 返回到Amazon Personalize控制台,导航到数据集组以导入另一个数据集。
- 选择导入交互数据。
- 选择将数据直接导入Amazon Personalize数据集,从Amazon S3直接导入转换后的数据集,然后选择下一步。
- 定义模式。对于本文,我们的数据集由
user_id
(字符串)、item_id
(字符串)、event_type
(字符串)和timestamp
(长整型)字段组成。
此时,您可以创建按需视频域推荐器或自定义解决方案。要这样做,请按照准备和导入数据中的步骤进行。
结论
在本文中,我们介绍了如何使用SageMaker Data Wrangler为Amazon Personalize准备样本数据集。SageMaker Data Wrangler提供超过300个转换。这些转换以及添加自定义用户转换的能力可以帮助优化创建质量数据集以提供给终端用户超个性化内容的过程。
虽然本文只介绍了如何准备互动数据集,但您也可以使用SageMaker Data Wrangler来准备用户和物品数据集。有关可用于Amazon Personalize的数据类型的更多信息,请参阅数据集和模式。
如果您是Amazon Personalize或SageMaker Data Wrangler的新用户,请参阅开始使用Amazon Personalize或开始使用SageMaker Data Wrangler。如果对本文有任何问题,请在评论区提问。