

 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_linear_learner_regression"></a>

在本教學課程中，您會使用來自 Amazon S3 的資料建立線性學習程式模型，並使用 Amazon Redshift ML 透過該模型執行預測查詢。SageMaker AI 線性學習程式演算法可解決迴歸或多類別分類問題。若要進一步了解迴歸和多類別分類問題，請參閱《Amazon SageMaker AI 開發人員指南》中的[機器學習範例的問題類型](https://docs.aws.amazon.com/sagemaker/latest/dg/algorithms-choose.html#basic-machine-learning-paradigms)。在本教學課程中，您需解決迴歸問題。線性學習程式演算法可同時訓練許多模型，並自動判斷最佳化程度最高的模型。您可以在 Amazon Redshift 中使用 CREATE MODEL 操作，該操作會使用 SageMaker AI 建立您的線性學習程式模型，並將預測函式傳送到 Amazon Redshift。如需線性學習程式演算法的相關資訊，請參閱《Amazon SageMaker AI 開發人員指南》中的[線性學習程式演算法](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)。

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

線性學習程式模型可最佳化連續目標或離散目標。連續目標用於迴歸，而離散變數用於分類。某些方法會僅針對連續目標提供解決方案，例如迴歸方法。與單純的超參數最佳化技術 (例如 Naive Bayes 技術) 相比，線性學習程式演算法的速度更快。單純的最佳化技術會假定每個輸入變數都是獨立的。若要使用線性學習程式演算法，您必須提供代表輸入維度的資料欄，以及表示觀測值的資料列。如需線性學習程式演算法的相關資訊，請參閱《Amazon SageMaker AI 開發人員指南》中的[線性學習程式演算法](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)。

在本教學課程中，您將建置一個線性學習程式模型，以預測鮑魚的年齡。您可以在[鮑魚資料集](http://archive.ics.uci.edu/ml/datasets/Abalone)上使用 CREATE MODEL 命令來確定鮑魚的物理測量之間的關係。然後，您可以使用該模型來判斷鮑魚的年齡。

## 使用案例範例
<a name="tutorial_linear_learner_regression_tasks"></a>

您可以使用線性學習程式和 Amazon Redshift ML 來解決其他迴歸問題，例如預測房屋的價格。您還可以使用 Redshift ML 來預測將使用城市自行車租賃服務的人數。

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

## 先決條件
<a name="tutorial_linear_learner_regression_prereqs"></a>

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

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

使用 [Amazon Redshift 查詢編輯器 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) 來執行下列查詢。這些查詢會將範例資料載入 Redshift，並將資料分割為訓練集和驗證集。

1. 以下查詢會建立 `abalone_dataset` 資料表。

   ```
   CREATE TABLE abalone_dataset (
       id INT IDENTITY(1, 1),
       Sex CHAR(1),
       Length float,
       Diameter float,
       Height float,
       Whole float,
       Shucked float,
       Viscera float,
       Shell float,
       Rings integer
   );
   ```

1. 下列查詢會將 Amazon S3 中[鮑魚資料集](http://archive.ics.uci.edu/ml/datasets/Abalone)的範例資料複製到您先前在 Amazon Redshift 中建立的 `abalone_dataset` 資料表。

   ```
   COPY abalone_dataset
   FROM
       's3://redshift-ml-multiclass/abalone.csv' REGION 'us-east-1' IAM_ROLE default CSV IGNOREHEADER 1 NULL AS 'NULL';
   ```

1. 透過手動分割資料，您將能夠透過配置額外預測集來驗證模型的準確性。下面的查詢會將資料分成兩組。`abalone_training` 資料表用於訓練，`abalone_validation` 資料表用於驗證。

   ```
   CREATE TABLE abalone_training as 
   SELECT 
       *
   FROM
       abalone_dataset
   WHERE
       mod(id, 10) < 8;
   
   CREATE TABLE abalone_validation as 
   SELECT 
       *
   FROM
       abalone_dataset
   WHERE
       mod(id, 10) >= 8;
   ```

## 步驟 2：建立機器學習模型
<a name="tutorial_linear_learner_regression_step_create_model"></a>

在此步驟中，您可以使用 CREATE MODEL 陳述式來建立具有線性學習程式演算法的機器學習模型。

下列查詢會使用 S3 儲存貯體建立具有 CREATE MODEL 操作的線性學習程式模型。將 amzn-s3-demo-bucket 取代為您的 S3 儲存貯體。

```
CREATE MODEL model_abalone_ring_prediction
FROM
    (
        SELECT
            Sex,
            Length,
            Diameter,
            Height,
            Whole,
            Shucked,
            Viscera,
            Shell,
            Rings AS target_label
        FROM
            abalone_training
    ) TARGET target_label FUNCTION f_abalone_ring_prediction IAM_ROLE default MODEL_TYPE LINEAR_LEARNER PROBLEM_TYPE REGRESSION OBJECTIVE 'MSE' SETTINGS (
        S3_BUCKET 'amzn-s3-demo-bucket',
        MAX_RUNTIME 15000
    );
```

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

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

使用下列查詢來監控模型訓練進度。

```
SHOW MODEL model_abalone_ring_prediction;
```

當模型準備就緒時，先前操作的輸出看起來應與下列範例類似。請注意，輸出會提供 `validation:mse` 指標，即均方誤差。在下一個步驟中，您將使用均方誤差來驗證模型的準確度。

```
+--------------------------+----------------------------------------------------------------------------------------------------+
|        Model Name        |                                   model_abalone_ring_prediction                                    |
+--------------------------+----------------------------------------------------------------------------------------------------+
| Schema Name              | public                                                                                             |
| Owner                    | awsuser                                                                                            |
| Creation Time            | Thu, 30.06.2022 18:00:10                                                                           |
| Model State              | READY                                                                                              |
| validation:mse           |                                                                                           4.168633 |
| Estimated Cost           |                                                                                           4.291608 |
|                          |                                                                                                    |
| TRAINING DATA:           |                                                                                                    |
| Query                    | SELECT SEX , LENGTH , DIAMETER , HEIGHT , WHOLE , SHUCKED , VISCERA , SHELL, RINGS AS TARGET_LABEL |
|                          | FROM ABALONE_TRAINING                                                                              |
| Target Column            | TARGET_LABEL                                                                                       |
|                          |                                                                                                    |
| PARAMETERS:              |                                                                                                    |
| Model Type               | linear_learner                                                                                     |
| Problem Type             | Regression                                                                                         |
| Objective                | MSE                                                                                                |
| AutoML Job Name          | redshiftml-20220630180010947843                                                                    |
| Function Name            | f_abalone_ring_prediction                                                                          |
| Function Parameters      | sex length diameter height whole shucked viscera shell                                             |
| Function Parameter Types | bpchar float8 float8 float8 float8 float8 float8 float8                                            |
| IAM Role                 | default-aws-iam-role                                                                               |
| S3 Bucket                | amzn-s3-demo-bucket                                                                                |
| Max Runtime              |                                                                                              15000 |
+--------------------------+----------------------------------------------------------------------------------------------------+
```

## 步驟 3：驗證模型
<a name="tutorial_linear_learner_regression_step_validate"></a>

1. 下列預測查詢會計算均方誤差和均方根誤差，藉此驗證 `abalone_validation` 資料集上模型的準確性。

   ```
   SELECT
       ROUND(AVG(POWER((tgt_label - predicted), 2)), 2) mse,
       ROUND(SQRT(AVG(POWER((tgt_label - predicted), 2))), 2) rmse
   FROM
       (
           SELECT
               Sex,
               Length,
               Diameter,
               Height,
               Whole,
               Shucked,
               Viscera,
               Shell,
               Rings AS tgt_label,
               f_abalone_ring_prediction(
                   Sex,
                   Length,
                   Diameter,
                   Height,
                   Whole,
                   Shucked,
                   Viscera,
                   Shell
               ) AS predicted,
               CASE
                   WHEN tgt_label = predicted then 1
                   ELSE 0
               END AS match,
               CASE
                   WHEN tgt_label <> predicted then 1
                   ELSE 0
               END AS nonmatch
           FROM
               abalone_validation
       ) t1;
   ```

   先前查詢的輸出看起來應該像下列範例。均方誤差指標的值應與 SHOW MODEL 操作輸出所顯示的 `validation:mse` 指標相似。

   ```
   +-----+--------------------+
   | mse |        rmse        |
   +-----+--------------------+
   | 5.1 | 2.2600000000000002 |
   +-----+--------------------+
   ```

1. 使用下列查詢，在預測函數上執行 EXPLAIIN\$1MODEL 操作。操作會傳回模型可解釋性報告。如需 EXPLAIN\$1MODEL 操作的相關資訊，請參閱《Amazon Redshift 資料庫開發人員指南》中的 [EXPLAIN\$1MODEL 函數](https://docs.aws.amazon.com/redshift/latest/dg/r_explain_model_function.html)。

   ```
   SELECT
       EXPLAIN_MODEL ('model_abalone_ring_prediction');
   ```

   下列資訊是先前 EXPLAIN\$1MODEL 操作所產生模型可解釋性報告的範例。每個輸入的值為 Shapley 值。Shapley 值代表每個輸入對模型預測的影響，值較高的輸入對預測的影響較大。在此範例中，值較高的輸入對預測鮑魚的年齡有較大的影響。

   ```
   { 
       "explanations": { 
           "kernel_shap": { 
               "label0": { 
                   "expected_value" :10.290688514709473,
                   "global_shap_values": { 
                       "diameter" :0.6856910187882492,
                       "height" :0.4415323937124035,
                       "length" :0.21507476107609084,
                       "sex" :0.448611774505744,
                       "shell" :1.70426496893776,
                       "shucked" :2.1181392924386994,
                       "viscera" :0.342220754059912,
                       "whole" :0.6711906974084011 
                   } 
               } 
           } 
       },
       "version" :"1.0" 
   };
   ```

1. 針對尚未成熟的鮑魚，使用以下查詢來計算模型做出正確預測的百分比。未成熟的鮑魚有 10 個或更少的環，而正確預測的準確度與實際環數僅差不到一個環。

   ```
   SELECT
       TRUNC(
           SUM(
               CASE
                   WHEN ROUND(
                       f_abalone_ring_prediction(
                           Sex,
                           Length,
                           Diameter,
                           Height,
                           Whole,
                           Shucked,
                           Viscera,
                           Shell
                       ),
                       0
                   ) BETWEEN Rings - 1
                   AND Rings + 1 THEN 1
                   ELSE 0
               END
           ) / CAST(COUNT(SHELL) AS FLOAT),
           4
       ) AS prediction_pct
   FROM
       abalone_validation
   WHERE
       Rings <= 10;
   ```

## 相關主題
<a name="tutorial_linear_learner_regression_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)