乐趣区

关于存储:使用-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 集群。

应用案例

在咱们的应用案例中,咱们心愿为一个非凡客户忠诚度打算找出最沉闷的客户。咱们应用 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;

* 左滑查看更多

要在您的环境中重现此脚本,请将 <> 替换为实用于您的 Amazon Redshift 集群的 Amazon 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 语句查看各种指标,包含准确性分数。如果没有明确指定,Amazon SageMaker 会主动应用指标类型的准确性。请参阅以下代码:

Show model ecommerce_customer_activity;

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

让咱们对验证数据应用以下 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 中的准确率相符。

当初让咱们运行一个查问,以至多沉闷 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;

* 左滑查看更多

下表显示了咱们的输入后果。

问题排查

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

创立模型时,您须要设置一个 Amazon Simple Storage Service (Amazon S3) 存储桶名称作为参数 s3_bucket 的值。您能够应用此存储桶在 Amazon Redshift 和 Amazon SageMaker 之间共享训练数据和构件。Amazon Redshift 会在此存储桶中创立一个子文件夹保留训练数据。训练实现后,除非将参数 s3_garbage_collect 设置为 off(可用于故障排除),否则它会删除子文件夹及其内容。

论断

Amazon Redshift ML 为数据库用户提供了应用 SQL 界面创立、训练和调整模型的适合平台。在这篇文章中,咱们将向您介绍如何创立多类分类模型。咱们心愿您能够利用 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 开发新性能,帮忙客户采纳适宜他们需要的机器学习解决方案。在业余时间,他喜爱看足球比赛,热衷于进步本人的烹饪技巧。

扫描上方二维码即刻注册

退出移动版