亚马逊AWS官方博客

利用机器学习根据用户对产品或产品属性的兴趣实现精准营销

目标客户群体细分(segment)允许营销人员更好地针对特定的受众群体量身定制他们的营销活动。采用客户细分的企业可以创建并传达与特定客户群体产生共鸣的有针对性的营销信息。细分增加了客户与品牌互动的可能性,并减少了信息疲劳的潜在风险——即客户对收到太多与他们无关的信息而产生的反感。例如,如果您的企业想要开展一次关于正装的电子邮件活动,目标受众应该只包括穿正装的人。

本文介绍了一种使用 Amazon Personalize 生成高度个性化的 Amazon Pinpoint 客户细分(segment)的解决方案。使用 Amazon Pinpoint,您可以通过活动(campaign)和旅程(journey)向这些客户 segment 发送消息。

个性化 Pinpoint Segment

营销人员首先需要通过收集客户数据(如关键特征、交易数据和行为数据)来了解他们的客户。这些数据有助于形成买家人物画像、了解他们如何消费以及他们对接收什么类型的信息感兴趣。

您可以在 Amazon Pinpoint 中创建两种类型的客户细分:导入细分和动态细分。对于这两种类型的细分,您都需要执行客户数据分析并识别行为模式。在确定了细分特征后,您可以构建包含适当条件的动态细分。您可以在 Amazon Pinpoint 用户手册中了解有关动态和导入细分的更多信息。

在线销售产品和服务的企业可以从基于已知客户偏好(如产品类别、颜色或配送选项)的细分中获益。想要推广新产品或通知客户某个产品类别促销活动的营销人员可以使用这些细分来启动 Amazon Pinpoint 活动(campaign)旅程(journey),从而提高客户完成交易的可能性。

构建有针对性的细分需要您获取历史客户交易数据,然后投入时间和资源进行分析。这里就可以使用机器学习技术节省时间并提高准确性。

Amazon Personalize 是一项全面托管的机器学习服务,无需任何先验机器学习知识即可运行。它提供了用于细分创建和产品推荐的现成模型(称为配方/recipes)。使用 Amazon Personalize USER_SEGMENTATION 配方,您可以基于产品 ID 或产品属性生成细分。

关于本解决方案

本方案引用了下面解决方案的架构设计:

上面解决方案以 nested stacks 的形式与主体应用一同被部署。其用于展示 Amazon Personalize 如何与 Amazon Pinpoint 集成来完成基于上下文的细分。

解决方案技术架构

本文解决方案架构图

一旦训练数据和训练配置被上传到 Personalize 数据 S3 存储桶(1),Amazon Step Function 状态机就会被执行(2)。该状态机实现了一个训练工作流来为 Amazon Personalize 提供所需的所有资源。它基于 Item-Attribute-Affinity 配方训练推荐模型(3a)。一旦该 Amazon Personalize 方案创建完成,工作流就会创建一个批量细分作业来获取用户细分(3b)。本例中,作业配置专注于生成对动作类型电影感兴趣的用户细分。

当批量细分作业完成时,结果会被上传到 Amazon S3(3c)。训练工作流状态机将在自定义 Event Bus 上发布 Amazon Personalize 状态更改(4)事件。Amazon EventBridge 规则会监听描述批量细分作业已完成的事件(5)。一旦此事件被发布到 Event Bus 总线上,批量细分后处理工作流就会作为 Amazon Step Function 状态机执行(6)。该工作流读取并转换来自 Amazon Personalize 的细分作业输出(7),将其转换为可以作为静态细分导入 Amazon Pinpoint 的 CSV 文件(8)。CSV 文件只包含与 Amazon Personalize 推荐细分中相应用户的 Amazon Pinpoint endpoint ID,格式如下:

{ "itemAttributes": "ITEMS.genres = \"Action\"" }

解析 Amazon Pinpoint 端点 ID 的机制依赖于在 Amazon Personalize 中设置的用户 ID 也在 Amazon Pinpoint 中的每个端点上使用 user ID 属性进行引用

Id
hcbmnng30rbzf7wiqn48zhzzcu4
tujqyruqu2pdfqgmcgkv4ux7qlu
keul5pov8xggc0nh9sxorldmlxc
lcuxhxpqh/ytkitku2zynrqb2ce

Amazon Personalize 细分对应为 Amazon Pinpoint 细分的工作流图

该工作流确保细分文件具有唯一的文件名,以便可以在 Amazon Pinpoint 中独立识别细分。一旦细分 CSV 文件被上传到 S3(7),细分导入工作流就会在 Amazon Pinpoint 中创建一个新的导入细分(8)。

数据集

该解决方案使用了一个名为 Bingewatch 的人工生成的电影数据集用于演示。该数据已经过预处理,可在 Amazon Personalize 和 Amazon Pinpoint 的上下文中使用。预处理后的数据包括以下内容:

  • 从 Bingewatch csv 创建的交互(interaction)元数据
  • 从 Bingewatch csv 创建的项目(item)元数据
  • 从 Bingewatch csv 创建的用户元数据,并用虚构的电子邮件地址和年龄数据进行了扩充
  • Amazon Pinpoint 端点数据

交互数据集

交互数据集描述了 Bingewatch 用户对电影的评分。每一行描述了一个用户对一部电影的单次评分,用户由用户 ID 标识。

EVENT_VALUE 描述了 1.0 到 5.0 之间的实际评分,EVENT_TYPE 指定该评分是因为用户在给定的 TIMESTAMP 观看了该电影,如下例所示:

USER_ID,ITEM_ID,EVENT_VALUE,EVENT_TYPE,TIMESTAMP
1,1,4.0,Watch,964982703
2,3,4.0,Watch,964981247
3,6,4.0,Watch,964982224
...

项目数据集

项目数据集包含了系统中每部电影的信息,如 TITLE(电影名)、RELEASE_YEAR(发行时间)、CREATION_TIMESTAMP (数据创建时间)、以及 GENRES(一段包含多个属性的文本)。如下例所示:

ITEM_ID,TITLE,RELEASE_YEAR,CREATION_TIMESTAMP,GENRES
1,Toy Story,1995,788918400,Adventure|Animation|Children|Comedy|Fantasy
2,Jumanji,1995,788918400,Adventure|Children|Fantasy
3,Grumpier Old Men,1995,788918400,Comedy|Romance
...

项目数据集在本文中所需的数据结构:

{
    "type": "record",
    "name": "Items",
    "namespace": "com.amazonaws.personalize.schema",
    "fields": [
        {
            "name": "ITEM_ID",
            "type": "string"
        },
        {
            "name": "GENRE",
            "type": ["null", "string"],
            "categorical": true
        }
    ],
    "version": "1.0"
}

用户数据集

用户数据集包含所有已知用户的信息,由 USER_ID 标识。该数据集包含人工生成的元数据,描述了用户的 GENDER (性别)和 AGE(年龄),如下例所示:

USER_ID,GENDER,E_MAIL,AGE
1,Female,success1@simulator.amazonses.com,21
2,Female,success+2@simulator.amazonses.com,35
3,Male,success+3@simulator.amazonses.com,37
4,Female,success+4@simulator.amazonses.com,47
5,Agender,success+5@simulator.amazonses.com,50
...

用户数据集在本文中所需的数据结构:

{
    "type": "record",
    "name": "Users",
    "namespace": "com.amazonaws.personalize.schema",
    "fields": [
        {
            "name": "USER_ID",
            "type": "string"
        },
        {
            "name": "AGE",
            "type": ["null", "int"]
        },
        {
            "name": "GENDER",
            "type": ["null", "string"]
        }
    ],
    "version": "1.0"
}

Amazon Pinpoint 端点

要将 Amazon Pinpoint 端点映射到 Amazon Personalize 中的用户,重要的是要有统一的用户标识符。解析 Amazon Pinpoint 端点 ID 的过程依赖于在 Amazon Personalize 中设置的用户 ID 也在 Amazon Pinpoint 中的每个端点上通过 userId 属性进行引用,如下例所示:

User.UserId,ChannelType,User.UserAttributes.Gender,Address,User.UserAttributes.Age
1,EMAIL,Female,success+1@simulator.amazonses.com,21
2,EMAIL,Female,success+2@simulator.amazonses.com,35
3,EMAIL,Male,success+3@simulator.amazonses.com,37
4,EMAIL,Female,success+4@simulator.amazonses.com,47
5,EMAIL,Agender,success+5@simulator.amazonses.com,50
...

解决方案实施

前置条件

要部署此解决方案,您必须具备以下条件:

注意:此解决方案会创建一个名为 personalize 的 Amazon Pinpoint 项目。如果您想在现有的 Amazon Pinpoint 项目上部署此解决方案,您需要在 YAML 模板中进行有针对性的更改。

部署解决方案

步骤 1:部署 SAM 解决方案

GitHub 存储库克隆到您的本地机器(如何克隆 GitHub 存储库)。使用 SAM CLI 进入到本地机器上的 GitHub 存储库位置,并执行以下命令:

sam deploy --stack-name contextual-targeting --guided

按照显示填写以下字段。将亚马逊云科技区域更改为 Amazon Pinpoint 和 Amazon Personalize 可用的亚马逊云科技区域AWS Region)电子邮件参数用于 Amazon Simple Notification Service(SNS) 在 Amazon Personalize 作业完成时向您发送电子邮件通知。

Configuring SAM deploy
======================
        Looking for config file [samconfig.toml] :  Not found
        Setting default arguments for 'sam deploy'     
=========================================
        Stack Name [sam-app]: contextual-targeting
        AWS Region [us-east-1]: eu-west-1
        Parameter Email []: me@example.com
        Parameter PEVersion [v1.2.0]:
        Parameter SegmentImportPrefix [pinpoint/]:
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]:
        #SAM needs permission to be able to create roles to connect to the resources in your template
        Allow SAM CLI IAM role creation [Y/n]:
        #Preserves the state of previously provisioned resources when an operation fails
        Disable rollback [y/N]:
        Save arguments to configuration file [Y/n]:
        SAM configuration file [samconfig.toml]:
        SAM configuration environment [default]:
        Looking for resources needed for deployment:
        Creating the required resources...
        [...]
        Successfully created/updated stack - contextual-targeting in eu-west-1
======================

步骤 2:将初始细分导入 Amazon Pinpoint

我们将导入一些人工生成的初始端点到 Amazon Pinpoint。

在本地机器上通过 AWS CLI 执行以下命令。

以下命令适用于 Linux:

SEGMENT_IMPORT_BUCKET=$(aws cloudformation describe-stacks --stack-name contextual-targeting --query 'Stacks[0].Outputs[?OutputKey==`SegmentImportBucket`].OutputValue' --output text)
aws s3 sync ./data/pinpoint s3://$SEGMENT_IMPORT_BUCKET/pinpoint

对于 Windows PowerShell,请使用以下命令:

$SEGMENT_IMPORT_BUCKET = (aws cloudformation describe-stacks --stack-name contextual-targeting --query 'Stacks[0].Outputs[?OutputKey==`SegmentImportBucket`].OutputValue' --output text)
aws s3 sync ./data/pinpoint s3://$SEGMENT_IMPORT_BUCKET/pinpoint

步骤 3:上传 Amazon Personalize 的训练数据和配置

现在我们准备好训练初始推荐模型了。此解决方案为您提供了模拟训练数据以及训练和推理配置,需要将其上传到 Amazon Personalize S3 存储桶。模型训练可能需要 45 到 60 分钟。

在本地机器上通过 AWS CLI 执行以下命令。

以下命令适用于 Linux:

PERSONALIZE_BUCKET=$(aws cloudformation describe-stacks --stack-name contextual-targeting --query 'Stacks[0].Outputs[?OutputKey==`PersonalizeBucketName`].OutputValue' --output text)
aws s3 sync ./data/personalize s3://$PERSONALIZE_BUCKET

对于 Windows PowerShell,请使用以下命令:

$PERSONALIZE_BUCKET = (aws cloudformation describe-stacks --stack-name contextual-targeting --query 'Stacks[0].Outputs[?OutputKey==`PersonalizeBucketName`].OutputValue' --output text)
aws s3 sync ./data/personalize s3://$PERSONALIZE_BUCKET

步骤 4:查看来自 Amazon Personalize 推理得出的细分

一旦训练工作流完成,您应该会在您部署堆栈时提供的电子邮件地址收到一封电子邮件。电子邮件应该如下面的屏幕截图所示:

Amazon SES 电子邮件示例

在亚马逊云科技控制台界面上,导航到 Amazon Pinpoint 控制台 > 您的项目 > 细分,您应该会看到两个导入的细分。一个名为 endpoints.csv,包含步骤 2 中导入的所有端点。另一个名为 ITEMSgenresAction_<date>-<time>.csv,包含 由Amazon Personalize 推理出的对动作电影感兴趣的端点 ID。

Amazon Pinpoint Segments 管理页面

您可以通过活动和旅程与 Amazon Pinpoint 客户细分互动。有关如何创建和执行 Amazon Pinpoint 活动和旅程的更多信息,请访问 Building Customer Experiences with Amazon Pinpoint 研讨会

后续步骤

上下文定位不仅限于单一渠道(如本解决方案中的电子邮件)。您可以继续开发并扩展批量细分后处理工作流(batch-segmentation-postprocessing),以满足您的参与和定位需求。

例如,您可以根据引用的端点渠道类型实现多个分支,并创建可通过推送通知、短信、语音呼出和应用内消息参与的 Amazon Pinpoint 客户细分。

清理实验资源

要删除已部署的本解决方案,请在 AWS CLI 中运行以下命令。

以下命令适用于 Linux:

SEGMENT_IMPORT_BUCKET=$(aws cloudformation describe-stacks --stack-name contextual-targeting --query 'Stacks[0].Outputs[?OutputKey==`SegmentImportBucket`].OutputValue' --output text)
PERSONALIZE_BUCKET=$(aws cloudformation describe-stacks --stack-name contextual-targeting --query 'Stacks[0].Outputs[?OutputKey==`PersonalizeBucketName`].OutputValue' --output text)
aws s3 rm s3://$SEGMENT_IMPORT_BUCKET/ --recursive
aws s3 rm s3://$PERSONALIZE_BUCKET/ --recursive
sam delete

对于 Windows PowerShell,请使用以下命令:

$SEGMENT_IMPORT_BUCKET=$(aws cloudformation describe-stacks --stack-name contextual-targeting --query 'Stacks[0].Outputs[?OutputKey==`SegmentImportBucket`].OutputValue' --output text)
$PERSONALIZE_BUCKET=$(aws cloudformation describe-stacks --stack-name contextual-targeting --query 'Stacks[0].Outputs[?OutputKey==`PersonalizeBucketName`].OutputValue' --output text)
aws s3 rm s3://$SEGMENT_IMPORT_BUCKET/ --recursive
aws s3 rm s3://$PERSONALIZE_BUCKET/ --recursive
sam delete

由于 Amazon Personalize 资源(如数据集组、数据集等)不是通过 Amazon Cloudformation 创建的,因此您必须手动删除它们。请按照官方亚马逊云科技文档中的说明清理已创建的资源。


Original URL: https://aws.amazon.com/blogs/messaging-and-targeting/use-machine-learning-to-target-your-customers-based-on-their-interest-in-a-product-or-product-attribute/

本文作者

Pavlos Ioannou Katidis

Pavlos Ioannou Katidis 是亚马逊云科技的一名 Amazon Pinpoint 和 Amazon Simple Email Service 资深产品专家解决方案架构师。他热衷于深入研究客户的技术问题,并帮助他们设计通信相关解决方案。闲暇时,他喜欢打网球、看犯罪调查类电视剧、玩 FPS 电脑游戏以及为开发个人项目。

校译作者

马競斌

亚马逊云科技资深解决方案架构师,致力于帮助客户构建具有优良架构的产品和应用,以及帮助国内客户出海和海外用户进入中国。在互联网行业有十多年产品研发经验和多年技术管理经验,在海外工作多年,是 Serverless 和 Infrastructure as Code 的爱好者。2023 年初开始聚焦 Generative AI,已帮助多个国内知名 IT 公司成功落地了多个生成式 AI 项目。