使用 Amazon Redshift ML 创建、训练和部署多层感知器 (MLP) 模型

Amazon Redshift 是一个完全托管的 PB 级云数据仓库,每天有成千上万的客户使用它来处理艾字节的数据,以支持他们的分析工作负载。Amazon Redshif t 自带一项名为 Amazon Redshift ML 的功能,该功能将机器学习的力量交到每个数据仓库用户手中,无需用户学习任何新的编程语言、机器学习概念或机器学习工具。Redshift ML 概括了围绕数据仓库的传统 ML 方法所涉及的所有复杂性,传统数据仓库涉及重复的手动步骤,在数据仓库和机器学习工具之间来回移动数据,以运行漫长、复杂、迭代的机器学习工作流程。

Red shift ML 在后台使用 A m azon SageMaker Autopilot 和 Amazon SageMaker Neo,使数据分析师、数据科学家、商业智能专家和数据库开发人员等 SQL 用户可以轻松地使用熟悉的 SQL 命令创建、训练和部署机器学习 (ML) 模型,然后使用这些模型对客户流失预测、用于销售预测的购物篮分析、制造单位寿命等用例的新数据进行预测价值预测和产品推荐。Redshift ML 使模型作为 SQL 函数在 Amazon Redshift 数据仓库中使用,因此您可以轻松地将其用于查询和报告。

Amazon Redshift ML 支持监督学习,包括回归、二元分类、多类分类和使用 K-Means 的无监督学习。您可以选择指定 XgBoost、MLP 和线性学习者模型类型,这些模型是用于解决分类或回归问题的监督学习算法,与传统的超参数优化技术相比,速度显著提高。 Amazon Redshift ML 还支持 自带模型 ,可以导入使用 SageMaker Autopilot 支持的算法构建的现有 SageMaker 模型,可用于本地推理;或者对于不支持的算法,可以选择调用远程 SageMaker 端点进行远程推理。

在这篇博客文章中,我们将向您展示如何使用 Redshift ML 使用多层感知器 (MLP) 算法来解决二进制分类问题,该算法探讨了不同的训练目标并从验证集中选择最佳解决方案。

多层感知器 (MLP) 是一种深度学习方法,用于训练多层人工神经网络,也称为深度神经网络。它是一个前馈人工神经网络,可从一组输入生成一组输出。MLP 的特点是在输入层和输出层之间以有向图的形式连接的多层输入节点。MLP 使用反向传播来训练网络。MLP 广泛用于解决需要监督学习的问题,以及计算神经科学和并行分布式处理的研究。它还用于语音识别、图像识别和机器翻译。

就在Redshift ML(由亚马逊SageMaker Autopilot提供支持)中使用MLP而言,它目前支持表格数据。

解决方案概述

要使用 MLP 算法,您需要提供代表维度值的输入或列,还需要提供标签或目标,即您要预测的值。

使用 Redshift ML,您可以在表格数据上使用 MLP 来解决回归、二元分类或多类分类问题。MLP 的更独特之处在于,MLP 的输出函数也可以是线性函数或连续函数。它不必像一般回归模型那样是一条直线。

在此解决方案中,我们使用二进制分类来检测基于信用卡交易数据的欺诈行为。分类模型和 MLP 的区别在于,逻辑回归使用逻辑函数,而感知器使用阶跃函数。使用多层感知器模型,机器可以学习权重系数,帮助它们对输入进行分类。这种线性二进制分类器在将输入数据排列和分类为不同类别方面非常有效,允许基于概率的预测并将项目分为多个类别。多层感知器具有学习非线性模型和实时训练模型的优势。

对于此解决方案,我们首先将数据提取到 Amazon Redshift 中,然后将其分发用于模型训练和验证,然后使用 Amazon Redshift ML 特定查询创建模型,从而创建并利用生成的 SQL 函数来最终预测欺诈性交易。

先决条件

首先,我们需要一个 Amazon Redshift 集群或 Ama zon Reds hift 无服务器端点,以及 一个附加的 亚马逊云科技 身份和访问 管理 (IAM) 角色,该角色提供对 SageMaker 的访问权限和对 亚马逊简单存储 服务 (Amazon S3) 存储桶的权限。

有关 Redshift ML 的介绍及其设置说明,请参阅使用 SQL 在 Amazon Redshift 中使用 Amazon Redshift ML 创建、训练和部署机器学习模型

要创建具有默认 IAM 角色的简单集群,请参阅在 A mazon Redshift 中 使用默认 IAM 角色来简化访问其他 亚马逊云科技 服务

使用的数据集

在这篇文章中,我们使用 信用卡欺诈检测数据 来创建、训练和部署 MLP 模型,该模型可用于进一步从新捕获的交易记录中识别欺诈交易。

该数据集包含欧洲持卡人在 2013 年 9 月用信用卡进行的交易。
该数据集显示了两天内发生的交易,在284,807笔交易中,我们有492起欺诈行为。数据集非常不平衡,正面类别(欺诈)占所有交易的0.172%。

它仅包含作为 主成分分析 变换结果的数值输入 变量。由于保密问题,没有提供有关数据的原始功能和更多背景信息。特征 V1、V2、... V28 是使用 PCA 获得的主要分量,唯一未使用 PCA 转换的特征是 “时间” 和 “数量”。功能 “时间” 包含数据集中每笔交易与第一笔交易之间经过的秒数。“金额” 功能是交易金额。要素 “等级” 是响应变量,如果是欺诈,则取值 1,否则为 0。

以下是示例记录:

准备数据

使用以下 SQL 将信用卡数据集加载到亚马逊 Redshift 中。你可以使用 Amazon Redshift 查询编辑器 v2 或你首选的 SQL 工具来运行这些命令。

Alternately we have provided a notebook you may use to execute all the sql commands that can be downloaded here . You will find instructions in this blog on how to import and use notebooks.

要创建表,请使用以下命令:

CREATE TABLE creditcardsfrauds (
    txtime integer,
    v1 float8,
    v2 float8,
    v3 float8,
    v4 float8,
    v5 float8,
    v6 float8,
    v7 float8,
    v8 float8,
    v9 float8,
    v10 float8,
    v11 float8,
    v12 float8,
    v13 float8,
    v14 float8,
    v15 float8,
    v16 float8,
    v17 float8,
    v18 float8,
    v19 float8,
    v20 float8,
    v21 float8,
    v22 float8,
    v23 float8,
    v24 float8,
    v25 float8,
    v26 float8,
    v27 float8,
    v28 float8,
    amount float8,
    class integer
);

加载数据

要将数据加载到亚马逊 Redshift 中,请使用以下 COPY 命令:

COPY creditcardsfrauds
FROM 's3://redshift-ml-blog-mlp/creditcard.csv' 
IAM_ROLE default
CSV QUOTE as '\"' delimiter ',' IGNOREHEADER 1 maxerror 100
REGION 'us-east-1';

在创建模型之前,我们希望通过拆分 80% 的数据集进行训练,20% 用于验证,将数据分成两组,这是 ML 中的常见做法。将训练数据输入到 ML 模型中,以确定模型的最佳算法。创建模型后,我们使用验证数据来验证模型的准确性。

因此,在 “ creditcardsfrauds ” 表中,我们根据 “ txtime ” 值检查数据的分布,并确定大约80%数据的截止值以训练模型。

由此,txtime 的最高值为 120954(基于 txtime 的最小值、最大值、按窗口函数排序和 ceil(count (*) *0.80)值的分布),在此基础上,我们认为用于创建训练数据的' txtim e'字段值小于120954的交易记录。然后,我们通过预测其余20%数据的 “ 类别 ” 属性来验证该模型是否正确识别欺诈性交易,从而验证该模型的准确性。

80% 的截止值的分布不一定总是基于订购时间。也可以根据正在考虑的用例随机获取。

在 Redshift ML 中创建模型

要创建模型 , 请使用以下命令:

 CREATE model creditcardsfrauds_mlp
FROM (select * from creditcardsfrauds where txtime < 120954)
TARGET class 
FUNCTION creditcardsfrauds_mlp_fn
IAM_ROLE default
MODEL_TYPE MLP
SETTINGS (
      S3_BUCKET '<<your-amazon-s3-bucket-name>>’,
      MAX_RUNTIME 9600
);

在这里,在命令的设置部分中,您需要设置一个 S3_BUCKET ,用于导出发送到 SageMaker 的数据并存储模型工件。

S3_BUC KET 设置是命令的必填参数,而 MAX_RUNTIME 是可选参数,它指定了训练的最大时间。此参数的默认值为 90 分钟(5400 秒),但是您可以通过在命令中明确指定它来覆盖它,就像我们在此处将其设置为运行 9600 秒所做的那样。

前面的语句在后台启动 Amazon SageMaker Autopilot 流程,以自动构建、训练和调整输入数据的最佳机器学习模型。然后,它使用 亚马逊 Sag eMaker Neo 在亚马逊 Redshift 集群中本地部署该模型,或将亚马逊 Redshift Serverless 作为用户定义函数 (UDF) 进行本地部署。

您可以在 Amazon Redshift 中使用 SHO W M ODEL 命令来跟踪模型的创建进度,在创建模型时定义的 ma x_runtime 参数中,模型的创建进度应处于 “ 就绪” 状态。

要检查模型的状态,请使用以下命令:

show model creditcardsfrauds_mlp;

我们从上表中注意到,训练数据的 F1 分数 为 0.908,这显示出非常好的性能精度。

详细地说,F1-Score 是精度和召回率的谐波平均值。它使用以下公式将精度和召回率合并为一个数字:

在哪里,精确度意味着:在所有积极的预测中,有多少是真正积极的?

而且 Recall 意味着:在所有真正的阳性病例中,有多少预测为阳性?

F1 分数可以介于 0 到 1 之间,其中 1 表示将每个观测值完美分类为正确类别的模型,0 表示无法将任何观测值归类为正确类别的模型。因此,F1 分数越高越好。

以下是模型训练完成后前面命令的详细表格结果。

Model Name creditcardsfrauds_mlp
Schema Name public
Owner redshiftml
Creation Time Sun, 25.09.2022 16:07:18
Model State READY
validation:binary_f_beta 0.908864
Estimated Cost 112.296925
TRAINING DATA: .
Query SELECT * FROM CREDITCARDSFRAUDS WHERE TXTIME < 120954
Target Column CLASS
PARAMETERS: .
Model Type mlp
Problem Type BinaryClassification
Objective F1
AutoML Job Name redshiftml-20221118035728881011
Function Name creditcardsfrauds_mlp_fn
. creditcardsfrauds_mlp_fn_prob
Function Parameters txtime v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 amount
Function Parameter Types int4 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8 float8
IAM Role default
S3 Bucket redshift-ml-blog-mlp
Max Runtime 54000

Redshift ML 现在支持二元分类模型的预测概率。对于机器学习中的分类问题,对于给定的记录,每个标签可以关联一个概率,该概率表示该记录真正属于该标签的可能性。当基于所选标签的置信度高于模型返回的特定阈值时,客户可以选择将概率与标签一起使用。

默认情况下,二元分类模型的预测概率是计算的,并且在创建模型时会创建附加函数,而不会影响 ML 模型的性能。

在上面的片段中,你会注意到预测概率的增强为模型函数添加了另一个函数作为后缀 ( _prob ),其名称为 “cred itcardsfrauds _mlp_fn_prob”,可用于获取预测概率。

此外,您可以检查 模型的可解释性 , 以了解哪些输入对得出预测做出了有效的贡献。

通过回答以下问题,模型可解释性有助于理解预测原因:

  • 为什么该模型预测当有人去另一个国家旅行并以不同的货币提取大量资金时,会出现负面结果,例如信用卡被封锁?
  • 模型如何做出预测?许多信用卡数据可以采用表格格式,根据涉及多层完全连接的神经网络的MLP流程,我们可以分辨出哪个输入特征实际对模型输出做出了贡献及其大小。
  • 为什么模型做出了错误的预测?例如,尽管交易是合法的,但为什么该卡仍被封锁?
  • 哪些特征对模型行为的影响最大?影响预测的因素是否仅仅取决于刷卡的地点,甚至是一天中的时间和异常的信用消费?

运行以下 SQL 命令从可解释性报告中检索值:

SELECT json_table.report.explanations.kernel_shap.label0.global_shap_values 
FROM (select explain_model('creditcardsfrauds_mlp') as report) as json_table;

在前面的屏幕截图中,我们只选择了从 e x plain_model 函数返回的响应中投影 shapley 值的列。如果您注意到查询的响应,则每个 json 对象中的值都会显示不同特征在影响预测方面的贡献。例如,从前面的片段来看,v14 功能对预测的影响最大,而 txtime 功能在预测 “等级” 方面并没有真正起到任何重要作用。

模型验证

现在,让我们运行预测查询并在验证数据集中验证模型的准确性:

FROM (
  SELECT 
      CASE WHEN class =  
      creditcardsfrauds_mlp_fn(txtime,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,amount) 
      THEN 'PredictedMatchesActual' 
      else 'NoMatch' 
      END as actualvspredicted
    FROM creditcardsfrauds 
    WHERE txtime >= 120954
) 
group by actualvspredicted

我们可以在这里观察到,Redshift ML能够正确地将99.88%的交易识别为欺诈性或非欺诈性。

现在,你可以继续使用这个 SQL 函数 creditcardsfrauds_mlp_fn 在 SQL 查询的任何部分 进行本地推断,同时分析、可视化或报告新到的数据和现有数据!

--CREATE A STAGING TABLE TO HOLD NEWLY ARRIVING DATA FROM THE SOURCE WHICH WILL NOT CONAIN THE CLASS COLUMN - AS IT IS TO BE PREDICTED
DROP TABLE creditcardsfrauds_staging;
CREATE TABLE creditcardsfrauds_staging as (select * from creditcardsfrauds limit 0);
Alter table creditcardsfrauds_staging drop column class;

--LETS CONSIDER ONLY ONE RECORD HERE WHICH HAS NEWLY ARRIVED
insert into creditcardsfrauds_staging values(174965,-39999.11383160738512,0.58586417180689,-5.39973021073242,1.81709247345531,-0.840618465991056,-2.94354779071974,-2.20800192003372,1.05873267723056,-1.63233334974982,-5000.24598383776964,11.93351953683592,-53046479695456,-1.12745457501155,-666666.41662797597451,0.141237234328704,-2.54949823633632,-4.61471706851594,-10.47813794126038,-0.0354803664667244,0.306270740368093,0.583275998701341,-0.269208637986581,-0.456107772584008,-0.183659129549716,-0.328167759255761,0.606115810329683,0.884875539542905,-0.253700318894381,-2450000000);

--USE THE FUNCTION TO PREDICT THE VALUE OF CLASS
SELECT txtime, creditcardsfrauds_mlp_fn(txtime,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,amount)
FROM creditcardsfrauds_staging;

根据推断,这里的输出 1 表示新捕获的交易是欺诈性的。

此外,您可以更改上述查询以包括上述场景中标签输出的预测概率,并决定是否仍喜欢使用模型的预测。

--USE THE FUNCTION TO PREDICT THE VALUE OF CLASS ALONG WITH THE PROBABILITY
Select txtime, predictedActive.labels[0], predictedActive.probabilities[0] 
from (
SELECT txtime, creditcardsfrauds_mlp_fn_prob(txtime,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,amount)as predictedACtive
FROM creditcardsfrauds_staging ) temp

上面的屏幕截图显示,该交易具有100%的欺诈可能性。

清理

为了避免将来产生费用,您可以在不使用 Redshift 集群时将其停止。如果你仅出于实验目的运行了这篇博客文章中的练习,你甚至可以完全终止 Redshift 集群。如果您改用无服务器版本的Redshift,则在使用之前,它不会花费任何费用。但是,如前所述,如果您使用的是 Redshift 的预配置版本,则必须停止或终止集群。

结论

Redshift ML 使所有级别的用户都能轻松地使用 SQL 接口创建、训练和调整模型。在这篇文章中,我们向您介绍了如何使用 MLP 算法创建二进制分类模型。然后,您可以使用这些模型使用简单的 SQL 命令进行预测并获得有价值的见解。

要了解有关 RedShift 机器学习的更多信息,请访问 亚马逊 Reds hift ML。


作者简介

Anuradha Karlekar 是 亚马逊云科技 的解决方案架构师,主要为合作伙伴和初创公司工作。她在全栈开发、部署、构建数据 ETL 管道和可视化方面拥有超过 15 年的 IT 经验。她热衷于数据分析和文本搜索。工作之余 — 她是个旅行爱好者!

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

Abhishek Pan 是一名解决方案架构师兼分析师,在 亚马逊云科技 印度工作。他与客户互动以定义数据驱动的策略,提供有关分析用例的深入讨论以及设计可扩展和高性能的分析应用程序。他拥有超过11年的经验,热衷于数据库、分析和借助云解决方案解决客户问题。一个狂热的旅行者,试图通过我的镜头捕捉世界

Debu Pand a 是 亚马逊云科技 产品管理高级经理,是分析、应用程序平台和数据库技术领域的行业领导者,在 IT 领域拥有超过 25 年的经验。Debu 发表了许多关于分析、企业 Java 和数据库的文章,并在诸如 re: Invent、Oracle Open World 和 Java One 等多个会议上发表过演讲。他是《EJB 3 在行动》(曼宁出版社 2007、2014 年)和《中间件管理》(Packt)的主要作者。