

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# 教學課程：建置多類別分類模型
<a name="tutorial_multi-class_classification"></a>

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

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

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

## 使用案例範例
<a name="tutorial_multi-class_classification_tasks"></a>

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

**工作**
+ 先決條件
+ 步驟 1：將資料從 Amazon S3 載入到 Amazon Redshift
+ 步驟 2：建立機器學習模型
+ 步驟 3：執行模型的預測

## 先決條件
<a name="tutorial_multi-class_classification_prereqs"></a>

為完成此教學課程，您必須完成 Amazon Redshift ML 的[管理設定](https://docs.aws.amazon.com/redshift/latest/dg/admin-setup.html)。

## 步驟 1：將資料從 Amazon S3 載入到 Amazon Redshift
<a name="tutorial_multi-class_classification_step_load"></a>

使用 [Amazon Redshift 查詢編輯器 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) 來執行下列查詢。這些查詢會將範例資料載入 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)
   );
   ```

1. 下列查詢會將[電子商務銷售預測資料集](https://www.kaggle.com/allunia/e-commerce-sales-forecast)中的範例資料複製到 `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;
   ```

### 分割資料
<a name="tutorial_multi-class_classification_split_data"></a>

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

使用下列 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：建立機器學習模型
<a name="tutorial_multi-class_classification_step_create_model"></a>

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

下列查詢會使用 CREATE MODEL 操作建立具有訓練集的多類別分類模型。將 amzn-s3-demo-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 'amzn-s3-demo-bucket',
        S3_GARBAGE_COLLECT OFF
    );
```

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

### 顯示模型訓練的狀態 (選擇性)
<a name="tutorial_multi-class_classification_show_status"></a>

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

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

```
SHOW MODEL ecommerce_customer_activity;
```

當模型準備就緒時，先前操作的輸出應會顯示 `Model State` 為 `Ready`。下列為 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         |                                         amzn-s3-demo-bucket                                    |
|       Max Runtime        |                                             5400                                              |
+--------------------------+-----------------------------------------------------------------------------------------------+
```

## 步驟 3：執行模型的預測
<a name="tutorial_multi-class_classification_step_perform_predictions"></a>

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

### 針對驗證資料執行預測查詢 (選擇性)
<a name="tutorial_multi-class_classification_run_validation_prediction"></a>

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

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

### 預測有多少客戶錯失加入機會 (選擇性)
<a name="tutorial_multi-class_classification_run_missed_entries"></a>

下列查詢會比較預測只會在 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);
```

## 相關主題
<a name="tutorial_multi-class_classification_related_topics"></a>

如需 Amazon Redshift ML 的相關資訊，請參閱下列文件：
+ [使用 Amazon Redshift ML 的成本](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)
+ [CREATE MODEL 操作](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_MODEL.html)
+ [EXPLAIN\$1MODEL 函數](https://docs.aws.amazon.com/redshift/latest/dg/r_explain_model_function.html)

如需機器學習的相關資訊，請參閱下列文件：
+ [機器學習概述](https://docs.aws.amazon.com/redshift/latest/dg/machine_learning_overview.html)
+ [適用於新手和專家的機器學習](https://docs.aws.amazon.com/redshift/latest/dg/novice_expert.html)
+ [什麼是機器學習預測的公平性和模型解釋性？](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html)