教學課程:建置多類別分類模型 - Amazon Redshift

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

教學課程:建置多類別分類模型

在本教學課程中,您會使用 Amazon Redshift ML 建立可解決多類別分類問題的機器學習模型。多類別分類演算法將資料點分類為三個或多個類別之一。然後,您可以使用 CREATE MODEL 命令所產生的 SQL 函數來實作查詢。

您可以使用 CREATE MODEL 命令來匯出訓練資料、訓練模型、匯入模型,以及準備 Amazon Redshift 預測函數。使用 CREATE MODEL 操作,將訓練資料指定為資料表或 SELECT 陳述式。

若要按照本教學課程進行操作,您可以使用公共資料集電子商務銷售預測,其中包括線上英國零售商的銷售資料。您產生的模型將以特殊客戶忠誠度計劃中最活躍的客戶為目標。透過多類別分類,您可以使用該模型來預測客戶在 13 個月之間有多少個月是活躍的。預測函數會指定預計會活躍 7 個月或更長時間的客戶來加入該計劃。

使用案例範例

您可以使用 Amazon Redshift ML 解決其他多類別分類問題,例如從產品線預測暢銷產品。您還可以預測圖像包含哪些水果,例如選擇蘋果、梨子或柳橙。

工作

  • 必要條件

  • 步驟 1:將資料從 Amazon S3 載入到 Amazon Redshift

  • 步驟 2:建立機器學習模型

  • 步驟 3:執行模型的預測

必要條件

為完成此教學課程,您必須完成 Amazon Redshift ML 的管理設定

步驟 1:將資料從 Amazon S3 載入到 Amazon Redshift

使用 Amazon Redshift 查詢編輯器 v2 來執行下列查詢。這些查詢會將範例資料載入 Amazon Redshift。

  1. 以下範例會查詢名為 ecommerce_sales 的資料表。

    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) );
  2. 下列查詢會將電子商務銷售預測資料集中的範例資料複製到 ecommerce_sales 資料表中。

    COPY ecommerce_sales FROM 's3://redshift-ml-multiclass/ecommerce_data.txt' IAM_ROLE default DELIMITER '\t' IGNOREHEADER 1 REGION 'us-east-1' MAXERROR 100;

分割資料

當您在 Amazon Redshift ML 中建立模型時, SageMaker 會自動將資料分割為訓練和測試集, SageMaker 以便判斷模型的準確性。透過在此步驟手動分割資料,您將能夠透過配置額外預測集來驗證模型的準確性。

使用下列 SQL 陳述式將資料分割成三組,以進行訓練、驗證和預測。

--creates table with all data 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 ); --creates training set 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 ); --creates validation set 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 ); --creates prediction set CREATE TABLE ecommerce_sales_prediction AS ( SELECT customerid, country, stockcode, description, invoicedate, sales_amt FROM ecommerce_sales_data WHERE data_group_id > 90);

步驟 2:建立機器學習模型

在此步驟中,您可以使用 CREATE MODEL 陳述式,使用多類別分類來建立機器學習模型。

下列查詢會使用 CREATE MODEL 操作建立具有訓練集的多類別分類模型。將 DOC-EXAMPLE-BUCKET 取代為您自己的 Amazon S3 儲存貯體。

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 default PROBLEM_TYPE MULTICLASS_CLASSIFICATION SETTINGS ( S3_BUCKET '<DOC-EXAMPLE-BUCKET>', S3_GARBAGE_COLLECT OFF );

在此查詢中,您可以將問題類型指定為 Multiclass_Classification。您為模型預測的目標是 nbr_months_active。 SageMaker 完成模型訓練後,它會建立函數predict_customer_activity,您將使用該函數在 Amazon Redshift 中進行預測。

顯示模型訓練的狀態 (選擇性)

您可以使用 SHOW MODEL 命令來知道模型何時準備就緒。

使用下列查詢傳回模型的各種指標,包括模型狀態和準確度。

SHOW MODEL ecommerce_customer_activity;

當模型準備就緒時,先前操作的輸出應會顯示 Model StateReady。下列為 SHOW MODEL 操作的輸出範例。

+--------------------------+-----------------------------------------------------------------------------------------------+ | Model Name | ecommerce_customer_activity | +--------------------------+-----------------------------------------------------------------------------------------------+ | Schema Name | public | | Owner | awsuser | | Creation Time | Fri, 17.06.2022 19:02:15 | | Model State | READY | | Training Job Status | MaxAutoMLJobRuntimeReached | | validation:accuracy | 0.991280 | | Estimated Cost | 7.897689 | | | | | TRAINING DATA: | | | Query | SELECT CUSTOMERID, COUNTRY, STOCKCODE, DESCRIPTION, INVOICEDATE, SALES_AMT, NBR_MONTHS_ACTIVE | | | FROM ECOMMERCE_SALES_TRAINING | | Target Column | NBR_MONTHS_ACTIVE | | | | | PARAMETERS: | | | Model Type | xgboost | | Problem Type | MulticlassClassification | | Objective | Accuracy | | AutoML Job Name | redshiftml-20220617190215268770 | | Function Name | predict_customer_activity | | Function Parameters | customerid country stockcode description invoicedate sales_amt | | Function Parameter Types | int8 varchar varchar varchar varchar float8 | | IAM Role | default-aws-iam-role | | S3 Bucket | DOC-EXAMPLE-BUCKET | | Max Runtime | 5400 | +--------------------------+-----------------------------------------------------------------------------------------------+

步驟 3:執行模型的預測

以下查詢會顯示哪些客戶符合您客戶忠誠度計劃的資格。如果模型預測客戶至少有 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;

針對驗證資料執行預測查詢 (選擇性)

針對驗證資料執行下列預測查詢,以查看模型的準確度層級。

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;

預測有多少客戶錯失加入機會 (選擇性)

下列查詢會比較預測只會在 5 或 6 個月內處於活躍狀態的客戶數量。該模型會預測這些客戶將錯過忠誠度計劃。然後,查詢會將幾乎不會錯過該計劃的數量與預測符合忠誠度計劃資格的數量進行比較。此查詢可用於提供是否要降低忠誠度計劃門檻的決定。您還可以定判斷是否有大量的客戶預計幾乎不會錯過該計劃。然後,您可以鼓勵這些客戶增加他們的活動,以獲得忠誠度計劃會員資格。

SELECT predict_customer_activity( customerid, country, stockcode, description, invoicedate, sales_amt ) AS predicted_months_active, COUNT(customerid) FROM ecommerce_sales_prediction WHERE predicted_months_active BETWEEN 5 AND 6 GROUP BY 1 ORDER BY 1 ASC LIMIT 10) UNION (SELECT NULL AS predicted_months_active, COUNT (customerid) FROM ecommerce_sales_prediction WHERE predict_customer_activity( customerid, country, stockcode, description, invoicedate, sales_amt ) >=7);

如需 Amazon Redshift ML 的相關資訊,請參閱下列文件:

如需機器學習的相關資訊,請參閱下列文件: