教程:构建客户流失模型
在本教程中,您使用 Amazon Redshift ML 通过 CREATE MODEL 命令创建客户流失模型,并针对用户场景运行预测查询。然后,您可以使用 CREATE MODEL 命令生成的 SQL 函数来实施查询。
您可以使用简单的 CREATE MODEL 命令导出训练数据、训练模型、导入模型以及准备 Amazon Redshift 预测函数。使用 CREATE MODEL 语句将训练数据指定为表或 SELECT 语句。
该示例使用历史信息构建一个有关移动运营商客户流失的机器学习模型。首先,SageMaker 训练您的机器学习模型,然后使用任意客户的资料信息测试您的模型。模型经过验证后,Amazon SageMaker 会将模型和预测函数部署到 Amazon Redshift。您可以使用预测函数来预测客户是否会流失。
使用案例示例
您可以使用 Amazon Redshift ML 解决其他二进制分类问题,例如预测销售机会是否会关闭。您还可以预测金融交易是否具有欺诈性。
任务
-
先决条件
-
步骤 1:将数据从 Amazon S3 加载到 Amazon Redshift
-
步骤 2:创建机器学习模型
-
步骤 3:使用模型执行预测
先决条件
要完成本教程,您需要满足以下先决条件:
-
您必须为 Amazon Redshift ML 设置 Amazon Redshift 集群。为此,请使用适用于 Amazon Redshift ML 管理的集群和配置设置文档。
-
您用于创建模型的 Amazon Redshift 集群和用于暂存训练数据和存储模型构件的 Amazon S3 桶必须位于同一个 AWS 区域中。
-
要下载本文档中使用的 SQL 命令和示例数据集,请执行以下操作之一:
-
将 AWS CLI 用于 Simple Storage Service(Amazon S3),运行以下命令。您可以使用自己的目标路径。
aws s3 cp s3://redshift-downloads/redshift-ml/tutorial-scripts/redshift-ml-tutorial.sql
</target/path>
aws s3 cp s3://redshift-downloads/redshift-ml/customer_activity/customer_activity.csv</target/path>
aws s3 cp s3://redshift-downloads/redshift-ml/abalone_xgb/abalone_xgb.csv</target/path>
步骤 1:将数据从 Amazon S3 加载到 Amazon Redshift
使用 Amazon Redshift 查询器 v2 编辑和运行查询并可视化结果。
运行以下查询将创建一个名为 customer_activity
的表,并从 Amazon S3 获取示例数据集。
DROP TABLE IF EXISTS customer_activity; CREATE TABLE customer_activity ( state varchar(2), account_length int, area_code int, phone varchar(8), intl_plan varchar(3), vMail_plan varchar(3), vMail_message int, day_mins float, day_calls int, day_charge float, total_charge float, eve_mins float, eve_calls int, eve_charge float, night_mins float, night_calls int, night_charge float, intl_mins float, intl_calls int, intl_charge float, cust_serv_calls int, churn varchar(6), record_date date ); COPY customer_activity FROM 's3://redshift-downloads/redshift-ml/customer_activity/' REGION 'us-east-1' IAM_ROLE default FORMAT AS CSV IGNOREHEADER 1;
步骤 2:创建机器学习模型
在这个模型中,流失是我们的目标输入。模型的所有其他输入是一些属性,它们可帮助创建用于预测流失的函数。
下面的示例使用 CREATE MODEL 操作来提供一个模型,该模型使用诸如客户的年龄、邮政编码、支出和案例等输入来预测客户是否将成为活跃客户。在以下示例中,将 amzn-s3-demo-bucket 替换为您自己的 Amazon S3 存储桶。
CREATE MODEL customer_churn_auto_model FROM ( SELECT state, account_length, area_code, total_charge/account_length AS average_daily_spend, cust_serv_calls/account_length AS average_daily_cases, churn FROM customer_activity WHERE record_date < '2020-01-01' ) TARGET churn FUNCTION ml_fn_customer_churn_auto IAM_ROLE default SETTINGS ( S3_BUCKET 'amzn-s3-demo-bucket' );
前一个示例中的 SELECT 查询将创建训练数据。TARGET 子句指定哪一列是 CREATE MODEL 操作用于学习如何进行预测的机器学习标签。目标列“流失”表示客户是否仍具有有效会员资格或已暂停会员资格。S3_BUCKET 字段是您之前创建的 Amazon S3 桶的名称。Amazon S3 桶用于在 Amazon Redshift 和 Amazon SageMaker 之间共享训练数据和构件。其余列是用于预测的功能。
有关 CREATE MODEL 命令的基本使用案例的语法和特性的摘要,请参阅简单 CREATE MODEL。
添加服务器端加密的权限(可选)
原定设置情况下,Amazon Redshift 使用 Amazon SageMaker Autopilot 进行训练。特别是,Amazon Redshift 将训练数据安全地导出到客户指定的 Amazon S3 桶。如果不指定 KMS_KEY_ID
,则原定设置情况下,会使用服务器端加密 SSE-S3 对数据进行加密。
如果您使用服务器端加密及 AWS KMS 托管式密钥 (SSE-KMS) 对您的输入进行加密,则添加以下权限:
{ "Effect": "Allow", "Action": [ "kms:Encrypt" "kms:Decrypt" ] }
有关 Amazon SageMaker 角色的更多信息,请参阅《Amazon SageMaker 开发人员指南》中的 Amazon SageMaker 角色。
检查模型训练的状态(可选)
您可以使用 SHOW MODEL 命令来了解模型何时准备就绪。
使用以下操作检查模型的状态。
SHOW MODEL customer_churn_auto_model;
以下是上一个操作的输出示例。
+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Key | Value | +--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Model Name | customer_churn_auto_model | | Schema Name | public | | Owner | awsuser | | Creation Time | Tue, 14.06.2022 17:15:52 | | Model State | TRAINING | | | | | TRAINING DATA: | | | Query | SELECT STATE, ACCOUNT_LENGTH, AREA_CODE, TOTAL_CHARGE / ACCOUNT_LENGTH AS AVERAGE_DAILY_SPEND, CUST_SERV_CALLS / ACCOUNT_LENGTH AS AVERAGE_DAILY_CASES, CHURN | | | FROM CUSTOMER_ACTIVITY | | | WHERE RECORD_DATE < '2020-01-01' | | Target Column | CHURN | | | | | PARAMETERS: | | | Model Type | auto | | Problem Type | | | Objective | | | AutoML Job Name | redshiftml-20220614171552640901 | | Function Name | ml_fn_customer_churn_auto | | Function Parameters | state account_length area_code average_daily_spend average_daily_cases | | Function Parameter Types | varchar int4 int4 float8 int4 | | IAM Role | default-aws-iam-role | | S3 Bucket | amzn-s3-demo-bucket | | Max Runtime | 5400 | +--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
模型训练完成后,model_state
变量变为 Model is Ready
,预测函数变为可用。
步骤 3:使用模型执行预测
您可以使用 SQL 语句来查看预测模型所做的预测。在此示例中,由 CREATE MODEL 操作创建的预测函数名为 ml_fn_customer_churn_auto
。预测函数的输入参数对应于功能的类型,如 varchar 对应于 state
,而 integer 对应于 account_length
。预测函数的输出类型与 CREATE MODEL 语句的 TARGET 列相同。
-
您根据 2020 年 1 月 1 日之前的数据对模型进行了训练,因此,现在您可以对测试集使用预测函数。以下查询显示了 2020 年 1 月 1 日之后注册的客户是否会经历流失的预测。
SELECT phone, ml_fn_customer_churn_auto( state, account_length, area_code, total_charge / account_length, cust_serv_calls / account_length ) AS active FROM customer_activity WHERE record_date > '2020-01-01';
-
以下示例将相同的预测函数用于不同的使用案例。在此案例中,Amazon Redshift 预测记录日期晚于 2020 年 1 月 1 日的各州客户的流失者和非流失者的比例。
WITH predicted AS ( SELECT state, ml_fn_customer_churn_auto( state, account_length, area_code, total_charge / account_length, cust_serv_calls / account_length ) :: varchar(6) AS active FROM customer_activity WHERE record_date > '2020-01-01' ) SELECT state, SUM( CASE WHEN active = 'True.' THEN 1 ELSE 0 END ) AS churners, SUM( CASE WHEN active = 'False.' THEN 1 ELSE 0 END ) AS nonchurners, COUNT(*) AS total_per_state FROM predicted GROUP BY state ORDER BY state;
-
以下示例将预测函数用于预测某州客户流失百分比的使用案例。在此案例中,Amazon Redshift 预测记录日期晚于 2020 年 1 月 1 日的流失百分比。
WITH predicted AS ( SELECT state, ml_fn_customer_churn_auto( state, account_length, area_code, total_charge / account_length, cust_serv_calls / account_length ) :: varchar(6) AS active FROM customer_activity WHERE record_date > '2020-01-01' ) SELECT state, CAST((CAST((SUM( CASE WHEN active = 'True.' THEN 1 ELSE 0 END )) AS FLOAT) / CAST(COUNT(*) AS FLOAT)) AS DECIMAL (3, 2)) AS pct_churn, COUNT(*) AS total_customers_per_state FROM predicted GROUP BY state ORDER BY 3 DESC;
相关 主题
有关 Amazon Redshift ML 的更多信息,请参阅以下文档:
有关机器学习的更多信息,请参阅以下文档: