

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の 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 を使用して、複数クラス分類の問題を解決する機械学習モデルを作成します。多クラス分類アルゴリズムは、データポイントを 3 つ以上のクラスのいずれかに分類します。次に、CREATE MODEL コマンドが生成する SQL 関数を使用してクエリを実装します。

CREATE MODEL コマンドを使用して、トレーニングデータのエクスポート、モデルのトレーニング、モデルのインポート、Amazon Redshift 予測関数の準備を行うことができます。トレーニングデータをテーブルまたは SELECT ステートメントとして指定するには、CREATE MODEL オペレーションを使用します。

このチュートリアルでは、パブリックデータセットの [E-Commerce Sales Forecast](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. 次のクエリは、サンプルデータを [E-Commerce Sales Forecast データセット](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 ステートメントを使用して、データをトレーニング、検証、および予測の 3 つのセットに分割します。

```
--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 機械学習を使用するためのコスト](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)