

 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을 사용하여 다중 클래스 분류 문제를 해결하는 기계 학습 모델을 생성합니다. 다중 클래스 분류 알고리즘은 데이터 포인트를 세 개 이상의 클래스 중 하나로 분류합니다. 그런 다음 CREATE MODEL 명령이 생성하는 SQL 함수를 사용하여 쿼리를 구현합니다.

CREATE MODEL 명령을 사용하여 훈련 데이터를 내보내고, 모델을 훈련하고, 모델을 가져오고, Amazon Redshift 예측 함수를 준비할 수 있습니다. CREATE MODEL 스테이트먼트를 사용하여 테이블 또는 SELECT 작업으로 훈련 데이터를 지정합니다.

튜토리얼대로 진행하기 위해 온라인 영국 소매업체의 판매 데이터가 들어 있는 [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 dataset](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\$16개월 동안만 활동할 것으로 예상되는 고객 수를 비교합니다. 이 모델은 이러한 고객이 충성도 프로그램에 선택되지 않을 것으로 예측합니다. 그런 다음 쿼리는 간발의 차로 선택되지 못하는 고객의 수와 충성도 프로그램에 선택될 자격이 있는 것으로 예측되는 고객의 수를 비교합니다. 이 쿼리는 충성도 프로그램의 긱준을 낮출지 결정하는 데 사용될 수 있습니다. 또한 프로그램에 간발의 차로 선택되지 않을 것으로 예상되는 고객이 많은지도 판단할 수 있습니다. 그러면 해당 고객에게 활동을 늘려 충성도 프로그램 멤버십을 얻도록 권장할 수 있습니다.

```
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)
+ [What Is Fairness and Model Explainability for Machine Learning Predictions?(기계 학습 예측을 위한 공정성과 모델 설명 가능성이란 무엇입니까?](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html))