亚马逊AWS官方博客

使用 Amazon Redshift ML 构建多分类模型

Amazon Redshift ML 通过使用简单的 SQL 语句使用 Amazon Redshift 中的数据创建和训练机器学习(ML)模型,简化了机器学习 (ML) 的操作。您可以使用 Amazon Redshift ML 来解决二进制分类、多分类和回归问题,并可以直接使用 AutoML 或 XGBoost 等技术。

这篇文章是 Amazon Redshift ML 系列的一部分。有关使用 Amazon Redshift ML 构建回归的更多信息,请参阅使用 Amazon Redshift ML 构建回归模型

您可以使用 Amazon Redshift ML 自动执行数据准备、预处理和问题类型的选择,如这篇博客文章中所述。我们假设您非常了解自己的数据以及最适用于您使用案例的问题类型。本文将专注于使用多分类问题类型在 Amazon Redshift 中创建模型该类型包括至少三个类别。例如,您可以预测交易是欺诈性的、失败的还是成功的,客户是否会将活跃状态保持 3 个月、6 个月、9 个月、12 个月,还是要将新闻标记为体育、世界新闻或是商业内容。

 

先决条件

作为实施此解决方案的先决条件,您需要设置启用机器学习(ML)功能的 Amazon Redshift 集群。有关这些准备步骤,请参阅使用 SQL 和 Amazon Redshift ML 在 Amazon Redshift 中创建、训练和部署机器学习模型

 

使用案例

在我们的使用案例中,我们希望为一个特殊客户忠诚度计划找出最活跃的客户。我们使用 Amazon Redshift ML 和多分类模型来预测客户在 13 个月内将有多少个月内处于活动状态。这将转化为多达 13 个可能的分类,因此更适合采取多分类。预计活动状态将保持 7 个月或更长时间的客户将成为特殊客户忠诚度计划的目标群体

 

输入原始数据

为了准备该模型的原始数据,我们使用公用数据集电子商务销售预测(其中包括英国在线零售商的销售数据)填充 Amazon Redshift 中的 ecommerce_sales 表。

输入以下语句以将数据加载到 Amazon Redshift:

CREATE TABLE IF NOT EXISTS ecommerce_sales
(
	invoiceno VARCHAR(30)   
	,stockcode VARCHAR(30)   
	,description VARCHAR(60)    
	,quantity DOUBLE PRECISION   
	,invoicedate VARCHAR(30)    
	,unitprice    DOUBLE PRECISION
	,customerid BIGINT    
	,country VARCHAR(25)    
)
;

Copy ecommerce_sales
From 's3://redshift-ml-multiclass/ecommerce_data.txt'
iam_role '<<your-amazon-redshift-sagemaker-iam-role-arn>>' delimiter '\t' IGNOREHEADER 1 region 'us-east-1' maxerror 100;

要在您的环境中重现此脚本,请将 <<your-amazon-redshift-sagemaker-iam-role-arn>> 替换为适用于您的 Amazon Redshift 集群的 AWS Identity and Access Management (IAM) ARN。

 

机器学习(ML)模型的数据准备

现在我们的数据集已加载完毕,我们可以选择将数据拆分为三组分别进行训练 (80%)、验证 (10%) 和预测 (10%)。请注意,Amazon Redshift ML Autopilot 会自动将数据拆分为训练和验证,但是如果在此处就进行拆分,您将能够很好地验证模型的准确性。此外,我们将计算客户保持活跃的月数,因为我们希望模型能够根据新数据预测该值。我们在 SQL 语句中使用随机函数来拆分数据。请参阅以下代码:

create table ecommerce_sales_data as (
  select
    t1.stockcode,
    t1.description,
    t1.invoicedate,
    t1.customerid,
    t1.country,
    t1.sales_amt,
    cast(random() * 100 as int) as data_group_id
  from
    (
      select
        stockcode,
        description,
        invoicedate,
        customerid,
        country,
        sum(quantity * unitprice) as sales_amt
      from
        ecommerce_sales
      group by
        1,
        2,
        3,
        4,
        5
    ) t1
);

训练集

create table ecommerce_sales_training as (
  select
    a.customerid,
    a.country,
    a.stockcode,
    a.description,
    a.invoicedate,
    a.sales_amt,
    (b.nbr_months_active) as nbr_months_active
  from
    ecommerce_sales_data a
    inner join (
      select
        customerid,
        count(
          distinct(
            DATE_PART(y, cast(invoicedate as date)) || '-' || LPAD(
              DATE_PART(mon, cast(invoicedate as date)),
              2,
              '00'
            )
          )
        ) as nbr_months_active
      from
        ecommerce_sales_data
      group by
        1
    ) b on a.customerid = b.customerid
  where
    a.data_group_id < 80
);

验证集

create table ecommerce_sales_validation as (
  select
    a.customerid,
    a.country,
    a.stockcode,
    a.description,
    a.invoicedate,
    a.sales_amt,
    (b.nbr_months_active) as nbr_months_active
  from
    ecommerce_sales_data a
    inner join (
      select
        customerid,
        count(
          distinct(
            DATE_PART(y, cast(invoicedate as date)) || '-' || LPAD(
              DATE_PART(mon, cast(invoicedate as date)),
              2,
              '00'
            )
          )
        ) as nbr_months_active
      from
        ecommerce_sales_data
      group by
        1
    ) b on a.customerid = b.customerid
  where
    a.data_group_id between 80
    and 90
);

预测集

create table ecommerce_sales_prediction as (
  select
    customerid,
    country,
    stockcode,
    description,
    invoicedate,
    sales_amt
  from
    ecommerce_sales_data
  where
    data_group_id > 90);

 

Amazon Redshift 中创建模型

现在我们创建了训练和验证数据集,我们可以使用 Amazon Redshift 中的 create model 语句使用 Multiclass_Classification 创建我们的机器学习模型。我们指定问题类型,然后让 AutoML 处理其他的一切事务。在这个模型中,我们想要预测的目标是 nbr_months_active。Amazon SageMaker 创建了一个函数predict_customer_activity,我们将用它在 Amazon Redshift 中进行推断。请参阅以下代码:

create model ecommerce_customer_activity
from
  (
select   
  customerid,
  country,
  stockcode,
  description,
  invoicedate,
  sales_amt,
  nbr_months_active  
 from ecommerce_sales_training)
 TARGET nbr_months_active FUNCTION predict_customer_activity
 IAM_ROLE '<<your-amazon-redshift-sagemaker-iam-role-arn>>'
 problem_type MULTICLASS_CLASSIFICATION  
  SETTINGS (
    S3_BUCKET '<<your-amazon-s3-bucket-name>>’,
    S3_GARBAGE_COLLECT OFF
  );

要在环境中重现此脚本,请将 <<your-amazon-redshift-sagemaker-iam-role-arn>> 替换为集群的 IAM 角色 ARN。

 

验证预测

在此步骤中,我们将对照验证数据评估机器学习(ML)模型的准确性。

在创建模型时,Amazon SageMaker Autopilot 会自动将输入数据拆分为训练和验证集,并选择具有最佳客观指标的模型,该指标部署在 Amazon Redshift 集群中。您可以使用集群中的 show model 语句查看各种指标,包括准确性分数。如果没有明确指定,SageMaker 会自动使用目标类型的准确性。请参阅以下代码:

Show model ecommerce_customer_activity;

如以下输出所示,我们的模型的准确率为 0.996580。

模型名称 ecommerce_customer_activity
架构名称 Public
所有者 Demo
创建时间 Mon, 22.03.2021 19:48:30
模型状态 READY
训练工作状态 MaxAutoMLJobRuntimeReached
validation:accuracy 0.996580
预估成本 4.260437

 

训练数据:

查询 SELECT CUSTOMERID, COUNTRY, STOCKCODE, DESCRIPTION, INVOICEDATE, SALES_AMT, NBR_MONTHS_ACTIVE
FROM ECOMMERCE_SALES_CLN_TRAINING
目标列 NBR_MONTHS_ACTIVE

 

参数:

模型类型 Auto
问题类型 MulticlassClassification
问题类型 Accuracy
AutoML 任务名称 2021-03-07-19-48-30-960148-auto
函数名称 predict_customer_activity
函数参数 customerid country stockcode description invoicedate sales_amt
函数参数类型 int8 varchar varchar varchar varchar float8

让我们对验证数据使用以下 SQL 代码以对验证数据运行推理查询:

select 
 cast(sum(t1.match)as decimal(7,2)) as predicted_matches
,cast(sum(t1.nonmatch) as decimal(7,2)) as predicted_non_matches
,cast(sum(t1.match + t1.nonmatch) as decimal(7,2))  as total_predictions
,predicted_matches / total_predictions as pct_accuracy
from 
(select   
  customerid,
  country,
  stockcode,
  description,
  invoicedate,
  sales_amt,
  nbr_months_active,
  predict_customer_activity(customerid, country, stockcode, description, invoicedate, sales_amt) as predicted_months_active,
  case when nbr_months_active = predicted_months_active then 1
      else 0 end as match,
  case when nbr_months_active <> predicted_months_active then 1
    else 0 end as nonmatch
  from ecommerce_sales_validation
  )t1;

可以看到,在我们的数据集上预测的准确率位 99.74%,这与 show model 中的准确率相符。

predicted_matches predicted_non_matches total_predictions pct_accuracy
43489.00 132.00 43621.00 0.99697393

现在让我们运行一个查询,以至少活跃 7 个月为标准来查看哪些客户有资格参加我们的客户忠诚度计划:

select 
  customerid, 
  predict_customer_activity(customerid, country, stockcode, description, invoicedate, sales_amt) as predicted_months_active
  from ecommerce_sales_prediction
 where predicted_months_active >=7
 group by 1,2
 limit 10;

下表显示了我们的输出结果。

customerid predicted_months_active
16895 8
18283 10
15044 11
16746 11
14702 11
16607 10
12901 10
15078 13
16393 10
15005 12

 

问题排查

尽管 Amazon Redshift 中的 Create Model 语句自动负责启动 SageMaker Autopilot 流程以构建、训练和调整最佳机器学习模型并在 Amazon Redshift 中部署该模型,但您可以查看在此过程中执行的中间步骤,如果出现问题,这还可以帮助您进行故障排除。您还可以从 show model 命令的输出中检索 AutoML Job Name。

创建模型时,您需要设置一个 Amazon Simple Storage Service (Amazon S3) 存储桶名称作为参数 s3_bucket 的值。您可以使用此存储桶在 Amazon Redshift 和 SageMaker 之间共享训练数据和构件。Amazon Redshift 会在此存储桶中创建一个子文件夹保存训练数据。训练完成后,除非将参数 s3_garbage_collect 设置为 off(可用于故障排除),否则它会删除子文件夹及其内容。有关更多信息,请参阅 CREATE MODEL

有关使用 SageMaker 控制台和 Amazon SageMaker Studio 的信息,请参阅使用 Amazon Redshift ML 构建回归模型

 

结论

Amazon Redshift ML 为数据库用户提供了使用 SQL 界面创建、训练和调整模型的合适平台。在这篇文章中,我们将向您介绍如何创建多类分类模型。我们希望您可以利用 Amazon Redshift ML 来帮助获得宝贵的见解。

有关使用 Amazon Redshift ML 构建不同模型的更多信息,请参阅使用 Amazon Redshift ML 构建回归模型并阅读 Amazon Redshift ML 文档。

 

鸣谢

根据 UCI 机器学习(ML)存储库的资讯,这些数据由公共分析组主任 Chen Daqing 博士提供。邮箱:chend@lsbu.ac.uk,地址:School of Engineering, London South Bank University, London SE1 0AA, UK.

Dua, D. and Graff, C.(2019)。UCI 机器学习(ML)存储库 [http://archive.ics.uci.edu/ml]。加利福尼亚州尔湾:加利福尼亚大学信息与计算机科学学院。

 

本篇作者

Phil Bates

亚马逊云科技的高级数据分析专家解决方案构架师,拥有超过 25 年的数据仓库经验。

Debu Panda

亚马逊云科技的首席产品经理,是数据分析、应用程序平台和数据库技术的行业领导者,在 IT 领域拥有超过 25 年的经验。

Nikos Koulouris

亚马逊云科技的一名软件开发工程师。他从加州大学圣地亚哥分校获得博士学位,并一直在从事数据库和数据分析领域的工作。

Enrico Sartorello

亚马逊云科技的一名高级软件开发工程师。他通过为 Amazon SageMaker 开发新功能,帮助客户采用适合他们需求的机器学习解决方案。在业余时间,他喜欢看足球比赛,热衷于提高自己的烹饪技巧。