教學課程:創建客户流失模型 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教學課程:創建客户流失模型

您可以使用簡單的 CREATE MODEL 命令導出訓練數據、訓練模型、導入模型以及準備 Amazon Redshift 預測函數。使用 CREATE MODEL 語句可以將訓練數據指定為表或 SELECT 語句。

以下教程説明瞭使用 CREATE MODEL 命令生成的 SQL 函數創建模型並針對不同方案運行一些推理查詢的端到端示例。此示例中使用的完整 SQL 腳本可在SQL 命令

使用 Amazon Redshift ML 時,請考量以下事項:

  • 用於創建模型的 Redshift 羣集和用於存儲培訓數據和模型工件的 Amazon S3 存儲桶必須位於同一AWS區域。

  • 要查看或下載本文檔中使用的 SQL 命令以及示例中使用的示例數據集,請執行以下操作之一:

    • 下載SQL 命令客户活動檔案,和鮑魚文件

    • 使用AWS CLI請 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

以下查詢通過創建名為customer_activity並使用示例數據集攝取數據。

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 'arn:aws:iam::XXXXXXXXXXXX:role/Redshift-ML' DELIMITER ',' IGNOREHEADER 1;

以下示例使用加州大學歐文分校 Machine Learning 數據集存儲庫中公開提供的客户流失預測數據集。移動運營商擁有歷史記錄,其中客户最終會發生流動,並繼續使用該服務。該示例使用此歷史信息,使用稱為培訓的過程構建一個移動運營商流失的機器學習模型。培訓模型後,將使用任意客户的配置文件信息來訓練模型。然後,Amazon Redshift 將此信息傳遞給模型,並使用模型預測該客户是否會流失。此示例的數據集位於客户活動檔案

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 'arn:aws:iam::XXXXXXXXXXXX:role/Redshift-ML'SETTINGS ( S3_BUCKET 'your-bucket' );

SELECT 查詢會建立訓練資料。目標子句指定哪一列是 CREATE MODEL 用於學習如何預測的機器學習「標籤」。其餘列是用於預測的要素(輸入)。在此示例中,培訓數據為 2020-01-01 之前擁有帳户的客户提供功能狀態、帳户長度、區域代碼、平均每日支出和平均每日案例。為了簡化,客户在訂閲的同一天取消訂閲的可能性將被忽略。目標列「流失」表示客户是否仍具有活動成員資格或已暫停成員資格。

CREATE MODEL 分析輸入要素與「活動」結果之間的相關性,以提供一個模型,該模型可以使用客户的年齡、郵政編碼、支出和案例等輸入來預測客户是否處於活動狀態。

在幕後,Amazon Redshift 默認使用 Amazon SageMaker 自動駕駛儀進行培訓。尤其是,Amazon Redshift 會在客户指定的 Amazon S3 存儲桶中安全地導出培訓數據。如果您未指定 KMS_KEY_ID,則缺省情況下使用服務器端加密 SSE-S3 對資料進行加密。

如果您使用服務器端加密與AWS KMS託管密鑰 (SSE-MMS),然後添加以下權限:

{ "Effect": "Allow", "Action": [ "kms:Encrypt" "kms:Decrypt" ] }

如需 SagMaker 角色的詳細資訊,請參。Amazon SageMaker 角色中的Amazon SageMaker 開發人員指南

您還必須提供 IAM_ROLE 角色才能訪問 Amazon S3 和亞馬 Amazon SageMaker。首先,你準備好了所有的要求。然後,您可以使用創建模型語句。此時,Amazon Redshift 可以立即開始使用 Amazon SageMaker 來訓練和調整您的問題類型的最佳模型。

創建模型命令在異步模式下運行,並在將訓練數據導出到 Amazon S3 時返回。模型培訓和彙編的其餘步驟可能耗費時間,並在後台繼續進行。在此操作中,您可以使用標準模型信息。訓練完成後,您可以使用顯示模型

有關簡單使用 CREATE MODEL 的語法和功能的摘要,請參閲簡易建立模型

導出訓練數據後,「創建模型」命令完成。培訓活動繼續在背景下進行。若要檢查訓練狀態,請使用標準模型信息

select schema_name, model_name, model_state from stv_ml_model_info; schema_name | model_name | model_state -------------+---------------------------+-------------------------------------- public | customer_churn_auto_model | Train Model On SageMaker In Progress (1 row)

模型狀態變為Model is Ready,則「自動」功能將變為可用。Amazon Redshift 使用此函數進行預測。預測函數的輸入參數對應於要素的類型。在此範例中,ML_fn_ 客户自動修改輸入一個 varchar 表示狀態,一個用於帳户長度的整數,一個整數表示區域代碼,平均月支出的小數點和平均月度案例的小數。預測函數的輸出類型與 CREATE MODEL 語句的目標列類型相同。

要執行預測,只需在 SQL 查詢中使用預測函數即可進行推斷。例如,以下查詢預測 2020-01-01 之後註冊的客户是否經歷流失。

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';

預測函數可以出現在任何 SQL 結構中,包括投影、WHERE、HAVING、分組 BY 和 ORDER BY 子句。

以下示例對不同的用户案例使用上一個 CREATE MODEL 示例中的推斷函數。在此使用案例中,Amazon Redshift 會預測來自記錄日期大於 2020-01-01 的不同州的客户中流浪者和非流浪者的比例。

WITH inferred 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 inferred GROUP BY state ORDER BY state;