

 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="machine_learning"></a>

Amazon Redshift 기계 학습은 모든 기술 수준의 분석가와 데이터 사이언티스트가 기계 학습 기술을 더 쉽게 사용할 수 있도록 하는 강력한 클라우드 기반 서비스입니다. Amazon Redshift ML은 모델을 사용하여 결과를 만듭니다. 모델 사용 방법은 다음과 같습니다.
+ 모델을 훈련하려는 데이터와 데이터 입력과 연결된 메타데이터를 Amazon Redshift에 제공합니다. 그런 다음 Amazon Redshift ML은 입력 데이터의 패턴을 캡처하는 Amazon SageMaker AI의 모델을 생성합니다. 모델에 자체 데이터를 사용하여 Amazon Redshift ML로 이탈 예측, 고객 생애 주기 값 또는 수익 예측 등의 데이터 추세를 식별할 수 있습니다. 이러한 모델을 사용하면 추가 비용 없이 새 입력 데이터에 대한 예측을 생성하는 것이 가능합니다.
+ Claude 또는 Amazon Titan과 같이 Amazon Bedrock에서 제공하는 파운데이션 모델(FM) 중 하나를 사용할 수 있습니다. Amazon Bedrock을 사용하면 몇 가지 단계로 대규모 언어 모델(LLM)의 힘을 Amazon Redshift의 분석 데이터와 통합할 수 있습니다. 외부 대규모 언어 모델(LLM)을 사용하여 Amazon Redshift로 데이터에 대한 자연어 처리(NLP)를 수행하는 것이 가능합니다. 텍스트 작성, 감정 분석 또는 번역 등의 애플리케이션에 NLP를 사용할 수 있습니다. Amazon Redshift에서 Amazon Bedrock 사용에 관한 자세한 내용은 [Amazon Redshift ML과 Amazon Bedrock의 통합](machine-learning-br.md) 섹션을 참조하시기 바랍니다.

**참고**  
**서비스 개선을 위한 데이터 사용 선택 해제**  
Amazon Bedrock 모델을 사용하는 경우 Amazon Bedrock 서비스가 데이터를 처리하는 방법에 대한 AWS 정책을 읽어보는 것이 좋습니다. Amazon Bedrock에서 향후 이러한 기능을 구현할 경우 모델 또는 서비스 개선을 위해 귀하의 데이터를 사용하는 것을 방지하는 옵트아웃 정책을 사용할지 결정해야 합니다. 이 서비스에서 이러한 목적으로 귀하의 데이터를 사용하지 않도록 하려면 일반 AWS 옵트아웃 정책을 사용합니다.  
자세한 내용은 다음을 참조하세요.  
[AI 서비스 옵트아웃 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_ai-opt-out.html)
[Amazon Bedrock FAQ](https://aws.amazon.com/bedrock/faqs/)

**참고**  
 LLM은 부정확한 정보나 불완전한 정보를 생성할 수 있습니다. LLM이 생성하는 정보를 확인하여 정확하고 완전한 정보인지 확인하는 것이 좋습니다.

**Amazon Redshift 기계 학습이 Amazon SageMaker AI와 작동하는 방식**

Amazon Redshift는 Amazon SageMaker AI Autopilot과 함께 작동하여 최상의 모델을 자동으로 얻고 Amazon Redshift에서 예측 함수를 사용할 수 있도록 합니다.

다음 다이어그램은 Amazon Redshift 기계 학습의 작동 방식을 보여줍니다.

![\[Amazon SageMaker AI Autopilot과 통합되는 Amazon Redshift ML용 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/images/machine_learning_overview.png)


일반적인 워크플로는 다음과 같습니다.

1. Amazon Redshift는 훈련 데이터를 Amazon S3로 내보냅니다.

1. Amazon SageMaker AI Autopilot은 훈련 데이터를 사전 처리합니다. *사전 처리*는 누락 값 대치와 같은 중요한 기능을 수행합니다. 특정 열이 우편 번호와 같은 범주형임을 인식하고 훈련을 위해 적절한 형식을 지정하고 기타 여러 태스크를 수행합니다. 훈련 데이터세트에 적용할 최고의 전처리기를 선택하는 것 자체가 문제이며 Amazon SageMaker AI Autopilot은 솔루션을 자동화합니다.

1. Amazon SageMaker AI Autopilot은 가장 정확한 예측으로 모델을 제공하는 알고리즘 및 알고리즘 하이퍼파라미터를 찾습니다.

1. Amazon Redshift는 예측 함수를 Amazon Redshift 클러스터에 SQL 함수로 등록합니다.

1. CREATE MODEL 문을 실행할 때 Amazon Redshift는 훈련에 Amazon SageMaker AI를 사용합니다. 따라서 모델 훈련을 위한 관련 비용이 있습니다. 이는 AWS 청구서에서 Amazon SageMaker AI에 대한 별도의 품목입니다. 또한 훈련 데이터를 저장하기 위해 Amazon S3에서 사용하는 스토리지에 대한 비용을 지불합니다. Redshift 클러스터에서 컴파일하고 실행할 수 있는 CREATE MODEL로 생성된 모델을 사용한 추론에는 요금이 부과되지 않습니다. Amazon Redshift 기계 학습 사용에 따른 추가 Amazon Redshift 요금은 없습니다.

**Topics**
+ [기계 학습 개요](machine_learning_overview.md)
+ [초보자 및 전문가를 위한 기계 학습](novice_expert.md)
+ [Amazon Redshift 기계 학습 사용 비용](cost.md)
+ [Amazon Redshift 기계 학습 시작하기](getting-started-machine-learning.md)
+ [Amazon Redshift ML 튜토리얼](tutorials_for_amazon_redshift_ml.md)
+ [Amazon Redshift ML과 Amazon Bedrock의 통합](machine-learning-br.md)

# 기계 학습 개요
<a name="machine_learning_overview"></a>

Amazon Redshift를 사용하면 기계 학습 기능을 활용하여 데이터에서 중요한 인사이트를 확보할 수 있습니다. 이 기계 학습(ML) 개요에서는 ML 모델 훈련 및 배포용 데이터를 탐색, 시각화 및 준비하는 방법을 보여 줍니다. 다음 섹션에서는 Amazon Redshift ML을 사용하여 기계 학습으로 데이터의 잠재력을 활용하는 프로세스를 설명합니다.

Amazon Redshift 기계 학습을 사용하면 SQL 문으로 기계 학습 모델을 훈련하고 예측을 위해 SQL 쿼리에서 해당 기계 학습 모델을 호출할 수 있습니다.

Amazon Redshift 기계 학습 사용 방법에 대해 알아보려면 다음 동영상을 시청하세요.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/pJF2kYGtO4A/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/pJF2kYGtO4A)


Redshift 클러스터 또는 서버리스 작업 그룹 설정을 위한 전제 조건, 권한 및 Amazon Redshift ML 사용에 대한 소유권에 대한 자세한 내용은 다음 섹션을 참조하시기 바랍니다. 이 섹션에서는 Amazon Redshift 기계 학습에서 간단한 훈련 및 예측이 작동하는 방식도 설명합니다.

## 기계 학습으로 문제를 해결하는 방법
<a name="solve_problem"></a>

기계 학습 모델은 훈련 데이터에서 패턴을 찾아 새 데이터에 적용하여 예측을 생성합니다. 기계 학습에서는 데이터를 가장 잘 설명하는 패턴을 학습하여 이러한 모델을 훈련합니다. 그런 다음 모델을 사용하여 새 데이터에 대한 예측(추론이라고도 함)을 수행합니다. 기계 학습은 일반적으로 파라미터를 변경하고 훈련 데이터를 개선하여 예측의 정확도를 계속해서 개선할 수 있는 반복적인 프로세스입니다. 데이터가 변경되면 새 데이터 집합으로 새 모델을 다시 훈련합니다.

다양한 비즈니스 목표를 달성하기 위한 여러 가지 기본 기계 학습 접근 방식이 있습니다.

### Amazon Redshift 기계 학습의 지도 학습
<a name="supervised_learning"></a>

Amazon Redshift는 고급 엔터프라이즈 분석에 대한 가장 일반적인 접근 방식인 지도 학습을 지원합니다. 지도 학습은 설정된 데이터 집합이 있고 특정 입력 데이터가 다양한 비즈니스 결과를 예측하는 방법을 이해하고 있는 경우 선호되는 기계 학습 방식입니다. 이러한 결과는 레이블이라고도 합니다. 특히 데이터 집합은 특성(입력)과 타겟(출력)으로 구성된 속성이 있는 테이블입니다. 예를 들어 과거 및 현재 고객의 연령 및 우편 번호를 제공하는 테이블이 있다고 가정합니다. 현재 고객에 대해 true이고 멤버십을 일시 중단한 고객에 대해 false인 "활성" 필드도 있다고 가정합니다. 지도 기계 학습의 목표는 대상이 "False"인 고객으로 대표되는 고객 이탈로 이어지는 연령 및 우편 번호 패턴을 파악하는 것입니다. 이 모델을 사용하여 멤버십 일시 중단과 같이 이탈할 가능성이 있는 고객을 예측하고 잠재적으로 유지 인센티브를 제공할 수 있습니다.

Amazon Redshift는 회귀, 이진 분류 및 다중 클래스 분류를 포함하는 지도 학습을 지원합니다. 회귀는 고객의 총 지출과 같은 연속 값을 예측하는 문제를 나타냅니다. 이진 분류는 고객 이탈 여부를 예측하는 것과 같이 두 가지 결과 중 하나를 예측하는 문제를 나타냅니다. 다중 클래스 분류는 고객이 관심을 가질 만한 항목을 예측하는 것과 같이 많은 결과 중 하나를 예측하는 문제를 나타냅니다. 데이터 분석가와 데이터 사이언티스트는 이를 사용하여 예측, 개인화 또는 고객 이탈 예측에 이르는 문제를 해결할 수 있는 지도 학습을 수행할 수 있습니다. 또한 매출 종료 예측, 수익 예측, 사기 탐지 및 고객 평생 가치 예측과 같은 문제에서 지도 학습을 사용할 수 있습니다.

### Amazon Redshift 기계 학습의 비지도 학습
<a name="unsupervised_learning"></a>

비지도 학습은 기계 학습 알고리즘을 사용하여 레이블이 지정되지 않은 훈련 데이터를 분석하고 그룹화합니다. 알고리즘은 숨겨진 패턴 또는 그룹화를 검색합니다. 목표는 데이터의 기본 구조 또는 분포를 모델링하여 데이터에 대해 자세히 알아보는 것입니다.

비지도 학습 문제를 해결하기 위해 Amazon Redshift는 K-Means 클러스터링 알고리즘을 지원합니다. 이 알고리즘은 데이터에서 그룹을 검색하려는 클러스터링 문제를 해결합니다. K-Means 알고리즘은 데이터 내에서 개별 그룹 찾기를 시도합니다. 분류되지 않은 데이터는 유사점과 차이점에 따라 그룹화되고 분할됩니다. 그룹화를 통해 K-Means 알고리즘은 최상의 중심을 반복적으로 결정하고 각 구성원을 가장 가까운 중심에 할당합니다. 같은 중심에 가장 가까운 멤버는 같은 그룹에 속합니다. 그룹의 멤버는 같은 그룹의 다른 멤버와 최대한 유사하고 다른 그룹의 멤버와 최대한 다릅니다. 예를 들어, K-Means 클러스터링 알고리즘은 전염병의 영향을 받는 도시를 분류하거나 소비재의 인기를 기반으로 도시를 분류하는 데 사용할 수 있습니다.

K-Means 알고리즘을 사용할 때 데이터에서 찾을 클러스터 수를 지정하는 입력 `k`를 지정합니다. 이 알고리즘의 출력은 k 중심 집합입니다. 각 데이터 포인트는 가장 가까운 k 클러스터 중 하나에 속합니다. 각 클러스터는 중심으로 설명됩니다. 클러스터의 다차원 평균으로 중심을 생각할 수 있습니다. K-Means 알고리즘은 거리를 비교하여 클러스터가 서로 얼마나 다른지 확인합니다. 거리가 멀수록 일반적으로 클러스터 간의 차이가 커집니다.

데이터 사전 처리는 모델의 특성이 동일한 규모로 유지되고 신뢰할 수 있는 결과를 생성하도록 보장하기 때문에 K-Means에 중요합니다. Amazon Redshift는 StandardScaler, MinMax 및 NumericPassthrough와 같은 CREATE MODEL 문에 대한 일부 K-Means 프로프로세서를 지원합니다. K-means에 대한 사전 처리를 적용하지 않으려면 변환기로 명시적으로 NumericPassthrough를 선택합니다. K-Means 파라미터에 대한 자세한 내용은 [K-MEANS 파라미터를 사용한 CREATE MODEL](r_create_model_use_cases.md#r_k-means-create-model-parameters) 섹션을 참조하세요.

K-Means 클러스터링을 사용하여 비지도 학습을 수행하는 방법에 대해 알아보려면 다음 동영상을 시청하세요.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/TFKgl5d0U_0/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/TFKgl5d0U_0)


## Amazon Redshift 기계 학습 용어 및 개념
<a name="terminology"></a>

다음 용어는 몇 가지 Amazon Redshift 기계 학습 개념을 설명하는 데 사용됩니다.
+ Amazon Redshift의 *기계 학습*은 하나의 SQL 명령으로 모델을 훈련합니다. Amazon Redshift 기계 학습과 Amazon SageMaker AI는 모든 데이터 변환, 권한, 리소스 사용 및 적절한 모델 검색을 관리합니다.
+ *훈련*은 Amazon Redshift가 지정된 데이터 하위 집합을 모델로 실행하여 기계 학습 모델을 생성하는 단계입니다. Amazon Redshift는 자동으로 Amazon SageMaker AI에서 훈련 작업을 시작하고 모델을 생성합니다.
+ *추론*이라고도 하는 *예측*은 Amazon Redshift SQL 쿼리에서 모델을 사용하여 결과를 예측하는 것입니다. 추론 시 Amazon Redshift는 모델 기반 예측 함수를 더 큰 쿼리의 일부로 사용하여 예측을 생성합니다. 예측은 Redshift 클러스터에서 로컬로 계산되므로 처리량이 높고 대기 시간이 짧으며 추가 비용이 없습니다.
+ *기존 보유 모델 사용(BYOM)*으로 Amazon Redshift에서 로컬로 데이터베이스 내 추론을 위해 Amazon SageMaker AI와 함께 Amazon Redshift 외부에서 훈련된 모델을 사용할 수 있습니다. Amazon Redshift 기계 학습은 로컬 추론에서 BYOM 사용을 지원합니다.
+ *로컬 추론*은 모델이 Amazon SageMaker AI에서 사전 훈련되고 Amazon SageMaker AI Neo에서 컴파일되고 Amazon Redshift 기계 학습에서 현지화될 때 사용됩니다. 로컬 추론이 지원되는 모델을 Amazon Redshift로 가져오려면 CREATE MODEL 명령을 사용합니다. Amazon Redshift는 Amazon SageMaker AI Neo를 직접 호출하여 사전 훈련된 SageMaker AI 모델을 가져옵니다. 여기서 모델을 컴파일하고 컴파일된 모델을 Amazon Redshift로 가져옵니다. 더 빠른 속도와 더 낮은 비용을 위해 로컬 추론을 사용합니다.
+ *원격 추론*은 Amazon Redshift가 SageMaker AI에 배포된 모델 엔드포인트를 간접 호출할 때 사용됩니다. 원격 추론은 Amazon SageMaker AI에서 구축 및 배포한 TensorFlow 모델과 같은 모든 유형의 사용자 지정 정의 및 딥 러닝 모델을 간접 호출할 수 있는 유연성을 제공합니다.

다음과 같은 사항도 중요합니다.
+ *Amazon SageMaker AI*는 완전관리형 기계 학습 서비스입니다. Amazon SageMaker AI를 통해 데이터 과학자와 개발자는 모델을 쉽게 구축 및 훈련하고 프로덕션 지원 호스팅 환경에 직접 배포할 수 있습니다. Amazon SageMaker AI에 대한 자세한 내용은 *Amazon SageMaker AI Developer Guide*의 [What is Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) 섹션을 참조하세요.
+ *Amazon SageMaker AI Autopilot*는 데이터를 기반으로 분류 또는 회귀에 가장 적합한 기계 학습 모델을 자동으로 훈련하고 조정하는 기능 집합입니다. 완전한 제어와 가시성을 유지합니다. Amazon SageMaker AI Autopilot은 테이블형 입력 데이터를 지원합니다. Amazon SageMaker AI Autopilot은 자동 데이터 정리 및 사전 처리, 선형 회귀를 위한 자동 알고리즘 선택, 바이너리 분류 및 멀티클래스 분류를 제공합니다. 또한 자동 하이퍼파라미터 최적화(HPO), 분산 교육, 자동 인스턴스 및 클러스터 크기 선택을 지원합니다. Amazon SageMaker AI Autopilot에 대한 자세한 내용은 *Amazon SageMaker AI Developer Guide*의 [Automate model development with Amazon SageMaker AI Autopilot](https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-automate-model-development.html) 섹션을 참조하세요.
+ *Amazon Bedrock*은 완전관리형 서비스로, 생성형 AI 애플리케이션을 구축하는 데 필요한 광범위한 여러 기능과 함께 단일 API를 통해 AI21 Labs, Anthropic, Cohere, Meta, Mistral AI, Stability AI 및 Amazon과 같은 선도적인 AI 회사의 고성능 파운데이션 모델(FM)을 제공합니다.

# 초보자 및 전문가를 위한 기계 학습
<a name="novice_expert"></a>

Amazon Redshift를 사용하면 기계 학습(ML) 기능을 활용하여 ML 초보자든 전문가든 관계없이 데이터에서 인사이트를 얻을 수 있습니다. 기계 학습은 광범위한 ML 전문 지식이나 복잡한 데이터 엔지니어링 없이 SQL 명령을 사용하여 ML 모델을 생성, 훈련 및 배포할 수 있는 Amazon Redshift 기능입니다.

다음 섹션을 통해 기계 학습을 활용하는 프로세스를 설명하여 Amazon Redshift를 사용하여 데이터의 잠재력을 최대한 활용할 수 있도록 지원합니다.

Amazon Redshift ML을 사용하면 단일 SQL CREATE MODEL 명령으로 모델을 훈련할 수 있습니다. CREATE MODEL 명령은 Amazon Redshift에서 익숙한 SQL 구문으로 모델 기반 예측을 생성하는 데 사용하는 모델을 생성합니다.

Amazon Redshift 기계 학습은 기계 학습, 도구, 언어, 알고리즘 및 API에 대한 전문 지식이 없는 경우 특히 유용합니다. Amazon Redshift 기계 학습을 사용하면 외부 기계 학습 서비스와 통합하는 데 필요한 획일적이고 과중한 업무를 수행할 필요가 없습니다. Amazon Redshift를 사용하면 데이터 형식 지정 및 이동, 권한 제어 관리, 사용자 정의 통합, 워크플로 및 스크립트 구축에 소요되는 시간을 절약할 수 있습니다. 인기 있는 기계 학습 알고리즘을 쉽게 사용하고 훈련에서 예측까지 자주 반복해야 하는 훈련 요구 사항을 단순화할 수 있습니다. Amazon Redshift는 자동으로 최상의 알고리즘을 검색하고 문제에 가장 적합한 모델을 조정합니다. Amazon Redshift 외부로 데이터를 이동하거나 다른 서비스와 인터페이스하고 비용을 지불할 필요 없이 Amazon Redshift 클러스터 내에서 예측할 수 있습니다.

Amazon Redshift 기계 학습은 기계 학습을 사용하는 데이터 분석가와 데이터 사이언티스트를 지원합니다. 또한 이를 통해 기계 학습 전문가는 지식을 사용하여 CREATE MODEL 문이 지정한 측면만 사용하도록 안내할 수 있습니다. 이렇게 하면 CREATE MODEL이 최상의 후보를 찾는 데 필요한 시간을 단축하거나 모델의 정확도를 높이거나 둘 다 가능합니다.

CREATE MODEL 문은 훈련 작업에 파라미터를 지정하는 방법에 유연성을 제공합니다. 이러한 유연성을 통해 기계 학습 초보자 또는 전문가 모두 선호하는 프로프로세서, 알고리즘, 문제 유형 및 하이퍼파라미터를 선택할 수 있습니다. 예를 들어 고객 이탈에 관심이 있는 사용자는 CREATE MODEL 문에서 문제 유형이 고객 이탈에 잘 작동하는 이진 분류라고 지정할 수 있습니다. 그런 다음 CREATE MODEL 문은 최상의 모델 검색을 이진 분류 모델로 좁힙니다. 사용자가 문제 유형을 선택하더라도 CREATE MODEL 문이 사용할 수 있는 옵션은 여전히 많습니다. 예를 들어 CREATE MODEL은 최상의 사전 처리 변환을 검색 및 적용하고 최상의 하이퍼파라미터 설정을 검색합니다.

Amazon Redshift 기계 학습이 Amazon SageMaker AI Autopilot을 사용하여 최적의 모델을 자동으로 찾아 훈련을 더 쉽게 만듭니다. 백그라운드에서 Amazon SageMaker AI Autopilot은 제공된 데이터를 기반으로 최고의 기계 학습 모델을 자동으로 훈련하고 조정합니다. 그런 다음 Amazon SageMaker AI Neo가 훈련 모델을 컴파일하고 Redshift 클러스터에서 예측에 사용할 수 있도록 합니다. 훈련된 모델을 사용하여 기계 학습 추론 쿼리를 실행할 때 쿼리는 Amazon Redshift의 대규모 병렬 처리 기능을 사용할 수 있습니다. 동시에 쿼리는 기계 학습 기반 예측을 사용할 수 있습니다.
+ *기계 학습 초보자*로서 프로프로세서, 알고리즘 및 하이퍼파라미터와 같은 기계 학습의 다양한 측면에 대한 일반 지식이 있는 경우 지정한 측면에만 CREATE MODEL 문을 사용합니다. 그런 다음 CREATE MODEL이 최상의 후보를 찾는 데 필요한 시간을 줄이거나 모델의 정확도를 향상시킬 수 있습니다. 문제 유형이나 목표와 같은 추가 도메인 지식을 도입하여 예측의 비즈니스 가치를 높일 수도 있습니다. 예를 들어 고객 이탈 시나리오에서 "고객이 활동하고 있지 않음"이라는 결과가 드물다면 F1 목표가 정확도 목표보다 선호되는 경우가 많습니다. 높은 정확도 모델은 항상 "고객이 활동하고 있음"이라고 예측할 수 있기 때문에 정확도는 높지만 비즈니스 가치는 거의 없습니다. F1 목표에 대한 자세한 내용은 *Amazon SageMaker AI API Reference*의 [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) 섹션을 참조하세요.

  CREATE MODEL 문의 기본 옵션에 대한 자세한 내용은 [단순 CREATE MODEL](r_create_model_use_cases.md#r_simple_create_model) 섹션을 참조하세요.
+ *기계 학습 고급* 실무자는 특정(일부) 기능에 대한 문제 유형과 전처리기를 지정할 수 있습니다. 그런 다음 CREATE MODEL은 지정된 측면에 대한 제안을 따릅니다. 동시에 CREATE MODEL은 여전히 나머지 기능과 최고의 하이퍼파라미터에 대한 최고의 프로프로세서를 검색합니다. 훈련 파이프라인의 하나 이상의 측면을 제한하는 방법에 대한 자세한 내용은 [사용자 안내에 따라 CREATE MODEL](r_create_model_use_cases.md#r_user_guidance_create_model) 섹션을 참조하세요.
+ *기계 학습 전문가*는 훈련 및 하이퍼파라미터 튜닝을 완벽하게 제어할 수 있습니다. 그러면 CREATE MODEL 문은 사용자가 모든 선택을 하기 때문에 최적의 프로프로세서, 알고리즘 및 하이퍼파라미터를 검색하려고 하지 않습니다. AUTO OFF와 함께 CREATE MODEL을 사용하는 방법에 대한 자세한 내용은 [AUTO OFF로 CREATE XGBoost 모델](r_create_model_use_cases.md#r_auto_off_create_model) 섹션을 참조하세요.
+ *데이터 엔지니어*는 로컬 추론을 위해 Amazon SageMaker AI에서 Amazon Redshift로 사전 훈련된 XGBoost 모델을 가져올 수 있습니다. 기존 보유 모델 사용(BYOM)으로 Amazon Redshift에서 로컬로 데이터베이스 내 추론을 위해 Amazon SageMaker AI와 함께 Amazon Redshift 외부에서 훈련된 모델을 사용할 수 있습니다. Amazon Redshift 기계 학습은 로컬 또는 원격 추론에서 BYOM 사용을 지원합니다.

  로컬 또는 원격 추론에 CREATE MODEL 문을 사용하는 방법에 대한 자세한 내용은 [기존 보유 모델 사용(BYOM) - 로컬 추론](r_create_model_use_cases.md#r_byom_create_model) 섹션을 참조하세요.

Amazon Redshift 기계 학습 사용자는 다음 옵션을 선택하여 모델을 훈련하고 배포할 수 있습니다.
+ 문제 유형, [사용자 안내에 따라 CREATE MODEL](r_create_model_use_cases.md#r_user_guidance_create_model) 섹션을 참조하세요.
+ 목표, [사용자 안내에 따라 CREATE MODEL](r_create_model_use_cases.md#r_user_guidance_create_model) 또는 [AUTO OFF로 CREATE XGBoost 모델](r_create_model_use_cases.md#r_auto_off_create_model) 섹션을 참조하세요.
+ 모델 유형, [AUTO OFF로 CREATE XGBoost 모델](r_create_model_use_cases.md#r_auto_off_create_model) 섹션을 참조하세요.
+ 전처리기, [사용자 안내에 따라 CREATE MODEL](r_create_model_use_cases.md#r_user_guidance_create_model) 섹션을 참조하세요.
+ 하이퍼파라미터, [AUTO OFF로 CREATE XGBoost 모델](r_create_model_use_cases.md#r_auto_off_create_model) 섹션을 참조하세요.
+ 기존 보유 모델 사용(BYOM), [기존 보유 모델 사용(BYOM) - 로컬 추론](r_create_model_use_cases.md#r_byom_create_model) 섹션을 참조하세요

# Amazon Redshift 기계 학습 사용 비용
<a name="cost"></a>

Amazon Redshift를 사용하면 광범위한 데이터 엔지니어링 또는 기계 학습 전문 지식 없이 기계 학습 기능을 활용하여 데이터에서 인사이트를 도출할 수 있습니다. 다음 섹션에서는 Amazon Redshift ML 사용과 관련된 비용을 설명하며, 이는 강력한 기계 학습 통합을 활용하면서 비용을 계획하고 최적화하는 데 도움이 됩니다.

## SageMaker AI에서 Amazon Redshift ML 사용 시 비용
<a name="cost_sm"></a>

SageMaker AI용 Amazon Redshift ML은 예측에 기존 클러스터 리소스를 사용하므로 추가 Amazon Redshift 요금을 피할 수 있습니다. 모델 생성 또는 사용에 대한 추가 Amazon Redshift 요금은 없습니다. Redshift 클러스터에서 로컬로 예측이 이루어지므로 클러스터 크기를 조정해야 하는 경우가 아니면 추가 비용을 지불할 필요가 없습니다. Amazon Redshift 기계 학습은 모델 훈련에 Amazon SageMaker AI를 사용하며, 이 경우 추가 관련 비용이 발생합니다.

Amazon Redshift 클러스터 내에서 실행되는 예측 함수에 대한 추가 요금은 없습니다. CREATE MODEL 문은 Amazon SageMaker AI를 사용하며 추가 비용이 발생합니다. 비용은 훈련 데이터의 셀 수에 따라 증가합니다. 셀 수는 레코드 수(훈련 쿼리 또는 테이블 시간)에 열 수를 곱한 값입니다. 예를 들어 CREATE MODEL 문의 SELECT 쿼리가 10,000개의 레코드와 5개의 열을 생성할 때 생성되는 셀의 수는 50,000개입니다.

경우에 따라 CREATE MODEL의 SELECT 쿼리에 의해 생성된 훈련 데이터가 제공한 MAX\$1CELLS 제한(제한을 제공하지 않은 경우 기본 100만 개)을 초과합니다. 이러한 경우 CREATE MODEL은 약 MAX\$1CELLS개(즉, 훈련 데이터 집합의 "열 수" 레코드)를 무작위로 선택합니다. 그런 다음 CREATE MODEL은 무작위로 선택된 튜플을 사용하여 훈련을 수행합니다. 무작위 샘플링은 감소된 훈련 데이터 집합에 편향이 없도록 합니다. 따라서 MAX\$1CELLS를 설정하여 훈련 비용을 제어할 수 있습니다.

CREATE MODEL 문을 사용할 때 MAX\$1CELLS 및 MAX\$1RUNTIME 옵션으로 비용, 시간 및 잠재적인 모델 정확도를 제어할 수 있습니다.

MAX\$1RUNTIME은 AUTO ON 또는 OFF 옵션이 사용될 때 SageMaker AI에서 훈련에 소요될 수 있는 최대 시간을 지정합니다. 데이터 집합의 크기에 따라 MAX\$1RUNTIME보다 훈련 작업이 빨리 완료되는 경우가 많습니다. 모델 훈련 후 Amazon Redshift는 백그라운드에서 추가 작업을 수행하여 모델을 컴파일하고 클러스터에 설치합니다. 따라서 CREATE MODEL을 완료하는 데 MAX\$1RUNTIME보다 더 오래 걸릴 수 있습니다. 그러나 MAX\$1RUNTIME은 SageMaker AI에서 모델 훈련에 사용되는 계산량과 시간을 제한합니다. SHOW MODEL을 사용하여 언제든지 모델 상태를 확인할 수 있습니다.

AUTO ON으로 CREATE MODEL을 실행하면 Amazon Redshift 기계 학습은 SageMaker AI Autopilot을 사용하여 다양한 모델 또는 후보를 지능적으로 자동 탐색하여 최적의 모델을 찾습니다. MAX\$1RUNTIME은 소요되는 시간과 계산 시간을 제한합니다. MAX\$1RUNTIME이 너무 낮게 설정되면 하나의 후보라도 탐색할 시간이 충분하지 않을 수 있습니다. ["Autopilot 후보에 모델이 없습니다.(Autopilot candidate has no models)"] 오류가 표시되면 MAX\$1RUNTIME 값을 늘리고 CREATE MODEL을 다시 실행합니다. 이 파라미터에 대한 자세한 내용은 *Amazon SageMaker AI API Reference*의 [MaxAutoMLJobRuntimeInSeconds](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_AutoMLJobCompletionCriteria.html) 섹션을 참조하세요.

AUTO OFF로 CREATE MODEL을 실행하면 MAX\$1RUNTIME은 SageMaker AI에서 훈련 작업이 실행되는 시간에 대한 제한에 해당합니다. 데이터 집합의 크기와 MODEL\$1TYPE XGBOOST의 num\$1rounds와 같이 사용된 기타 파라미터에 따라 훈련 작업이 더 빨리 완료되는 경우가 많습니다.

CREATE MODEL을 실행할 때 MAX\$1CELLS 값을 줄여서 비용을 제어하거나 훈련 시간을 줄일 수도 있습니다. *셀*은 데이터베이스의 항목입니다. 각 행은 고정된 너비 또는 다양한 너비의 열 수만큼의 셀에 해당합니다. MAX\$1CELLS는 셀 수를 제한하므로 모델 훈련에 사용되는 훈련 예제의 수를 제한합니다. 기본적으로 MAX\$1CELLS는 셀 100만 개로 설정됩니다. MAX\$1CELLS를 줄이면 Amazon Redshift가 모델 훈련을 위해 내보내고 SageMaker AI로 보내는 CREATE MODEL의 SELECT 쿼리 결과에서 행 수가 줄어듭니다. 따라서 MAX\$1CELLS를 줄이면 AUTO ON 및 AUTO OFF로 모델을 훈련하는 데 사용되는 데이터 집합의 크기가 줄어듭니다. 이 방법으로 모델 훈련에 드는 비용과 시간을 줄일 수 있습니다. 특정 훈련 작업의 훈련 및 청구 시간에 대한 정보를 보려면 Amazon SageMaker AI에서 **훈련 작업**을 선택합니다.

MAX\$1RUNTIME 및 MAX\$1CELLS를 늘리면 SageMaker AI가 더 많은 후보를 탐색할 수 있어 모델 품질이 향상되는 경우가 많습니다. 이러한 방식으로 SageMaker AI는 더 많은 시간을 들여 각 후보를 훈련하고 더 많은 데이터를 사용하여 더 나은 모델을 훈련할 수 있습니다. 데이터 집합을 더 빠르게 반복하거나 탐색하려면 MAX\$1RUNTIME과 MAX\$1CELLS를 줄입니다. 모델의 정확도를 높이려면 MAX\$1RUNTIME과 MAX\$1CELL을 늘립니다.

다양한 셀 번호와 관련된 비용 및 무료 평가판 세부 정보에 대한 자세한 내용은 [Amazon Redshift 요금](https://aws.amazon.com/redshift/pricing) 섹션을 참조하세요.

## Amazon Bedrock에서 Amazon Redshift ML 사용 시 비용
<a name="cost_sm"></a>

Amazon Bedrock에서 Amazon Redshift ML을 사용하면 추가 비용이 발생합니다. 자세한 내용은 [Amazon Bedrock 요금](https://aws.amazon.com/bedrock/pricing/)을 참조하세요.

# Amazon Redshift 기계 학습 시작하기
<a name="getting-started-machine-learning"></a>

Amazon Redshift 기계 학습을 사용하면 SQL 사용자가 익숙한 SQL 명령으로 기계 학습 모델을 쉽게 생성, 훈련 및 배포할 수 있습니다. Amazon Redshift ML을 사용하면 Redshift 클러스터의 데이터와 Amazon SageMaker AI로 모델을 훈련할 수 있습니다. 그 후 모델이 현지화되고 Amazon Redshift 데이터베이스 내에서 예측이 가능합니다. 현재 Amazon Redshift ML은 기계 학습 알고리즘인 XGBoost(AUTO ON 및 OFF)와 다계층 퍼셉트론(AUTO ON), K-평균(AUTO OFF) 및 선형 학습기를 지원합니다.

**Topics**
+ [Amazon Redshift 기계 학습 관리를 위한 클러스터 및 구성 설정](#admin-setup)
+ [Amazon Redshift 기계 학습에서 모델 설명 사용](#clarify)
+ [Amazon Redshift ML 확률 지표](#probability_metrics)

## Amazon Redshift 기계 학습 관리를 위한 클러스터 및 구성 설정
<a name="admin-setup"></a>

Amazon Redshift 기계 학습을 사용하기 전에 클러스터 설정을 완료하고 Amazon Redshift 기계 학습 사용 권한을 구성합니다.

### Amazon Redshift 기계 학습 사용을 위한 클러스터 설정
<a name="cluster-setup"></a>

Amazon Redshift 기계 학습을 사용하기 전에 다음 사전 조건을 충족합니다.

Amazon Redshift 관리자는 Amazon Redshift 프로비저닝 클러스터를 사용하기 위해 다음의 일회성 설정을 수행합니다. Amazon Redshift Serverless에서 Amazon Redshift ML을 사용하려면 [Amazon Redshift Serverless 시작하기](https://docs.aws.amazon.com/redshift/latest/gsg/new-user-serverless.html)를 참조하시기 바랍니다.

Amazon Redshift 기계 학습에 대해 일회성 클러스터 설정을 수행하려면 

1. AWS Management Console 또는 AWS Command Line Interface(AWS CLI)를 사용하여 Redshift 클러스터를 생성합니다. 클러스터를 생성하는 동안 AWS Identity and Access Management(IAM) 정책을 연결해야 합니다. Amazon SageMaker AI에서 Amazon Redshift ML을 사용하는 데 필요한 권한에 대한 자세한 내용은 [Amazon Redshift 기계 학습(ML)을 사용하는 데 필요한 권한](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#iam-permission-ml?)을 참조하시기 바랍니다.

1. 다음 방법 중 하나로 Amazon Redshift 기계 학습을 사용하는 데 필요한 IAM 역할을 생성합니다.
   + Amazon Redshift ML로 SageMaker AI를 사용하려면 `AmazonS3FullAccess` 및 `AmazonSageMakerFullAccess` 정책을 포함해 IAM 역할을 만듭니다. 예측 모델도 만들 계획이라면 `AmazonForecastFullAccess` 정책도 역할에 연결하세요.
   + Amazon Redshift ML로 Amazon Bedrock을 사용하려면 `AmazonS3FullAccess` 및 `AmazonBedrockFullAccess` 정책을 포함해 IAM 역할을 만듭니다.
   + CREATE MODEL과 같은 SQL 명령을 실행할 수 있는 권한을 가진 `AmazonRedshiftAllCommandsFullAccess` 정책이 있는 Amazon Redshift 콘솔을 통해 IAM 역할을 생성하는 것이 좋습니다. Amazon Redshift는 원활한 API 기반 메커니즘을 사용하여 사용자를 대신하여 AWS 계정에서 프로그래밍 방식으로 IAM 역할을 생성합니다. Amazon Redshift는 기존 AWS 관리형 정책을 IAM 역할에 자동으로 연결합니다. 이 접근 방식을 사용하면 Amazon Redshift 콘솔 내에 머물 수 있고 역할 생성을 위해 IAM 콘솔로 전환할 필요가 없습니다. 자세한 내용은 [Amazon Redshift의 기본값으로 IAM 역할 생성](https://docs.aws.amazon.com/redshift/latest/mgmt/default-iam-role.html)을 참조하세요.

     IAM 역할이 클러스터의 기본값으로 생성되면 리소스 이름의 일부로 `redshift`를 포함하거나 Redshift 관련 태그를 사용하여 해당 리소스에 태그를 지정합니다.

     Amazon Bedrock 파운데이션 모델을 사용하려면 다음 섹션을 추가합니다.

     ```
     // Required section if you use Bedrock models.
     {
        "Effect": "Allow",
        "Action": "bedrock:InvokeModel",
        "Resource": [
            "arn:aws:bedrock:<region>::foundation-model/*"
        ]
     }
     ```
   + 보다 제한적인 정책으로 IAM 역할을 생성하려는 경우 다음 정책을 사용합니다. 필요에 맞게 이 정책을 수정할 수도 있습니다.

     Amazon S3 버킷 `redshift-downloads/redshift-ml/`은 다른 단계 및 예제에 사용되는 샘플 데이터가 저장되는 위치입니다. Amazon S3에서 데이터를 로드할 필요가 없으면 이 버킷을 제거할 수 있습니다. 또는 Amazon Redshift로 데이터를 로드하는 데 사용하는 다른 Amazon S3 버킷으로 바꿉니다.

     *`your-account-id`*, *`your-role`* 및 `amzn-s3-demo-bucket` 값은 CREATE MODEL 명령의 일부로 지정합니다.

     (옵션) Amazon Redshift 기계 학습을 사용하는 동안 AWS KMS 키를 지정하는 경우 샘플 정책의 AWS KMS 키 섹션을 사용합니다. *`your-kms-key`* 값은 CREATE MODEL 명령의 일부로 사용하는 키입니다.

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                     "cloudwatch:PutMetricData",
                     "ecr:BatchCheckLayerAvailability",
                     "ecr:BatchGetImage",
                     "ecr:GetAuthorizationToken",
                     "ecr:GetDownloadUrlForLayer",
                     "logs:CreateLogGroup",
                     "logs:CreateLogStream",
                     "logs:DescribeLogStreams",
                     "logs:PutLogEvents",
                     "sagemaker:*Job*",
                     "sagemaker:AddTags",
                     "sagemaker:CreateModel",
                     "sagemaker:CreateEndpoint",
                     "sagemaker:CreateEndpointConfig",
                     "sagemaker:DeleteEndpoint",
                     "sagemaker:DeleteEndpointConfig",
                     "sagemaker:DeleteModel"
                 ],
                 "Resource": "*"
             },
             {
                 "Effect": "Allow",
                 "Action": [
                     "iam:PassRole",
                     "s3:AbortMultipartUpload",
                     "s3:GetObject",
                     "s3:DeleteObject",
                     "s3:PutObject"
                 ],
                 "Resource": [
                     "arn:aws:iam::111122223333:role/<your-role>",
                     "arn:aws:s3:::amzn-s3-demo-bucket/*",
                     "arn:aws:s3:::redshift-downloads/*"
                 ]
             },
             {
                 "Effect": "Allow",
                 "Action": [
                     "s3:GetBucketLocation",
                     "s3:ListBucket"
                 ],
                 "Resource": [
                     "arn:aws:s3:::amzn-s3-demo-bucket",
                     "arn:aws:s3:::redshift-downloads"
                 ]
             },
             {
                 "Effect": "Allow",
                 "Action": [
                     "kms:CreateGrant",
                     "kms:Decrypt",
                     "kms:DescribeKey",
                     "kms:Encrypt",
                     "kms:GenerateDataKey*"
                  ],
                  "Resource": [
                     "arn:aws:kms:us-east-1:111122223333:key/<your-kms-key>"
                  ]
             }
         ]
     }
     ```

------

1. Amazon Redshift와 SageMaker AI가 다른 서비스와 상호 작용하는 역할을 맡도록 허용하려면 IAM 역할에 다음 신뢰 정책을 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": [
             "redshift.amazonaws.com",
             "sagemaker.amazonaws.com",
             "forecast.amazonaws.com"
           ]
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

1. (선택 사항) Amazon S3 버킷과 AWS KMS 키를 생성합니다. 이들은 Amazon Redshift가 Amazon SageMaker AI로 전송된 훈련 데이터를 저장하고 Amazon SageMaker AI에서 훈련된 모델을 수신하는 데 사용됩니다.

1. (옵션) 여러 사용자 그룹에 대한 액세스를 제어하기 위해 IAM 역할과 Amazon S3 버킷의 다양한 조합을 생성합니다.

1. 향상된 VPC 라우팅을 켜면 Redshift ML과 S3 버킷 간의 트래픽이 프라이빗 VPC를 통과합니다. VPC 라우팅에 대한 자세한 내용은 [Amazon Redshift의 Enhanced VPC Routing](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html) 섹션을 참조하세요.

   하이퍼파라미터 튜닝 작업에 대해 프라이빗 VPC를 지정하는 데 필요한 권한에 대한 자세한 내용은 [Permissions required to use Amazon Redshift ML with Amazon SageMaker AI](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html)를 참조하세요.
**참고**  
원격 SageMaker AI 모델에 대한 추론 직접 호출은 VPC를 통과하지 않습니다.

CREATE MODEL 문을 사용하여 다양한 사용 사례에 대한 모델 생성을 시작하는 방법에 대한 자세한 내용은 [CREATE MODEL](r_CREATE_MODEL.md) 섹션을 참조하세요.

### 권한 및 소유권 관리
<a name="permissions-ownership"></a>

테이블 또는 함수 등의 다른 데이터베이스 객체와 마찬가지로 Amazon Redshift는 기계 학습 모델 생성 및 사용을 액세스 제어 메커니즘에 바인딩합니다. 예측 함수를 실행하는 모델을 생성하기 위한 별도의 권한이 있습니다.

다음 예에서는 2개의 사용자 그룹인 `retention_analyst_grp`(모델 생성자)와 `marketing_analyst_grp`(모델 사용자)를 사용하여 Amazon Redshift의 액세스 제어 관리 방법을 보여줍니다. 보존 분석가는 획득한 권한을 통해 다른 사용자 집합이 사용할 수 있는 기계 학습 모델을 생성합니다.

슈퍼 사용자는 다음 문을 사용하여 기계 학습 모델 생성을 위한 GRANT USER 또는 GROUP 권한을 가질 수 있습니다.

```
GRANT CREATE MODEL TO GROUP retention_analyst_grp;
```

이 권한이 있는 사용자 또는 그룹은 사용자에게 SCHEMA에 대한 일반적인 CREATE 권한이 있는 경우 클러스터의 모든 스키마에서 모델을 생성할 수 있습니다. 기계 학습 모델은 테이블, 뷰, 프로시저 및 사용자 정의 함수와 유사한 방식으로 스키마 계층의 일부입니다.

`demo_ml` 스키마가 이미 있다고 가정하고 두 사용자 그룹에 다음과 같이 스키마에 대한 권한을 부여합니다.

```
GRANT CREATE, USAGE ON SCHEMA demo_ml TO GROUP retention_analyst_grp;
```

```
GRANT USAGE ON SCHEMA demo_ml TO GROUP marketing_analyst_grp;
```

다른 사용자가 기계 학습 추론 함수를 사용하도록 하려면 EXECUTE 권한을 부여합니다. 다음 예에서는 EXECUTE 권한을 사용하여 marketing\$1analyst\$1grp GROUP에 모델을 사용할 수 있는 권한을 부여합니다.

```
GRANT EXECUTE ON MODEL demo_ml.customer_churn_auto_model TO GROUP marketing_analyst_grp;
```

REVOKE 문을 CREATE MODEL 및 EXECUTE와 함께 사용하여 사용자 또는 그룹에서 해당 권한을 취소합니다. 권한 제어 명령에 대한 자세한 내용은 [GRANT](r_GRANT.md) 및 [REVOKE](r_REVOKE.md) 섹션을 참조하세요.

## Amazon Redshift 기계 학습에서 모델 설명 사용
<a name="clarify"></a>

Amazon Redshift 기계 학습의 모델 설명으로 기능 중요도 값을 사용하여 훈련 데이터의 각 속성이 예측 결과에 어떻게 기여하는지 파악할 수 있습니다.

모델 설명은 모델의 예측을 설명하여 기계 학습모델을 개선하는 데 도움이 됩니다. 모델 설명은 이러한 모델이 특성 속성 접근 방식을 사용하여 예측하는 방법을 설명하는 데 도움이 됩니다.

Amazon Redshift 기계 학습은 모델 설명을 통합하여 Amazon Redshift 기계 학습 사용자에게 모델 설명 기능을 제공합니다. 모델 설명에 대한 자세한 내용은 *Amazon SageMaker AI Developer Guide*의 [What Is Fairness and Model Explainability for Machine Learning Predictions?](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html) 섹션을 참조하세요.

모델 설명은 또한 특성 속성 드리프트를 위해 프로덕션에서 모델이 만드는 추론을 모니터링합니다. 또한 위험 및 규정 준수 팀과 외부 규제 기관에 알리는 데 사용할 수 있는 모델 거버넌스 보고서를 생성하는 데 도움이 되는 도구를 제공합니다.

CREATE MODEL 문을 사용할 때 AUTO ON 또는 AUTO OFF 옵션을 지정하면 모델 훈련 작업이 완료된 후 SageMaker AI가 설명 출력을 생성합니다. EXPLAIN\$1MODEL 함수를 사용하여 설명 보고서를 JSON 형식으로 쿼리할 수 있습니다. 자세한 내용은 [기계 학습 함수](ml-function.md) 섹션을 참조하세요.

## Amazon Redshift ML 확률 지표
<a name="probability_metrics"></a>

 지도 학습 문제에서 클래스 레이블은 입력 데이터를 사용하는 예측의 결과입니다. 예를 들어 고객이 스트리밍 서비스에 다시 가입할지를 예측하기 위해 모델을 사용하는 경우 가능한 레이블은 가능성이 있고 가능성이 낮습니다. Redshift ML은 가능성을 나타내기 위해 각 레이블에 확률을 할당하는 확률 지표 기능을 제공합니다. 이를 통해 예측된 결과를 기반으로 정보에 입각한 결정을 더 많이 내릴 수 있습니다. Amazon Redshift ML에서는 문제 유형이 이진 분류 또는 다중 클래스 분류인 AUTO ON 모델을 생성할 때 확률 지표를 사용할 수 있습니다. AUTO ON 파라미터를 생략하면 Redshift ML은 모델이 AUTO ON이어야 한다고 가정합니다.

### 모델 생성
<a name="probability_metrics_create_model"></a>

 모델을 생성할 때 Amazon Redshift는 모델 유형과 문제 유형을 자동으로 감지합니다. 분류 문제인 경우 Redshift는 각 레이블과 관련된 확률을 출력하는 데 사용할 수 있는 두 번째 추론 함수를 자동으로 생성합니다. 이 두 번째 추론 함수의 이름은 지정된 추론 함수 이름 뒤에 오는 `_probabilities` 문자열입니다. 예를 들어 추론 함수의 이름을 `customer_churn_predict`로 지정하면 두 번째 추론 함수의 이름은 `customer_churn_predict_probabilities`입니다. 그런 다음 이 함수를 쿼리하여 각 레이블의 확률을 가져올 수 있습니다.

```
CREATE MODEL customer_churn_model
FROM customer_activity
    PROBLEM_TYPE BINARY_CLASSIFICATION
TARGET churn
FUNCTION customer_churn_predict
IAM_ROLE {default}
AUTO ON
SETTINGS ( S3_BUCKET 'amzn-s3-demo-bucket'
```

### 확률 가져오기
<a name="probability_metrics_create_model_get_probability"></a>

 확률 함수가 준비되면 명령을 실행하면 반환된 확률 및 관련 레이블의 배열이 포함된 [SUPER 형식](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html)이 반환됩니다. 예를 들어 `"probabilities" : [0.7, 0.3], "labels" : ["False.", "True."]` 결과는 False 레이블의 확률이 0.7이고 True 레이블의 확률이 0.3임을 의미합니다.

```
SELECT customer_churn_predict_probabilities(Account_length, Area_code, 
            VMail_message, Day_mins, Day_calls, Day_charge,Eve_mins, Eve_calls, 
            Eve_charge, Night_mins, Night_calls, Night_charge,Intl_mins, Intl_calls, 
            Intl_charge, Cust_serv_calls) 
FROM customer_activity;
            
customer_churn_predict_probabilities
 --------------------
 {"probabilities" : [0.7, 0.3], "labels" : ["False.", "True."]} 
 {"probabilities" : [0.8, 0.2], "labels" : ["False.", "True."]}
 {"probabilities" : [0.75, 0.25], "labels" : ["True.", "False"]}
```

 확률 및 레이블 배열은 항상 확률에 따라 내림차순으로 정렬됩니다. 확률 함수의 SUPER 반환 결과를 중첩 해제하여 확률이 가장 높은 예측 레이블만 반환하는 쿼리를 작성할 수 있습니다.

```
SELECT prediction.labels[0], prediction.probabilities[0]
            FROM (SELECT customer_churn_predict_probabilities(Account_length, Area_code, 
            VMail_message, Day_mins, Day_calls, Day_charge,Eve_mins, Eve_calls, 
            Eve_charge, Night_mins, Night_calls, Night_charge,Intl_mins, Intl_calls, 
            Intl_charge, Cust_serv_calls) AS prediction
FROM customer_activity);

  labels   | probabilities
-----------+--------------
 "False."  | 0.7
 "False."  | 0.8
 "True."   | 0.75
```

쿼리를 더 간단하게 만들기 위해 예측 함수의 결과를 테이블에 저장할 수 있습니다.

```
CREATE TABLE churn_auto_predict_probabilities AS 
             (SELECT customer_churn_predict_probabilities(Account_length, Area_code, 
             VMail_message, Day_mins, Day_calls, Day_charge,Eve_mins, Eve_calls, 
             Eve_charge, Night_mins, Night_calls, Night_charge,Intl_mins,
             Intl_calls, Intl_charge, Cust_serv_calls) AS prediction
FROM customer_activity);
```

결과가 포함된 테이블을 쿼리하여 확률이 0.7보다 높은 예측만 반환할 수 있습니다.

```
SELECT prediction.labels[0], prediction.probabilities[0]
FROM churn_auto_predict_probabilities
WHERE prediction.probabilities[0] > 0.7;

  labels   | probabilities
-----------+--------------
 "False."  | 0.8
 "True."   | 0.75
```

색인 표기를 사용하면 특정 레이블의 확률을 얻을 수 있습니다. 다음 예제에서는 모든 `True.` 레이블의 확률을 반환합니다.

```
SELECT label, index, p.prediction.probabilities[index]
FROM churn_auto_predict_probabilities p, p.prediction.labels AS label AT index
WHERE label='True.';

  label  | index | probabilities
---------+-------+---------------
 "True." |     0 | 0.3
 "True." |     0 | 0.2
 "True." |     0 | 0.75
```

 다음 예에서는 `True`가 있는 모든 행을 반환합니다. 0.7보다 큰 확률로 레이블을 지정하여 고객이 이탈할 가능성이 있음을 나타냅니다.

```
SELECT prediction.labels[0], prediction.probabilities[0]
FROM churn_auto_predict_probabilities
WHERE prediction.probabilities[0] > 0.7 AND prediction.labels[0] = "True.";

labels     | probabilities
-----------+--------------
 "True."   | 0.75
```

# Amazon Redshift ML 튜토리얼
<a name="tutorials_for_amazon_redshift_ml"></a>

Amazon Redshift ML을 사용하면 SQL 스테이트먼트로 기계 학습 모델을 훈련하고 예측을 위해 SQL 쿼리에서 해당 기계 학습 모델을 호출할 수 있습니다. Amazon Redshift의 기계 학습은 하나의 SQL 명령으로 모델을 훈련합니다. Amazon Redshift는 자동으로 Amazon SageMaker AI에서 훈련 작업을 시작하고 모델을 생성합니다. 모델이 생성되면 모델의 예측 함수를 사용하여 Amazon Redshift에서 예측을 수행할 수 있습니다.

이러한 튜토리얼의 단계에 따라 Amazon Redshift ML의 기능을 알아보세요.
+ [튜토리얼: 고객 이탈 모델 구축](tutorial_customer_churn.md) – 이 튜토리얼에서는 Amazon Redshift ML을 사용하여 CREATE MODEL 명령으로 고객 이탈 모델을 생성하고 사용자 시나리오에 대한 예측 쿼리를 실행합니다. 그런 다음 CREATE MODEL 명령이 생성하는 SQL 함수를 사용하여 쿼리를 구현합니다.
+ [튜토리얼: K-평균 클러스터링 모델 구축](tutorial_k-means_clustering.md) – 이 튜토리얼에서는 Amazon Redshift ML을 사용하여 [K-평균 알고리즘](url-sm-dev;k-means.html)을 바탕으로 기계 학습 모델을 생성, 훈련 및 배포합니다.
+ [튜토리얼: 다중 클래스 분류 모델 구축](tutorial_multi-class_classification.md) – 이 튜토리얼에서는 Amazon Redshift ML을 사용하여 다중 클래스 분류 문제를 해결하는 기계 학습 모델을 생성합니다. 다중 클래스 분류 알고리즘은 데이터 포인트를 세 개 이상의 클래스 중 하나로 분류합니다. 그런 다음 CREATE MODEL 명령이 생성하는 SQL 함수를 사용하여 쿼리를 구현합니다.
+ [튜토리얼: XGBoost 모델 구축](tutorial_xgboost.md) – 이 튜토리얼에서는 Amazon S3의 데이터로 모델을 생성하고 Amazon Redshift ML을 사용하여 이 모델로 예측 쿼리를 실행합니다. XGBoost 알고리즘은 그래디언트 부스트 트리 알고리즘을 최적화한 것입니다.
+ [튜토리얼: 회귀 모델 구축](tutorial_regression.md) – 이 튜토리얼에서는 Amazon Redshift ML을 사용하여 기계 학습 회귀 모델을 생성하고 모델에서 예측 쿼리를 실행합니다. 회귀 모델을 사용하면 주택 가격이나 도시의 자전거 대여 서비스를 이용할 사람 수와 같은 수치 결과를 예측할 수 있습니다.
+ [튜토리얼: 선형 학습기를 사용하여 회귀 모델 구축](tutorial_linear_learner_regression.md) – 이 튜토리얼에서는 Amazon S3의 데이터로 선형 학습기 모델을 생성하고 Amazon Redshift ML을 사용하여 이 모델로 예측 쿼리를 실행합니다. SageMaker AI 선형 학습기 알고리즘은 회귀 또는 멀티클래스 분류 문제를 해결합니다.
+ [튜토리얼: 선형 학습기를 사용하여 다중 클래스 분류 모델 구축](tutorial_linear_learner_multi-class_classification.md) – 이 튜토리얼에서는 Amazon S3의 데이터로 선형 학습기 모델을 생성하고 Amazon Redshift ML을 사용하여 이 모델로 예측 쿼리를 실행합니다. SageMaker AI 선형 학습기 알고리즘은 회귀 또는 분류 문제를 해결합니다.

# 튜토리얼: 고객 이탈 모델 구축
<a name="tutorial_customer_churn"></a>

이 튜토리얼에서는 Amazon Redshift ML을 사용하여 CREATE MODEL 명령으로 고객 이탈 모델을 생성하고 사용자 시나리오에 대한 예측 쿼리를 실행합니다. 그런 다음 CREATE MODEL 명령이 생성하는 SQL 함수를 사용하여 쿼리를 구현합니다.

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

이 예에서는 기록 정보를 사용하여 한 통신사의 고객 이탈에 대한 기계 학습 모델을 구성합니다. 먼저 SageMaker AI가 기계 학습 모델을 훈련시킨 다음 임의의 고객 프로필 정보를 사용하여 모델을 테스트합니다. 모델을 검증한 후 Amazon SageMaker AI가 모델과 예측 함수를 Amazon Redshift에 배포합니다. 예측 함수를 사용하여 고객의 이탈 여부를 예측할 수 있습니다.

## 사용 사례
<a name="tutorial_customer_churn_tasks"></a>

Amazon Redshift ML을 사용하여 영업 리드의 마감 여부 예측과 같은 다른 바이너리 분류 문제를 해결할 수 있습니다. 금융 거래가 사기인지 아닌지도 예측할 수 있습니다.

**작업**
+ 사전 조건
+ 1단계: Amazon S3에서 Amazon Redshift로 데이터 로드
+ 2단계: 기계 학습 모델 생성
+ 3단계: 모델을 사용하여 예측 수행

## 사전 조건
<a name="tutorial_customer_churn_prereqs"></a>

이 튜토리얼을 완료하려면 다음과 같은 사전 조건이 필요합니다.
+ Amazon Redshift ML에 대해 Amazon Redshift 클러스터를 설정해야 합니다. 설정을 위해 [Amazon Redshift 기계 학습 관리를 위한 클러스터 및 구성 설정](https://docs.aws.amazon.com/redshift/latest/dg/admin-setup.html) 설명서를 참조하세요.
+ 모델을 생성하는 데 사용하는 Amazon Redshift 클러스터와 훈련 데이터를 스테이징하고 모델 아티팩트를 준비하는 데 사용하는 Amazon S3 버킷은 동일한 AWS 리전에 있어야 합니다.
+ 이 설명서에 사용된 SQL 명령과 샘플 데이터 세트를 다운로드하려면 다음 중 하나를 수행하세요.
  + [SQL 명령](https://s3.amazonaws.com/redshift-downloads/redshift-ml/tutorial-scripts/redshift-ml-tutorial.sql), [고객 활동 파일](https://s3.amazonaws.com/redshift-downloads/redshift-ml/customer_activity/customer_activity.csv) 및 [Abalone 파일](https://s3.amazonaws.com/redshift-downloads/redshift-ml/abalone_xg/abalone.csv)을 다운로드합니다.
  + Amazon S3용 AWS CLI를 사용하여 다음 명령을 실행합니다. 고유의 대상 경로를 사용할 수 있습니다.

    ```
    aws s3 cp s3://redshift-downloads/redshift-ml/tutorial-scripts/redshift-ml-tutorial.sql </target/path>
    aws s3 cp s3://redshift-downloads/redshift-ml/customer_activity/customer_activity.csv </target/path>
    aws s3 cp s3://redshift-downloads/redshift-ml/abalone_xgb/abalone_xgb.csv </target/path>
    ```

## 1단계: Amazon S3에서 Amazon Redshift로 데이터 로드
<a name="tutorial_customer_churn_step_load"></a>

[Amazon Redshift 쿼리 편집기 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html)를 사용하여 쿼리를 편집 및 실행하고 결과를 시각화합니다.

다음 쿼리를 실행하면 `customer_activity`라는 테이블이 생성되며 Amazon S3에서 샘플 데이터 세트를 수집합니다.

```
DROP TABLE IF EXISTS customer_activity;

CREATE TABLE customer_activity (
state varchar(2),
account_length int,
area_code int,
phone varchar(8),
intl_plan varchar(3),
vMail_plan varchar(3),
vMail_message int,
day_mins float,
day_calls int,
day_charge float,
total_charge float,
eve_mins float,
eve_calls int,
eve_charge float,
night_mins float,
night_calls int,
night_charge float,
intl_mins float,
intl_calls int,
intl_charge float,
cust_serv_calls int,
churn varchar(6),
record_date date
);

COPY customer_activity
FROM 's3://redshift-downloads/redshift-ml/customer_activity/'
REGION 'us-east-1' IAM_ROLE default
FORMAT AS CSV IGNOREHEADER 1;
```

## 2단계: 기계 학습 모델 생성
<a name="tutorial_customer_churn_step_create_model"></a>

이탈은 이 모델에서 목표로 하는 입력입니다. 이 모델에 대한 다른 모든 입력은 이탈을 예측하는 함수를 생성하는 데 도움이 되는 속성입니다.

다음 예에서는 고객의 연령, 우편번호, 지출 및 사례와 같은 입력을 사용하여 CREATE MODEL 작업으로 고객의 활동 여부를 예측하는 모델을 제공합니다. 다음 예제에서는 amzn-s3-demo-bucket을 사용자의 자체 Amazon S3 버킷으로 바꿉니다.

```
CREATE MODEL customer_churn_auto_model
FROM
    (
      SELECT state,
             account_length,
             area_code,
             total_charge/account_length AS average_daily_spend,
             cust_serv_calls/account_length AS average_daily_cases,
             churn
      FROM customer_activity
      WHERE  record_date < '2020-01-01'
     )
TARGET churn FUNCTION ml_fn_customer_churn_auto
IAM_ROLE default SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket'
);
```

이전 예의 SELECT 쿼리는 훈련 데이터를 생성합니다. TARGET 절은 CREATE MODEL 작업이 예측 방법을 학습하는 데 사용하는 기계 학습 레이블 열을 지정합니다. 대상 열 "이탈"은 고객이 여전히 활성 멤버십을 보유하고 있는지 아니면 멤버십을 일시중단했는지를 나타냅니다. S3\$1BUCKET 필드는 사용자가 이전에 생성한 Amazon S3 버킷의 이름입니다. 이 Amazon S3 버킷은 Amazon Redshift와 Amazon SageMaker AI 간에 훈련 데이터와 아티팩트를 공유하는 데 사용됩니다. 나머지 열은 예측에 사용되는 특성입니다.

CREATE MODEL 명령의 간단한 사용 사례를 보여주는 구문 및 특성에 대한 요약은 [단순 CREATE MODEL](https://docs.aws.amazon.com/redshift/latest/dg/r_create_model_use_cases.html#r_simple_create_model) 섹션을 참조하세요.

### 서버 측 암호화에 대한 권한 추가(선택 사항)
<a name="tutorial_customer_churn_encryption"></a>

Amazon Redshift는 기본적으로 훈련에 Amazon SageMaker AI Autopilot을 사용합니다. 특히 Amazon Redshift는 고객이 지정한 Amazon S3 버킷에 훈련 데이터를 안전하게 내보냅니다. `KMS_KEY_ID`를 지정하지 않으면 기본적으로 서버 측 암호화(SSE)를 사용하여 데이터가 암호화됩니다.

AWS KMS 관리형 키(SSE-MMS)로 서버 측 암호화를 사용하여 입력을 암호화할 때 다음 권한을 추가합니다.

```
{
    "Effect": "Allow",
    "Action": [
    "kms:Encrypt"
    "kms:Decrypt"
    ]
}
```

Amazon SageMaker AI 역할에 대한 자세한 내용은 *Amazon SageMaker AI Developer Guide*의 [Amazon SageMaker AI roles](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html) 섹션을 참조하세요.

### 모델 훈련 상태 확인(선택 사항)
<a name="tutorial_customer_churn_check_status"></a>

SHOW MODEL 명령을 사용하여 모델이 준비되었는지 알 수 있습니다.

다음 작업을 사용하여 모델의 상태를 확인합니다.

```
SHOW MODEL customer_churn_auto_model;
```

다음은 이전 작업 출력의 예시입니다.

```
+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
|           Key            |                                                                             Value                                                                             |
+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
|        Model Name        |                                                                   customer_churn_auto_model                                                                   |
|       Schema Name        |                                                                            public                                                                             |
|          Owner           |                                                                            awsuser                                                                            |
|      Creation Time       |                                                                   Tue, 14.06.2022 17:15:52                                                                    |
|       Model State        |                                                                           TRAINING                                                                            |
|                          |                                                                                                                                                               |
|      TRAINING DATA:      |                                                                                                                                                               |
|          Query           | SELECT STATE, ACCOUNT_LENGTH, AREA_CODE, TOTAL_CHARGE / ACCOUNT_LENGTH AS AVERAGE_DAILY_SPEND, CUST_SERV_CALLS / ACCOUNT_LENGTH AS AVERAGE_DAILY_CASES, CHURN |
|                          |                                                                    FROM CUSTOMER_ACTIVITY                                                                     |
|                          |                                                               WHERE RECORD_DATE < '2020-01-01'                                                                |
|      Target Column       |                                                                             CHURN                                                                             |
|                          |                                                                                                                                                               |
|       PARAMETERS:        |                                                                                                                                                               |
|        Model Type        |                                                                             auto                                                                              |
|       Problem Type       |                                                                                                                                                               |
|        Objective         |                                                                                                                                                               |
|     AutoML Job Name      |                                                                redshiftml-20220614171552640901                                                                |
|      Function Name       |                                                                   ml_fn_customer_churn_auto                                                                   |
|   Function Parameters    |                                            state account_length area_code average_daily_spend average_daily_cases                                             |
| Function Parameter Types |                                                                 varchar int4 int4 float8 int4                                                                 |
|         IAM Role         |                                                                     default-aws-iam-role                                                                      |
|        S3 Bucket         |                                                                        amzn-s3-demo-bucket                                                                     |
|       Max Runtime        |                                                                             5400                                                                              |
+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

모델 학습이 완료되면 `model_state` 변수가 `Model is Ready`가 되며, 예측 함수를 사용할 수 있게 됩니다.

## 3단계: 모델을 사용하여 예측 수행
<a name="tutorial_customer_churn_step_perform_predictions"></a>

SQL 스테이트먼트를 사용하여 예측 모델에서 수행한 예측을 볼 수 있습니다. 이 예에서 CREATE MODEL 작업으로 생성된 예측 함수의 이름은 `ml_fn_customer_churn_auto`입니다. 예측 함수에 대한 입력 인수는 `state`의 경우 varchar, `account_length`의 경우 integer와 같이 특성의 유형과 일치합니다. 예측 함수의 출력은 CREATE MODEL 문의 TARGET 열과 동일한 형식입니다.

1. 2020-01-01 이전의 데이터에 대해 모델을 훈련시켰으므로 이제 테스트 세트에 예측 함수를 사용합니다. 다음 쿼리는 2020-01-01 이후에 가입한 고객이 이탈할지를 표시합니다.

   ```
   SELECT
       phone,
       ml_fn_customer_churn_auto(
           state,
           account_length,
           area_code,
           total_charge / account_length,
           cust_serv_calls / account_length
       ) AS active
   FROM
       customer_activity
   WHERE
       record_date > '2020-01-01';
   ```

1. 다음 예에서는 다른 사용 사례에 동일한 예측 함수를 사용합니다. 이 경우 Amazon Redshift는 기록 날짜가 2020-01-01보다 큰 여러 주의 고객 중 이탈자 및 비이탈자 비율을 예측합니다.

   ```
   WITH predicted AS (
       SELECT
           state,
           ml_fn_customer_churn_auto(
               state,
               account_length,
               area_code,
               total_charge / account_length,
               cust_serv_calls / account_length
           ) :: varchar(6) AS active
       FROM
           customer_activity
       WHERE
           record_date > '2020-01-01'
   )
   SELECT
       state,
       SUM(
           CASE
               WHEN active = 'True.' THEN 1
               ELSE 0
           END
       ) AS churners,
       SUM(
           CASE
               WHEN active = 'False.' THEN 1
               ELSE 0
           END
       ) AS nonchurners,
       COUNT(*) AS total_per_state
   FROM
       predicted
   GROUP BY
       state
   ORDER BY
       state;
   ```

1. 다음 예에서는 한 주에서 이탈하는 고객의 비율을 예측하는 사용 사례에 예측 함수를 사용합니다. 이 경우 Amazon Redshift는 기록 날짜가 2020-01-01보다 클 때의 이탈률을 예측합니다.

   ```
   WITH predicted AS (
       SELECT
           state,
           ml_fn_customer_churn_auto(
               state,
               account_length,
               area_code,
               total_charge / account_length,
               cust_serv_calls / account_length
           ) :: varchar(6) AS active
       FROM
           customer_activity
       WHERE
           record_date > '2020-01-01'
   )
   SELECT
       state,
       CAST((CAST((SUM(
           CASE
               WHEN active = 'True.' THEN 1
               ELSE 0
           END
       )) AS FLOAT) / CAST(COUNT(*) AS FLOAT)) AS DECIMAL (3, 2)) AS pct_churn,
       COUNT(*) AS total_customers_per_state
   FROM
       predicted
   GROUP BY
       state
   ORDER BY
       3 DESC;
   ```

## 관련 주제
<a name="tutorial_customer_churn_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))

# 튜토리얼: K-평균 클러스터링 모델 구축
<a name="tutorial_k-means_clustering"></a>

이 튜토리얼에서는 Amazon Redshift ML을 사용하여 [K-평균 알고리즘](url-sm-dev;k-means.html)을 바탕으로 기계 학습 모델을 생성, 훈련 및 배포합니다. 이 알고리즘은 데이터에서 그룹을 검색하려는 클러스터링 문제를 해결합니다. K-평균은 아직 레이블이 지정되지 않은 데이터를 그룹화하는 데 도움이 됩니다. K-평균 클러스터링에 대한 자세한 내용은 Amazon SageMaker AI Developer Guide의 [How K-means Clustering Works](https://docs.aws.amazon.com/sagemaker/latest/dg/algo-kmeans-tech-notes.html) 섹션을 참조하세요.

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

이 튜토리얼에서는 전 세계의 세계 뉴스를 모니터링하고 데이터가 매일 매초마다 저장되는 [Global Database of Events, Language and Tone(GDELT)](https://aws.amazon.com/public-datasets/gdelt/) 데이터 세트에 K-평균을 사용합니다. K-평균은 비슷한 어조, 행위자 또는 위치를 가진 이벤트를 그룹화합니다. 데이터는 Amazon Simple Storage Service에서 두 개의 서로 다른 폴더에 여러 파일로 저장됩니다. 폴더는 1979년부터 2013년까지의 기록 폴더와 2013년 이후의 일일 업데이트 폴더입니다. 이 예에서는 기록 형식을 사용하여 1979년 데이터를 가져옵니다.

## 사용 사례
<a name="tutorial_k-means_clustering_tasks"></a>

스트리밍 서비스에서 시청 습관이 비슷한 고객을 그룹화하는 등 Amazon Redshift ML을 사용하여 다른 클러스터링 문제를 해결할 수 있습니다. Redshift ML을 사용하여 배송 서비스를 위한 최적의 물류 센터 수를 예측할 수도 있습니다.

**작업**
+ 사전 조건
+ 1단계: Amazon S3에서 Amazon Redshift로 데이터 로드
+ 2단계: 기계 학습 모델 생성
+ 3단계: 모델을 사용하여 예측 수행

## 사전 조건
<a name="tutorial_k-means_clustering_prereqs"></a>

이 튜토리얼을 완료하려면 Amazon Redshift ML의 [관리 설정](https://docs.aws.amazon.com/redshift/latest/dg/admin-setup.html)을 완료해야 합니다.

## 1단계: Amazon S3에서 Amazon Redshift로 데이터 로드
<a name="tutorial_k-means_clustering_step_load"></a>

1. [Amazon Redshift 쿼리 편집기 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html)를 사용하여 다음 쿼리를 실행합니다. 이 쿼리는 `gdelt_data` 테이블이 존재하는 경우 퍼블릭 스키마에서 이 테이블을 삭제하고 퍼블릭 스키마에 같은 이름의 테이블을 생성합니다.

   ```
   DROP TABLE IF EXISTS gdelt_data CASCADE;
   
   CREATE TABLE gdelt_data (
       GlobalEventId bigint,
       SqlDate bigint,
       MonthYear bigint,
       Year bigint,
       FractionDate double precision,
       Actor1Code varchar(256),
       Actor1Name varchar(256),
       Actor1CountryCode varchar(256),
       Actor1KnownGroupCode varchar(256),
       Actor1EthnicCode varchar(256),
       Actor1Religion1Code varchar(256),
       Actor1Religion2Code varchar(256),
       Actor1Type1Code varchar(256),
       Actor1Type2Code varchar(256),
       Actor1Type3Code varchar(256),
       Actor2Code varchar(256),
       Actor2Name varchar(256),
       Actor2CountryCode varchar(256),
       Actor2KnownGroupCode varchar(256),
       Actor2EthnicCode varchar(256),
       Actor2Religion1Code varchar(256),
       Actor2Religion2Code varchar(256),
       Actor2Type1Code varchar(256),
       Actor2Type2Code varchar(256),
       Actor2Type3Code varchar(256),
       IsRootEvent bigint,
       EventCode bigint,
       EventBaseCode bigint,
       EventRootCode bigint,
       QuadClass bigint,
       GoldsteinScale double precision,
       NumMentions bigint,
       NumSources bigint,
       NumArticles bigint,
       AvgTone double precision,
       Actor1Geo_Type bigint,
       Actor1Geo_FullName varchar(256),
       Actor1Geo_CountryCode varchar(256),
       Actor1Geo_ADM1Code varchar(256),
       Actor1Geo_Lat double precision,
       Actor1Geo_Long double precision,
       Actor1Geo_FeatureID bigint,
       Actor2Geo_Type bigint,
       Actor2Geo_FullName varchar(256),
       Actor2Geo_CountryCode varchar(256),
       Actor2Geo_ADM1Code varchar(256),
       Actor2Geo_Lat double precision,
       Actor2Geo_Long double precision,
       Actor2Geo_FeatureID bigint,
       ActionGeo_Type bigint,
       ActionGeo_FullName varchar(256),
       ActionGeo_CountryCode varchar(256),
       ActionGeo_ADM1Code varchar(256),
       ActionGeo_Lat double precision,
       ActionGeo_Long double precision,
       ActionGeo_FeatureID bigint,
       DATEADDED bigint
   );
   ```

1. 다음 쿼리는 샘플 데이터를 `gdelt_data` 테이블에 로드합니다.

   ```
   COPY gdelt_data
   FROM 's3://gdelt-open-data/events/1979.csv' 
   REGION 'us-east-1'
   IAM_ROLE default 
   CSV
   DELIMITER '\t';
   ```

### 훈련 데이터 검사(선택 사항)
<a name="tutorial_k-means_clustering_examine"></a>

모델을 어떤 데이터로 훈련시킬지 보려면 다음 쿼리를 사용합니다.

```
SELECT
    AvgTone,
    EventCode,
    NumArticles,
    Actor1Geo_Lat,
    Actor1Geo_Long,
    Actor2Geo_Lat,
    Actor2Geo_Long
FROM
    gdelt_data LIMIT 100;
```

## 2단계: 기계 학습 모델 생성
<a name="tutorial_k-means_clustering_create_model"></a>

다음 예에서는 CREATE MODEL 명령을 사용하여 데이터를 7개의 클러스터로 그룹화하는 모델을 생성합니다. K 값은 데이터 포인트가 분류되는 클러스터 수입니다. 이 모델은 데이터 포인트를 서로 비슷한 데이터 포인트끼리 모인 클러스터로 분류합니다. 데이터 포인트를 그룹으로 클러스터링함으로써 K-평균 알고리즘은 최상의 클러스터 센터를 반복적으로 결정합니다. 그런 다음 알고리즘은 각 데이터 포인트를 가장 가까운 클러스터 센터에 할당합니다. 같은 클러스터 센터에 가장 가까이 있는 멤버가 같은 그룹에 속합니다. 그룹의 멤버는 같은 그룹의 다른 멤버와 최대한 유사하고 다른 그룹의 멤버와 최대한 다릅니다. K 값은 주관적이며 데이터 포인트 간의 유사성을 측정하는 방법에 따라 달라집니다. 클러스터가 고르지 않게 분포되어 있는 경우 K 값을 변경하여 클러스터 크기를 균일하게 만들 수 있습니다.

다음 예제에서는 amzn-s3-demo-bucket을 사용자의 자체 Amazon S3 버킷으로 바꿉니다.

```
CREATE MODEL news_data_clusters
FROM
    (
        SELECT
            AvgTone,
            EventCode,
            NumArticles,
            Actor1Geo_Lat,
            Actor1Geo_Long,
            Actor2Geo_Lat,
            Actor2Geo_Long
        FROM
            gdelt_data
    ) FUNCTION news_monitoring_cluster 
    IAM_ROLE default 
    AUTO OFF 
    MODEL_TYPE KMEANS 
    PREPROCESSORS 'none' 
    HYPERPARAMETERS DEFAULT
    EXCEPT
    (K '7') 
    SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');
```

### 모델 훈련 상태 확인(선택 사항)
<a name="tutorial_k-means_clustering_check_status"></a>

SHOW MODEL 명령을 사용하여 모델이 준비되었는지 알 수 있습니다.

모델 상태를 확인하려면 다음 SHOW MODEL 작업을 사용하고 `Model State`가 `Ready`인지 확인합니다.

```
SHOW MODEL NEWS_DATA_CLUSTERS;
```

모델이 준비되면 이전 작업의 출력에 `Model State`가 `Ready`라고 표시됩니다. 다음은 SHOW MODEL 작업 출력의 예시입니다.

```
+--------------------------+------------------------------------------------------------------------------------------------------+
|        Model Name        |                                          news_data_clusters                                          |
+--------------------------+------------------------------------------------------------------------------------------------------+
|       Schema Name        |                                                public                                                |
|          Owner           |                                               awsuser                                                |
|      Creation Time       |                                       Fri, 17.06.2022 16:32:19                                       |
|       Model State        |                                                READY                                                 |
|        train:msd         |                                             2973.822754                                              |
|      train:progress      |                                              100.000000                                              |
|     train:throughput     |                                            237114.875000                                             |
|      Estimated Cost      |                                               0.004983                                               |
|                          |                                                                                                      |
|      TRAINING DATA:      |                                                                                                      |
|          Query           | SELECT AVGTONE, EVENTCODE, NUMARTICLES, ACTOR1GEO_LAT, ACTOR1GEO_LONG, ACTOR2GEO_LAT, ACTOR2GEO_LONG |
|                          |                                           FROM GDELT_DATA                                            |
|                          |                                                                                                      |
|       PARAMETERS:        |                                                                                                      |
|        Model Type        |                                                kmeans                                                |
|    Training Job Name     |                                redshiftml-20220617163219978978-kmeans                                |
|      Function Name       |                                       news_monitoring_cluster                                        |
|   Function Parameters    |       avgtone eventcode numarticles actor1geo_lat actor1geo_long actor2geo_lat actor2geo_long        |
| Function Parameter Types |                             float8 int8 int8 float8 float8 float8 float8                             |
|         IAM Role         |                                         default-aws-iam-role                                         |
|        S3 Bucket         |                                            amzn-s3-demo-bucket                                       |
|       Max Runtime        |                                                 5400                                                 |
|                          |                                                                                                      |
|     HYPERPARAMETERS:     |                                                                                                      |
|       feature_dim        |                                                  7                                                   |
|            k             |                                                  7                                                   |
+--------------------------+------------------------------------------------------------------------------------------------------+
```

## 3단계: 모델을 사용하여 예측 수행
<a name="tutorial_k-means_clustering_step_perform_predictions"></a>

### 클러스터 식별
<a name="tutorial_k-means_clustering_identify_clusters"></a>

모델이 데이터에서 별개의 그룹, 즉 클러스터를 식별해 낸 것을 볼 수 있습니다. 클러스터는 다른 클러스터 센터보다 해당 클러스터 센터에 더 가까운 데이터 포인트의 집합입니다. K 값은 모델의 클러스터 수를 나타내므로 클러스터 센터의 수를 나타내기도 합니다. 다음 쿼리는 각 `globaleventid`와 연관된 클러스터를 표시하여 클러스터를 식별합니다.

```
SELECT
    globaleventid,
    news_monitoring_cluster (
        AvgTone,
        EventCode,
        NumArticles,
        Actor1Geo_Lat,
        Actor1Geo_Long,
        Actor2Geo_Lat,
        Actor2Geo_Long
    ) AS cluster
FROM
    gdelt_data;
```

### 데이터 분포 확인
<a name="tutorial_k-means_clustering_check_distribution"></a>

클러스터 간의 데이터 분포를 확인하여 선택한 K 값으로 인해 데이터가 어느 정도 균등하게 분포되었는지 확인할 수 있습니다. 다음 쿼리를 사용하여 데이터가 클러스터 전체에 고르게 분포되어 있는지 확인합니다.

```
SELECT
    events_cluster,
    COUNT(*) AS nbr_events
FROM
    (
        SELECT
            globaleventid,
            news_monitoring_cluster(
                AvgTone,
                EventCode,
                NumArticles,
                Actor1Geo_Lat,
                Actor1Geo_Long,
                Actor2Geo_Lat,
                Actor2Geo_Long
            ) AS events_cluster
        FROM
            gdelt_data
    )
GROUP BY
    1;
```

클러스터가 고르지 않게 분포되어 있는 경우 K 값을 변경하여 클러스터 크기를 균일하게 만들 수 있습니다.

### 클러스터 센터 결정
<a name="tutorial_k-means_clustering_determine_centers"></a>

데이터 포인트는 다른 클러스터 센터보다 자신이 속한 클러스터 센터에 더 가깝습니다. 따라서 클러스터 센터를 찾으면 클러스터를 정의하는 데 도움이 됩니다.

다음 쿼리를 실행하여 이벤트 코드별 기사 수를 기반으로 클러스터 센터를 확인합니다.

```
SELECT
    news_monitoring_cluster (
        AvgTone,
        EventCode,
        NumArticles,
        Actor1Geo_Lat,
        Actor1Geo_Long,
        Actor2Geo_Lat,
        Actor2Geo_Long
    ) AS events_cluster,
    eventcode,
    SUM(numArticles) AS numArticles
FROM
    gdelt_data
GROUP BY
    1,
    2;
```

### 클러스터의 데이터 포인트에 대한 정보 표시
<a name="tutorial_k-means_clustering_data_points_info"></a>

다음 쿼리를 사용하여 다섯 번째 클러스터에 할당된 포인트에 대한 데이터를 반환합니다. 선택한 기사에는 두 명의 행위자가 있어야 합니다.

```
SELECT
    news_monitoring_cluster (
        AvgTone,
        EventCode,
        NumArticles,
        Actor1Geo_Lat,
        Actor1Geo_Long,
        Actor2Geo_Lat,
        Actor2Geo_Long
    ) AS events_cluster,
    eventcode,
    actor1name,
    actor2name,
    SUM(numarticles) AS totalarticles
FROM
    gdelt_data
WHERE
    events_cluster = 5
    AND actor1name <> ' '
    AND actor2name <> ' '
GROUP BY
    1,
    2,
    3,
    4
ORDER BY
    5 desc;
```

### 동일한 민족 코드의 행위자가 있는 이벤트에 대한 데이터 표시
<a name="tutorial_k-means_clustering_show_events_data"></a>

다음 쿼리는 긍정적인 어조로 이벤트에 대해 작성된 기사 수를 계산합니다. 또한 두 행위자의 민족 코드가 같아야 하며 각 이벤트가 할당된 클러스터를 반환합니다.

```
SELECT
    news_monitoring_cluster (
        AvgTone,
        EventCode,
        NumArticles,
        Actor1Geo_Lat,
        Actor1Geo_Long,
        Actor2Geo_Lat,
        Actor2Geo_Long
    ) AS events_cluster,
    SUM(numarticles) AS total_articles,
    eventcode AS event_code,
    Actor1EthnicCode AS ethnic_code
FROM
    gdelt_data
WHERE
    Actor1EthnicCode = Actor2EthnicCode
    AND Actor1EthnicCode <> ' '
    AND Actor2EthnicCode <> ' '
    AND AvgTone > 0
GROUP BY
    1,
    3,
    4
HAVING
    (total_articles) > 4
ORDER BY
    1,
    2 ASC;
```

## 관련 주제
<a name="tutorial_k-means_clustering_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))

# 튜토리얼: 다중 클래스 분류 모델 구축
<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))

# 튜토리얼: XGBoost 모델 구축
<a name="tutorial_xgboost"></a>

이 튜토리얼에서는 Amazon S3의 데이터로 모델을 생성하고 Amazon Redshift ML을 사용하여 이 모델로 예측 쿼리를 실행합니다. XGBoost 알고리즘은 그래디언트 부스트 트리 알고리즘을 최적화한 것입니다. XGBoost는 다른 그래디언트 부스트 트리 알고리즘보다 더 많은 데이터 유형, 관계 및 분포를 처리합니다. 회귀, 바이너리 분류, 다중 클래스 분류, 순위 결정 관련 문제에 XGBoost를 사용할 수 있습니다. XGBoost 알고리즘에 대한 자세한 내용은 Amazon SageMaker AI Developer Guide의 [XGBoost algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html) 섹션을 참조하세요.

`AUTO OFF` 옵션을 사용한 Amazon Redshift ML `CREATE MODEL` 작업은 현재 XGBoost를 `MODEL_TYPE`으로 지원합니다. 사용 사례에 따라 `CREATE MODEL` 명령의 일부로 목적 및 하이퍼파라미터와 같은 관련 정보를 제공할 수 있습니다.

이 튜토리얼에서는 주어진 지폐가 원본인지 위조인지 예측하는 바이너리 분류 문제인 [banknote authentication 데이터 세트](https://archive.ics.uci.edu/ml/datasets/banknote+authentication)를 사용합니다.

## 사용 사례
<a name="tutorial_xgboost_tasks"></a>

Amazon Redshift ML을 사용하여 환자의 건강 또는 질병 유무 예측과 같은 다른 바이너리리 분류 문제를 해결할 수 있습니다. 이메일이 스팸인지 아닌지도 예측할 수 있습니다.

**작업**
+ 사전 조건
+ 1단계: Amazon S3에서 Amazon Redshift로 데이터 로드
+ 2단계: 기계 학습 모델 생성
+ 3단계: 모델을 사용하여 예측 수행

## 사전 조건
<a name="tutorial_xgboost_prereqs"></a>

이 튜토리얼을 완료하려면 Amazon Redshift ML의 [관리 설정](https://docs.aws.amazon.com/redshift/latest/dg/admin-setup.html)을 완료해야 합니다.

## 1단계: Amazon S3에서 Amazon Redshift로 데이터 로드
<a name="tutorial_xgboost_step_load"></a>

[Amazon Redshift 쿼리 편집기 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html)를 사용하여 다음 쿼리를 실행합니다.

다음 쿼리는 두 개의 테이블을 생성하고 Amazon S3에서 데이터를 로드한 다음 데이터를 훈련 세트와 테스트 세트로 분할합니다. 훈련 세트를 사용하여 모델을 훈련시키고 예측 함수를 생성합니다. 그런 다음 테스트 세트에서 예측 함수를 테스트합니다.

```
--create training set table
CREATE TABLE banknoteauthentication_train(
    variance FLOAT,
    skewness FLOAT,
    curtosis FLOAT,
    entropy FLOAT,
    class INT
);

--Load into training table
COPY banknoteauthentication_train
FROM
    's3://redshiftbucket-ml-sagemaker/banknote_authentication/train_data/' IAM_ROLE default REGION 'us-west-2' IGNOREHEADER 1 CSV;

--create testing set table
CREATE TABLE banknoteauthentication_test(
    variance FLOAT,
    skewness FLOAT,
    curtosis FLOAT,
    entropy FLOAT,
    class INT
);

--Load data into testing table
COPY banknoteauthentication_test
FROM
    's3://redshiftbucket-ml-sagemaker/banknote_authentication/test_data/' 
    IAM_ROLE default 
    REGION 'us-west-2' 
    IGNOREHEADER 1 
    CSV;
```

## 2단계: 기계 학습 모델 생성
<a name="tutorial_xgboost_step_create_model"></a>

다음 쿼리는 이전 단계에서 생성한 훈련 세트에서 Amazon Redshift ML에 XGBoost 모델을 생성합니다. `amzn-s3-demo-bucket`을 입력 데이터 세트 및 기타 Redshift ML 아티팩트를 저장할 사용자의 `S3_BUCKET`으로 대체합니다.

```
CREATE MODEL model_banknoteauthentication_xgboost_binary
FROM
    banknoteauthentication_train 
    TARGET class 
    FUNCTION func_model_banknoteauthentication_xgboost_binary 
    IAM_ROLE default 
    AUTO OFF 
    MODEL_TYPE xgboost 
    OBJECTIVE 'binary:logistic' 
    PREPROCESSORS 'none' 
    HYPERPARAMETERS DEFAULT
EXCEPT(NUM_ROUND '100') 
SETTINGS(S3_BUCKET 'amzn-s3-demo-bucket');
```

### 모델 훈련 상태 표시(선택 사항)
<a name="tutorial_xgboost_show_status"></a>

SHOW MODEL 명령을 사용하여 모델이 준비되었는지 알 수 있습니다.

다음 쿼리를 사용하여 모델 훈련의 진행 상황을 모니터링합니다.

```
SHOW MODEL model_banknoteauthentication_xgboost_binary;
```

모델이 `READY`인 경우 SHOW MODEL 작업은 다음 출력 예시에서 보여주는 것처럼 `train:error` 메트릭을 제공합니다. `train:error` 메트릭은 소수점 6자리까지 측정하는 모델의 정확도를 측정한 것입니다. 값이 0이면 가장 정확하고 값이 1이면 가장 부정확합니다.

```
+--------------------------+--------------------------------------------------+
|        Model Name        |   model_banknoteauthentication_xgboost_binary    |
+--------------------------+--------------------------------------------------+
| Schema Name              | public                                           |
| Owner                    | awsuser                                          |
| Creation Time            | Tue, 21.06.2022 19:07:35                         |
| Model State              | READY                                            |
| train:error              |                                         0.000000 |
| Estimated Cost           |                                         0.006197 |
|                          |                                                  |
| TRAINING DATA:           |                                                  |
| Query                    | SELECT *                                         |
|                          | FROM "BANKNOTEAUTHENTICATION_TRAIN"              |
| Target Column            | CLASS                                            |
|                          |                                                  |
| PARAMETERS:              |                                                  |
| Model Type               | xgboost                                          |
| Training Job Name        | redshiftml-20220621190735686935-xgboost          |
| Function Name            | func_model_banknoteauthentication_xgboost_binary |
| Function Parameters      | variance skewness curtosis entropy               |
| Function Parameter Types | float8 float8 float8 float8                      |
| IAM Role                 | default-aws-iam-role                             |
| S3 Bucket                | amzn-s3-demo-bucket                              |
| Max Runtime              |                                             5400 |
|                          |                                                  |
| HYPERPARAMETERS:         |                                                  |
| num_round                |                                              100 |
| objective                | binary:logistic                                  |
+--------------------------+--------------------------------------------------+
```

## 3단계: 모델을 사용하여 예측 수행
<a name="tutorial_xgboost_step_perform_predictions"></a>

### 모델의 정확도 확인
<a name="tutorial_xgboost_check_accuracy"></a>

다음 예측 쿼리에서는 이전 단계에서 생성한 예측 함수를 사용하여 모델의 정확도를 확인합니다. 테스트 세트에서 이 쿼리를 실행하여 모델이 훈련 세트와 너무 근접하게 대응되지 않도록 합니다. 이러한 근접 대응을 과적합이라고도 하며, 과적합으로 인해 모델이 신뢰할 수 없는 예측을 수행할 수 있습니다.

```
WITH predict_data AS (
    SELECT
        class AS label,
        func_model_banknoteauthentication_xgboost_binary (variance, skewness, curtosis, entropy) AS predicted,
        CASE
            WHEN label IS NULL THEN 0
            ELSE label
        END AS actual,
        CASE
            WHEN actual = predicted THEN 1 :: INT
            ELSE 0 :: INT
        END AS correct
    FROM
        banknoteauthentication_test
),
aggr_data AS (
    SELECT
        SUM(correct) AS num_correct,
        COUNT(*) AS total
    FROM
        predict_data
)
SELECT
    (num_correct :: FLOAT / total :: FLOAT) AS accuracy
FROM
    aggr_data;
```

### 원본 및 위조 지폐의 양 예측
<a name="tutorial_xgboost_predict_amount"></a>

다음 예측 쿼리는 테스트 세트에 있는 원본 및 위조 지폐의 예상 양을 반환합니다.

```
WITH predict_data AS (
    SELECT
        func_model_banknoteauthentication_xgboost_binary(variance, skewness, curtosis, entropy) AS predicted
    FROM
        banknoteauthentication_test
)
SELECT
    CASE
        WHEN predicted = '0' THEN 'Original banknote'
        WHEN predicted = '1' THEN 'Counterfeit banknote'
        ELSE 'NA'
    END AS banknote_authentication,
    COUNT(1) AS count
FROM
    predict_data
GROUP BY
    1;
```

### 원본 지폐와 위조 지폐에 대한 평균 관찰 값 찾기
<a name="tutorial_xgboost_find_average_observation"></a>

다음 예측 쿼리는 테스트 세트에서 원본 및 위조 지폐로 예측되는 지폐에 대한 각 특성의 평균값을 반환합니다.

```
WITH predict_data AS (
    SELECT
        func_model_banknoteauthentication_xgboost_binary(variance, skewness, curtosis, entropy) AS predicted,
          variance,
          skewness,
          curtosis,
          entropy
    FROM
        banknoteauthentication_test
)
SELECT
    CASE
        WHEN predicted = '0' THEN 'Original banknote'
        WHEN predicted = '1' THEN 'Counterfeit banknote'
        ELSE 'NA'
    END AS banknote_authentication,
    TRUNC(AVG(variance), 2) AS avg_variance,
    TRUNC(AVG(skewness), 2) AS avg_skewness,
    TRUNC(AVG(curtosis), 2) AS avg_curtosis,
    TRUNC(AVG(entropy), 2) AS avg_entropy
FROM
    predict_data
GROUP BY
    1
ORDER BY
    2;
```

## 관련 주제
<a name="tutorial_xgboost_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)

# 튜토리얼: 회귀 모델 구축
<a name="tutorial_regression"></a>

이 튜토리얼에서는 Amazon Redshift ML을 사용하여 기계 학습 회귀 모델을 생성하고 모델에 대해 예측 쿼리를 실행합니다. 회귀 모델을 사용하면 주택 가격이나 도시의 자전거 대여 서비스를 이용할 사람 수와 같은 수치 결과를 예측할 수 있습니다. Amazon Redshift에서 훈련 데이터와 함께 CREATE MODEL 명령을 사용합니다. 그런 다음 Amazon Redshift ML이 모델을 컴파일하고 훈련된 모델을 Redshift로 가져온 다음 SQL 예측 함수를 준비합니다. 예측 함수는 Amazon Redshift의 SQL 쿼리에 사용할 수 있습니다.

이 튜토리얼에서는 Amazon Redshift ML을 사용하여 하루 중 특정 시간에 토론토 시의 자전거 공유 서비스를 사용하는 사람의 수를 예측하는 회귀 모델을 구축합니다. 모델의 입력에는 휴일 및 기상 조건이 포함됩니다. 이 문제에 대한 수치적 결과를 원하기 때문에 회귀 모델을 사용하게 됩니다.

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

## 사용 사례
<a name="tutorial_regression_tasks"></a>

Amazon Redshift ML을 사용하여 고객의 평생 가치 예측과 같은 기타 회귀 문제를 해결할 수 있습니다. 또한 Redshift ML을 사용하여 제품의 가장 수익성이 높은 가격과 그에 따른 제품 수익을 예측할 수 있습니다.

**작업**
+ 사전 조건
+ 1단계: Amazon S3에서 Amazon Redshift로 데이터 로드
+ 2단계: 기계 학습 모델 생성
+ 3단계: 모델 검증

## 사전 조건
<a name="tutorial_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_regression_step_load"></a>

[Amazon Redshift 쿼리 편집기 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html)를 사용하여 다음 쿼리를 실행합니다.

1. 세 개의 퍼블릭 데이터 세트를 Amazon Redshift로 로드하려면 테이블 세 개를 생성해야 합니다. 데이터 세트는 [Toronto Bike Ridership Data](https://open.toronto.ca/dataset/bike-share-toronto-ridership-data/), [historical weather data](https://climate.weather.gc.ca/historical_data/search_historic_data_e.html), [historical holidays data](https://github.com/uWaterloo/Datasets/blob/master/Holidays/holidays.csv)입니다. Amazon Redshift 쿼리 편집기에서 다음 쿼리를 실행하여 `ridership`, `weather`, `holiday`라는 테이블을 생성합니다.

   ```
   CREATE TABLE IF NOT EXISTS ridership (
       trip_id INT,
       trip_duration_seconds INT,
       trip_start_time timestamp,
       trip_stop_time timestamp,
       from_station_name VARCHAR(50),
       to_station_name VARCHAR(50),
       from_station_id SMALLINT,
       to_station_id SMALLINT,
       user_type VARCHAR(20)
   );
   
   CREATE TABLE IF NOT EXISTS weather (
       longitude_x DECIMAL(5, 2),
       latitude_y DECIMAL(5, 2),
       station_name VARCHAR(20),
       climate_id BIGINT,
       datetime_utc TIMESTAMP,
       weather_year SMALLINT,
       weather_month SMALLINT,
       weather_day SMALLINT,
       time_utc VARCHAR(5),
       temp_c DECIMAL(5, 2),
       temp_flag VARCHAR(1),
       dew_point_temp_c DECIMAL(5, 2),
       dew_point_temp_flag VARCHAR(1),
       rel_hum SMALLINT,
       rel_hum_flag VARCHAR(1),
       precip_amount_mm DECIMAL(5, 2),
       precip_amount_flag VARCHAR(1),
       wind_dir_10s_deg VARCHAR(10),
       wind_dir_flag VARCHAR(1),
       wind_spd_kmh VARCHAR(10),
       wind_spd_flag VARCHAR(1),
       visibility_km VARCHAR(10),
       visibility_flag VARCHAR(1),
       stn_press_kpa DECIMAL(5, 2),
       stn_press_flag VARCHAR(1),
       hmdx SMALLINT,
       hmdx_flag VARCHAR(1),
       wind_chill VARCHAR(10),
       wind_chill_flag VARCHAR(1),
       weather VARCHAR(10)
   );
   
   CREATE TABLE IF NOT EXISTS holiday (holiday_date DATE, description VARCHAR(100));
   ```

1. 다음 쿼리는 샘플 데이터를 이전 단계에서 생성한 테이블로 로드합니다.

   ```
   COPY ridership
   FROM
       's3://redshift-ml-bikesharing-data/bike-sharing-data/ridership/' 
       IAM_ROLE default 
       FORMAT CSV 
       IGNOREHEADER 1 
       DATEFORMAT 'auto' 
       TIMEFORMAT 'auto' 
       REGION 'us-west-2' 
       gzip;
   
   COPY weather
   FROM
       's3://redshift-ml-bikesharing-data/bike-sharing-data/weather/' 
       IAM_ROLE default 
       FORMAT csv 
       IGNOREHEADER 1 
       DATEFORMAT 'auto' 
       TIMEFORMAT 'auto' 
       REGION 'us-west-2' 
       gzip;
   
   COPY holiday
   FROM
       's3://redshift-ml-bikesharing-data/bike-sharing-data/holiday/' 
       IAM_ROLE default 
       FORMAT csv 
       IGNOREHEADER 1 
       DATEFORMAT 'auto' 
       TIMEFORMAT 'auto' 
       REGION 'us-west-2' 
       gzip;
   ```

1. 다음 쿼리는 `ridership` 및 `weather` 데이터 세트에 변환을 수행하여 편향이나 이상을 제거합니다. 편향과 이상을 제거하면 모델 정확도가 향상됩니다. 이 쿼리는 `ridership_view`와 `weather_view`라는 두 개의 새로운 보기를 생성하여 테이블을 단순화합니다.

   ```
   CREATE
   OR REPLACE VIEW ridership_view AS
   SELECT
       trip_time,
       trip_count,
       TO_CHAR(trip_time, 'hh24') :: INT trip_hour,
       TO_CHAR(trip_time, 'dd') :: INT trip_day,
       TO_CHAR(trip_time, 'mm') :: INT trip_month,
       TO_CHAR(trip_time, 'yy') :: INT trip_year,
       TO_CHAR(trip_time, 'q') :: INT trip_quarter,
       TO_CHAR(trip_time, 'w') :: INT trip_month_week,
       TO_CHAR(trip_time, 'd') :: INT trip_week_day
   FROM
       (
           SELECT
               CASE
                   WHEN TRUNC(r.trip_start_time) < '2017-07-01' :: DATE THEN CONVERT_TIMEZONE(
                       'US/Eastern',
                       DATE_TRUNC('hour', r.trip_start_time)
                   )
                   ELSE DATE_TRUNC('hour', r.trip_start_time)
               END trip_time,
               COUNT(1) trip_count
           FROM
               ridership r
           WHERE
               r.trip_duration_seconds BETWEEN 60
               AND 60 * 60 * 24
           GROUP BY
               1
       );
   
   CREATE
   OR REPLACE VIEW weather_view AS
   SELECT
       CONVERT_TIMEZONE(
           'US/Eastern',
           DATE_TRUNC('hour', datetime_utc)
       ) daytime,
       ROUND(AVG(temp_c)) temp_c,
       ROUND(AVG(precip_amount_mm)) precip_amount_mm
   FROM
       weather
   GROUP BY
       1;
   ```

1. 다음 쿼리는 `ridership_view`, `weather_view`에서 모든 관련 입력 속성을 `trip_data` 테이블에 결합하는 테이블을 생성합니다.

   ```
   CREATE TABLE trip_data AS
   SELECT
       r.trip_time,
       r.trip_count,
       r.trip_hour,
       r.trip_day,
       r.trip_month,
       r.trip_year,
       r.trip_quarter,
       r.trip_month_week,
       r.trip_week_day,
       w.temp_c,
       w.precip_amount_mm,CASE
           WHEN h.holiday_date IS NOT NULL THEN 1
           WHEN TO_CHAR(r.trip_time, 'D') :: INT IN (1, 7) THEN 1
           ELSE 0
       END is_holiday,
       ROW_NUMBER() OVER (
           ORDER BY
               RANDOM()
       ) serial_number
   FROM
       ridership_view r
       JOIN weather_view w ON (r.trip_time = w.daytime)
       LEFT OUTER JOIN holiday h ON (TRUNC(r.trip_time) = h.holiday_date);
   ```

### 샘플 데이터 보기(선택 사항)
<a name="tutorial_regression_view_data"></a>

다음 쿼리는 테이블의 항목을 보여줍니다. 이 작업을 실행하여 테이블이 올바르게 생성되었는지 확인할 수 있습니다.

```
SELECT * 
FROM trip_data 
LIMIT 5;
```

다음은 이전 작업 출력의 예시입니다.

```
+---------------------+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+
|      trip_time      | trip_count | trip_hour | trip_day | trip_month | trip_year | trip_quarter | trip_month_week | trip_week_day | temp_c | precip_amount_mm | is_holiday | serial_number |
+---------------------+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+
| 2017-03-21 22:00:00 |         47 |        22 |       21 |          3 |        17 |            1 |               3 |             3 |      1 |                0 |          0 |             1 |
| 2018-05-04 01:00:00 |         19 |         1 |        4 |          5 |        18 |            2 |               1 |             6 |     12 |                0 |          0 |             3 |
| 2018-01-11 10:00:00 |         93 |        10 |       11 |          1 |        18 |            1 |               2 |             5 |      9 |                0 |          0 |             5 |
| 2017-10-28 04:00:00 |         20 |         4 |       28 |         10 |        17 |            4 |               4 |             7 |     11 |                0 |          1 |             7 |
| 2017-12-31 21:00:00 |         11 |        21 |       31 |         12 |        17 |            4 |               5 |             1 |    -15 |                0 |          1 |             9 |
+---------------------+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+
```

### 속성 간의 상관 관계 표시(선택 사항)
<a name="tutorial_regression_show_correlation"></a>

상관 관계를 결정하면 속성 간의 연관 강도를 측정하는 데 도움이 됩니다. 연관 수준은 목표 출력에 영향을 미치는 요소를 결정하는 데 도움이 될 수 있습니다. 이 튜토리얼의 목표 출력은 `trip_count`입니다.

다음 쿼리는 `sp_correlation` 절차를 생성하거나 대체합니다. `sp_correlation`라는 저장된 절차를 사용하여 Amazon Redshift의 테이블에 있는 속성과 다른 속성 간의 상관 관계를 표시합니다.

```
CREATE OR REPLACE PROCEDURE sp_correlation(source_schema_name in varchar(255), source_table_name in varchar(255), target_column_name in varchar(255), output_temp_table_name inout varchar(255)) AS $$
DECLARE
  v_sql varchar(max);
  v_generated_sql varchar(max);
  v_source_schema_name varchar(255)=lower(source_schema_name);
  v_source_table_name varchar(255)=lower(source_table_name);
  v_target_column_name varchar(255)=lower(target_column_name);
BEGIN
  EXECUTE 'DROP TABLE IF EXISTS ' || output_temp_table_name;
  v_sql = '
SELECT
  ''CREATE temp table '|| output_temp_table_name||' AS SELECT ''|| outer_calculation||
  '' FROM (SELECT COUNT(1) number_of_items, SUM('||v_target_column_name||') sum_target, SUM(POW('||v_target_column_name||',2)) sum_square_target, POW(SUM('||v_target_column_name||'),2) square_sum_target,''||
  inner_calculation||
  '' FROM (SELECT ''||
  column_name||
  '' FROM '||v_source_table_name||'))''
FROM
  (
  SELECT
    DISTINCT
    LISTAGG(outer_calculation,'','') OVER () outer_calculation
    ,LISTAGG(inner_calculation,'','') OVER () inner_calculation
    ,LISTAGG(column_name,'','') OVER () column_name
  FROM
    (
    SELECT
      CASE WHEN atttypid=16 THEN ''DECODE(''||column_name||'',true,1,0)'' ELSE column_name END column_name
      ,atttypid
      ,''CAST(DECODE(number_of_items * sum_square_''||rn||'' - square_sum_''||rn||'',0,null,(number_of_items*sum_target_''||rn||'' - sum_target * sum_''||rn||
        '')/SQRT((number_of_items * sum_square_target - square_sum_target) * (number_of_items * sum_square_''||rn||
        '' - square_sum_''||rn||''))) AS numeric(5,2)) ''||column_name outer_calculation
      ,''sum(''||column_name||'') sum_''||rn||'',''||
            ''SUM(trip_count*''||column_name||'') sum_target_''||rn||'',''||
            ''SUM(POW(''||column_name||'',2)) sum_square_''||rn||'',''||
            ''POW(SUM(''||column_name||''),2) square_sum_''||rn inner_calculation
    FROM
      (
      SELECT
        row_number() OVER (order by a.attnum) rn
        ,a.attname::VARCHAR column_name
        ,a.atttypid
      FROM pg_namespace AS n
        INNER JOIN pg_class AS c ON n.oid = c.relnamespace
        INNER JOIN pg_attribute AS a ON c.oid = a.attrelid
      WHERE a.attnum > 0
        AND n.nspname = '''||v_source_schema_name||'''
        AND c.relname = '''||v_source_table_name||'''
        AND a.atttypid IN (16,20,21,23,700,701,1700)
      )
    )
)';
  EXECUTE v_sql INTO v_generated_sql;
  EXECUTE  v_generated_sql;
END;
$$ LANGUAGE plpgsql;
```

다음 쿼리는 대상 열, `trip_count`, 데이터 세트 내의 기타 숫자 속성 간의 상관 관계를 표시합니다.

```
call sp_correlation(
    'public',
    'trip_data',
    'trip_count',
    'tmp_corr_table'
);

SELECT
    *
FROM
    tmp_corr_table;
```

다음은 이전 `sp_correlation` 작업 출력의 예시입니다.

```
+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+
| trip_count | trip_hour | trip_day | trip_month | trip_year | trip_quarter | trip_month_week | trip_week_day | temp_c | precip_amount_mm | is_holiday | serial_number |
+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+
|          1 |      0.32 |     0.01 |       0.18 |      0.12 |         0.18 |               0 |          0.02 |   0.53 |            -0.07 |      -0.13 |             0 |
+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+
```

## 2단계: 기계 학습 모델 생성
<a name="tutorial_regression_create_model"></a>

1. 다음 쿼리는 데이터 세트의 80%를 훈련으로 지정하고 20%를 검증으로 지정하여 데이터를 훈련 세트와 검증 세트로 분할합니다. 훈련 세트는 ML 모델에서 가능한 최상의 알고리즘을 식별하기 위한 입력입니다. 모델을 생성한 후 검증 세트를 사용하여 모델 정확도를 검증합니다.

   ```
   CREATE TABLE training_data AS
   SELECT
       trip_count,
       trip_hour,
       trip_day,
       trip_month,
       trip_year,
       trip_quarter,
       trip_month_week,
       trip_week_day,
       temp_c,
       precip_amount_mm,
       is_holiday
   FROM
       trip_data
   WHERE
       serial_number > (
           SELECT
               COUNT(1) * 0.2
           FROM
               trip_data
       );
   
   CREATE TABLE validation_data AS
   SELECT
       trip_count,
       trip_hour,
       trip_day,
       trip_month,
       trip_year,
       trip_quarter,
       trip_month_week,
       trip_week_day,
       temp_c,
       precip_amount_mm,
       is_holiday,
       trip_time
   FROM
       trip_data
   WHERE
       serial_number <= (
           SELECT
               COUNT(1) * 0.2
           FROM
               trip_data
       );
   ```

1. 다음 쿼리는 임의의 입력 날짜 및 시간에 대해 `trip_count` 값을 예측하는 회귀 모델을 생성합니다. 다음 예제에서는 amzn-s3-demo-bucket을 자체 S3 버킷으로 바꿉니다.

   ```
   CREATE MODEL predict_rental_count
   FROM
       training_data TARGET trip_count FUNCTION predict_rental_count 
       IAM_ROLE default 
       PROBLEM_TYPE regression 
       OBJECTIVE 'mse' 
       SETTINGS (
           s3_bucket 'amzn-s3-demo-bucket',
           s3_garbage_collect off,
           max_runtime 5000
       );
   ```

## 3단계: 모델 검증
<a name="tutorial_regression_step_validate"></a>

1. 다음 쿼리를 사용하여 모델의 측면을 출력하고 출력에서 평균 제곱 오차 메트릭을 찾습니다. 평균 제곱 오차는 회귀 문제에서 흔히 사용하는 정확도 메트릭입니다.

   ```
   show model predict_rental_count;
   ```

1. 검증 데이터에 대해 다음 예측 쿼리를 실행하여 예측된 이동 횟수를 실제 이동 횟수와 비교합니다.

   ```
   SELECT
       trip_time,
       actual_count,
       predicted_count,
       (actual_count - predicted_count) difference
   FROM
       (
           SELECT
               trip_time,
               trip_count AS actual_count,
               PREDICT_RENTAL_COUNT (
                   trip_hour,
                   trip_day,
                   trip_month,
                   trip_year,
                   trip_quarter,
                   trip_month_week,
                   trip_week_day,
                   temp_c,
                   precip_amount_mm,
                   is_holiday
               ) predicted_count
           FROM
               validation_data
       )
   LIMIT
       5;
   ```

1. 다음 쿼리는 검증 데이터를 기반으로 평균 제곱 오차 및 평균 제곱근 오차를 계산합니다. 평균 제곱 오차와 평균 제곱근 평균 제곱 오차를 사용하여 예상 수치 목표 값과 실제 수치 답변 간의 거리를 측정합니다. 좋은 모델은 두 메트릭 모두에서 점수가 낮습니다. 다음 쿼리는 두 메트릭의 값을 반환합니다.

   ```
   SELECT
       ROUND(
           AVG(POWER((actual_count - predicted_count), 2)),
           2
       ) mse,
       ROUND(
           SQRT(AVG(POWER((actual_count - predicted_count), 2))),
           2
       ) rmse
   FROM
       (
           SELECT
               trip_time,
               trip_count AS actual_count,
               PREDICT_RENTAL_COUNT (
                   trip_hour,
                   trip_day,
                   trip_month,
                   trip_year,
                   trip_quarter,
                   trip_month_week,
                   trip_week_day,
                   temp_c,
                   precip_amount_mm,
                   is_holiday
               ) predicted_count
           FROM
               validation_data
       );
   ```

1. 다음 쿼리는 2017-01-01에 일어난 각 이동 시간에 대한 이동 횟수의 백분율 오차를 계산합니다. 쿼리는 오류 비율이 가장 낮은 시간부터 오류 비율이 가장 높은 시간 순서로 이동 시간을 정렬합니다.

   ```
   SELECT
       trip_time,
       CAST(ABS(((actual_count - predicted_count) / actual_count)) * 100 AS DECIMAL (7,2)) AS pct_error
   FROM
       (
           SELECT
               trip_time,
               trip_count AS actual_count,
               PREDICT_RENTAL_COUNT (
                   trip_hour,
                   trip_day,
                   trip_month,
                   trip_year,
                   trip_quarter,
                   trip_month_week,
                   trip_week_day,
                   temp_c,
                   precip_amount_mm,
                   is_holiday
               ) predicted_count
           FROM
               validation_data
       )
   WHERE
      trip_time LIKE '2017-01-01 %%:%%:%%'
   ORDER BY
      2 ASC;
   ```

## 관련 주제
<a name="tutorial_regression_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)

# 튜토리얼: 선형 학습기를 사용하여 회귀 모델 구축
<a name="tutorial_linear_learner_regression"></a>

이 튜토리얼에서는 Amazon S3의 데이터로 선형 학습기 모델을 생성하고 Amazon Redshift ML을 사용하여 이 모델로 예측 쿼리를 실행합니다. SageMaker AI 선형 학습기 알고리즘은 회귀 또는 멀티클래스 분류 문제를 해결합니다. 회귀 및 멀티클래스 분류 문제에 대한 자세한 내용은 Amazon SageMaker AI Developer Guide의 [기본 기계 학습 패러다임의 문제 유형](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 Developer Guide의 [Linear Learner Algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html) 섹션을 참조하세요.

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

선형 학습기 모델은 연속형 목표 또는 이산 목표를 최적화합니다. 연속형 목표는 회귀에 사용되고 이산형 변수는 분류에 사용됩니다. 회귀 방법과 같은 일부 방법은 연속형 목표에 대해서만 솔루션을 제공합니다. 선형 학습기 알고리즘은 Naive Bayes 기법과 같은 단순한 하이퍼파라미터 최적화 기법에 비해 속도를 높입니다. 나이브 최적화 기법에서는 각 입력 변수가 독립적이라고 가정합니다. 선형 학습기 알고리즘을 사용하려면 입력의 차원을 나타내는 열과 관측치를 나타내는 행을 제공해야 합니다. 선형 학습기 알고리즘에 대한 자세한 내용은 Amazon SageMaker AI Developer Guide의 [Linear Learner Algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html) 섹션을 참조하세요.

이 튜토리얼에서는 전복의 나이를 예측하는 선형 학습기 모델을 구축합니다. [Abalone dataset](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 Redshift에서 생성한 `abalone_dataset` 테이블에 Amazon S3의 [Abalone dataset](http://archive.ics.uci.edu/ml/datasets/Abalone)에 있는 샘플 데이터를 복사합니다.

   ```
   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. 다음 쿼리를 사용하여 예측 함수에 EXPLAIN\$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 기계 학습 사용 비용](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)

# 튜토리얼: 선형 학습기를 사용하여 다중 클래스 분류 모델 구축
<a name="tutorial_linear_learner_multi-class_classification"></a>

이 튜토리얼에서는 Amazon S3의 데이터로 선형 학습기 모델을 생성하고 Amazon Redshift ML을 사용하여 이 모델로 예측 쿼리를 실행합니다. SageMaker AI 선형 학습기 알고리즘은 회귀 또는 분류 문제를 해결합니다. 회귀 및 멀티클래스 분류 문제에 대한 자세한 내용은 Amazon SageMaker AI Developer Guide의 [기본 기계 학습 패러다임의 문제 유형](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 Developer Guide의 [Linear Learner Algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html) 섹션을 참조하세요.

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

선형 학습기 모델은 연속형 목표 또는 이산 목표를 최적화합니다. 연속형 목표는 회귀에 사용되고 이산형 변수는 분류에 사용됩니다. 회귀 방법과 같은 일부 방법은 연속형 목표에 대해서만 솔루션을 제공합니다. 선형 학습기 알고리즘은 Naive Bayes 기법과 같은 단순한 하이퍼파라미터 최적화 기법에 비해 속도를 높입니다. 나이브 최적화 기법에서는 각 입력 변수가 독립적이라고 가정합니다. 선형 학습기 알고리즘은 여러 모델을 병렬로 훈련시키고 가장 최적화된 모델을 선택합니다. 비슷한 알고리즘은 XGBoost로, 더 간단하고 약한 모델 세트의 추정치를 결합하여 예측을 수행합니다. XGBoost에 대한 자세한 내용은 Amazon SageMaker AI Developer Guide의 [XGBoost algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html) 섹션을 참조하세요.

선형 학습기 알고리즘을 사용하려면 입력의 차원을 나타내는 열과 관측치를 나타내는 행을 제공해야 합니다. 선형 학습기 알고리즘에 대한 자세한 내용은 Amazon SageMaker AI Developer Guide의 [Linear Learner Algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html) 섹션을 참조하세요.

이 튜토리얼에서는 특정 영역의 식물 유형을 예측하는 선형 학습기 모델을 구축합니다. UCI Machine Learning Repository에 있는 [Covertype dataset](https://archive.ics.uci.edu/ml/datasets/covertype)에서 CREATE MODEL 명령을 사용합니다. 그런 다음 명령으로 생성한 예측 함수를 사용하여 황야 지역의 식물 유형을 결정합니다. 임상 식물 유형은 일반적으로 나무 중 하나입니다. Redshift ML에서 모델을 생성하는 데 사용할 입력에는 토양 유형, 도로까지의 거리 및 황야 지역 지정이 포함됩니다. 이 데이터 세트에 대한 자세한 내용은 UCI Machine Learning Repository에서 [Covertype Dataset](https://archive.ics.uci.edu/ml/datasets/covertype)를 참조하세요.

## 사용 사례
<a name="tutorial_linear_learner_multi-class_classification_tasks"></a>

Amazon Redshift ML을 사용하는 선형 학습기로 이미지에서 식물의 종을 예측하는 등 다른 다중 클래스 분류 문제를 해결할 수 있습니다. 고객이 구매할 제품의 수량도 예측할 수 있습니다.

**작업**
+ 사전 조건
+ 1단계: Amazon S3에서 Amazon Redshift로 데이터 로드
+ 2단계: 기계 학습 모델 생성
+ 3단계: 모델 검증

## 사전 조건
<a name="tutorial_linear_learner_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_linear_learner_multi-class_classification_step_load"></a>

[Amazon Redshift 쿼리 편집기 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html)를 사용하여 다음 쿼리를 실행합니다. 이 쿼리는 샘플 데이터를 Redshift로 로드하고 데이터를 훈련 세트와 검증 세트로 나눕니다.

1. 다음 예에서는 `covertype_data` 테이블을 생성합니다.

   ```
   CREATE TABLE public.covertype_data (
       elevation bigint ENCODE az64,
       aspect bigint ENCODE az64,
       slope bigint ENCODE az64,
       horizontal_distance_to_hydrology bigint ENCODE az64,
       vertical_distance_to_hydrology bigint ENCODE az64,
       horizontal_distance_to_roadways bigint ENCODE az64,
       hillshade_9am bigint ENCODE az64,
       hillshade_noon bigint ENCODE az64,
       hillshade_3pm bigint ENCODE az64,
       horizontal_distance_to_fire_points bigint ENCODE az64,
       wilderness_area1 bigint ENCODE az64,
       wilderness_area2 bigint ENCODE az64,
       wilderness_area3 bigint ENCODE az64,
       wilderness_area4 bigint ENCODE az64,
       soil_type1 bigint ENCODE az64,
       soil_type2 bigint ENCODE az64,
       soil_type3 bigint ENCODE az64,
       soil_type4 bigint ENCODE az64,
       soil_type5 bigint ENCODE az64,
       soil_type6 bigint ENCODE az64,
       soil_type7 bigint ENCODE az64,
       soil_type8 bigint ENCODE az64,
       soil_type9 bigint ENCODE az64,
       soil_type10 bigint ENCODE az64,
       soil_type11 bigint ENCODE az64,
       soil_type12 bigint ENCODE az64,
       soil_type13 bigint ENCODE az64,
       soil_type14 bigint ENCODE az64,
       soil_type15 bigint ENCODE az64,
       soil_type16 bigint ENCODE az64,
       soil_type17 bigint ENCODE az64,
       soil_type18 bigint ENCODE az64,
       soil_type19 bigint ENCODE az64,
       soil_type20 bigint ENCODE az64,
       soil_type21 bigint ENCODE az64,
       soil_type22 bigint ENCODE az64,
       soil_type23 bigint ENCODE az64,
       soil_type24 bigint ENCODE az64,
       soil_type25 bigint ENCODE az64,
       soil_type26 bigint ENCODE az64,
       soil_type27 bigint ENCODE az64,
       soil_type28 bigint ENCODE az64,
       soil_type29 bigint ENCODE az64,
       soil_type30 bigint ENCODE az64,
       soil_type31 bigint ENCODE az64,
       soil_type32 bigint ENCODE az64,
       soil_type33 bigint ENCODE az64,
       soil_type34 bigint ENCODE az64,
       soil_type35 bigint ENCODE az64,
       soil_type36 bigint ENCODE az64,
       soil_type37 bigint ENCODE az64,
       soil_type38 bigint ENCODE az64,
       soil_type39 bigint ENCODE az64,
       soil_type40 bigint ENCODE az64,
       cover_type bigint ENCODE az64
   ) DISTSTYLE AUTO;
   ```

1. 다음 쿼리는 이전에 Amazon Redshift에서 생성한 `covertype_data` 테이블에 Amazon S3의 [Covertype dataset](https://archive.ics.uci.edu/ml/datasets/covertype)에 있는 샘플 데이터를 복사합니다.

   ```
   COPY public.covertype_data
   FROM
       's3://redshift-ml-multiclass/covtype.data.gz' IAM_ROLE DEFAULT gzip DELIMITER ',' REGION 'us-east-1';
   ```

1. 데이터를 수동으로 분할하면 추가 테스트 세트를 할당하여 모델의 정확도를 확인할 수 있습니다. 다음 쿼리는 데이터를 세 세트로 분할합니다. `covertype_training` 테이블은 훈련용이고 `covertype_validation` 테이블은 검증용, `covertype_test` 테이블은 모델 테스트용입니다. 훈련 세트를 사용하여 모델을 학습시키고 검증 세트를 사용하여 모델 개발을 검증합니다. 그런 다음 테스트 세트를 사용하여 모델의 성능을 테스트하고 모델이 데이터 세트를 과적합으로 처리하는지 또는 과소적합으로 처리하는지 확인합니다.

   ```
   CREATE TABLE public.covertype_data_prep AS
   SELECT
       a.*,
       CAST (random() * 100 AS int) AS data_group_id
   FROM
       public.covertype_data a;
   
   --training dataset
    CREATE TABLE public.covertype_training as
   SELECT
       *
   FROM
       public.covertype_data_prep
   WHERE
       data_group_id < 80;
   
   --validation dataset
    CREATE TABLE public.covertype_validation AS
   SELECT
       *
   FROM
       public.covertype_data_prep
   WHERE
       data_group_id BETWEEN 80
       AND 89;
   
   --test dataset
    CREATE TABLE public.covertype_test AS
   SELECT
       *
   FROM
       public.covertype_data_prep
   WHERE
       data_group_id > 89;
   ```

## 2단계: 기계 학습 모델 생성
<a name="tutorial_linear_learner_multi-class_classification_step_create_model"></a>

이 단계에서는 CREATE MODEL 스테이트먼트를 사용하여 선형 학습기 알고리즘으로 머신 러닝 모델을 생성합니다.

다음 쿼리는 S3 버킷을 사용하여 CREATE MODEL 작업으로 선형 학습기 모델을 생성합니다. amzn-s3-demo-bucket을 자체 S3 버킷으로 교체합니다.

```
CREATE MODEL forest_cover_type_model
FROM
    (
        SELECT
            Elevation,
            Aspect,
            Slope,
            Horizontal_distance_to_hydrology,
            Vertical_distance_to_hydrology,
            Horizontal_distance_to_roadways,
            HIllshade_9am,
            Hillshade_noon,
            Hillshade_3pm,
            Horizontal_Distance_To_Fire_Points,
            Wilderness_Area1,
            Wilderness_Area2,
            Wilderness_Area3,
            Wilderness_Area4,
            soil_type1,
            Soil_Type2,
            Soil_Type3,
            Soil_Type4,
            Soil_Type5,
            Soil_Type6,
            Soil_Type7,
            Soil_Type8,
            Soil_Type9,
            Soil_Type10,
            Soil_Type11,
            Soil_Type12,
            Soil_Type13,
            Soil_Type14,
            Soil_Type15,
            Soil_Type16,
            Soil_Type17,
            Soil_Type18,
            Soil_Type19,
            Soil_Type20,
            Soil_Type21,
            Soil_Type22,
            Soil_Type23,
            Soil_Type24,
            Soil_Type25,
            Soil_Type26,
            Soil_Type27,
            Soil_Type28,
            Soil_Type29,
            Soil_Type30,
            Soil_Type31,
            Soil_Type32,
            Soil_Type33,
            Soil_Type34,
            Soil_Type36,
            Soil_Type37,
            Soil_Type38,
            Soil_Type39,
            Soil_Type40,
            Cover_type
        from
            public.covertype_training
    ) TARGET cover_type FUNCTION predict_cover_type IAM_ROLE default MODEL_TYPE LINEAR_LEARNER PROBLEM_TYPE MULTICLASS_CLASSIFICATION OBJECTIVE 'Accuracy' SETTINGS (
        S3_BUCKET 'amzn-s3-demo-bucket',
        S3_GARBAGE_COLLECT OFF,
        MAX_RUNTIME 15000
    );
```

### 모델 훈련 상태 표시(선택 사항)
<a name="tutorial_linear_learner_multi-class_classification_show_status"></a>

SHOW MODEL 명령을 사용하여 모델이 준비되었는지 알 수 있습니다.

다음 쿼리를 사용하여 모델 훈련의 진행 상황을 모니터링합니다.

```
SHOW MODEL forest_cover_type_model;
```

모델이 준비되면 이전 작업의 출력은 다음 예시와 비슷할 것입니다. 출력은 다음 예의 오른쪽에서 볼 수 있는 `validation:multiclass_accuracy` 메트릭을 제공합니다. 다중 클래스 정확도는 모델에 따라 올바르게 분류된 데이터 포인트의 백분율을 측정합니다. 다음 단계에서 다중 클래스 정확도를 사용하여 모델의 정확도를 확인합니다.

```
+--------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|              Key               |                                                                                                                                                                                                                                                                                                                                                                                                             Value                                                                                                                                                                                                                                                                                                                                                                                                              |
+--------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Model Name                     | forest_cover_type_model                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Schema Name                    | public                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| Owner                          | awsuser                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Creation Time                  | Tue, 12.07.2022 20:24:32                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| Model State                    | READY                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| validation:multiclass_accuracy |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       0.724952 |
| Estimated Cost                 |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       5.341750 |
|                                |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| TRAINING DATA:                 |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| Query                          | SELECT ELEVATION, ASPECT, SLOPE, HORIZONTAL_DISTANCE_TO_HYDROLOGY, VERTICAL_DISTANCE_TO_HYDROLOGY, HORIZONTAL_DISTANCE_TO_ROADWAYS, HILLSHADE_9AM, HILLSHADE_NOON, HILLSHADE_3PM , HORIZONTAL_DISTANCE_TO_FIRE_POINTS, WILDERNESS_AREA1, WILDERNESS_AREA2, WILDERNESS_AREA3, WILDERNESS_AREA4, SOIL_TYPE1, SOIL_TYPE2, SOIL_TYPE3, SOIL_TYPE4, SOIL_TYPE5, SOIL_TYPE6, SOIL_TYPE7, SOIL_TYPE8, SOIL_TYPE9, SOIL_TYPE10 , SOIL_TYPE11, SOIL_TYPE12 , SOIL_TYPE13 , SOIL_TYPE14, SOIL_TYPE15, SOIL_TYPE16, SOIL_TYPE17, SOIL_TYPE18, SOIL_TYPE19, SOIL_TYPE20, SOIL_TYPE21, SOIL_TYPE22, SOIL_TYPE23, SOIL_TYPE24, SOIL_TYPE25, SOIL_TYPE26, SOIL_TYPE27, SOIL_TYPE28, SOIL_TYPE29, SOIL_TYPE30, SOIL_TYPE31, SOIL_TYPE32, SOIL_TYPE33, SOIL_TYPE34, SOIL_TYPE36, SOIL_TYPE37, SOIL_TYPE38, SOIL_TYPE39, SOIL_TYPE40, COVER_TYPE |
|                                | FROM PUBLIC.COVERTYPE_TRAINING                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| Target Column                  | COVER_TYPE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|                                |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| PARAMETERS:                    |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| Model Type                     | linear_learner                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| Problem Type                   | MulticlassClassification                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| Objective                      | Accuracy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| AutoML Job Name                | redshiftml-20220712202432187659                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| Function Name                  | predict_cover_type                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Function Parameters            | elevation aspect slope horizontal_distance_to_hydrology vertical_distance_to_hydrology horizontal_distance_to_roadways hillshade_9am hillshade_noon hillshade_3pm horizontal_distance_to_fire_points wilderness_area1 wilderness_area2 wilderness_area3 wilderness_area4 soil_type1 soil_type2 soil_type3 soil_type4 soil_type5 soil_type6 soil_type7 soil_type8 soil_type9 soil_type10 soil_type11 soil_type12 soil_type13 soil_type14 soil_type15 soil_type16 soil_type17 soil_type18 soil_type19 soil_type20 soil_type21 soil_type22 soil_type23 soil_type24 soil_type25 soil_type26 soil_type27 soil_type28 soil_type29 soil_type30 soil_type31 soil_type32 soil_type33 soil_type34 soil_type36 soil_type37 soil_type38 soil_type39 soil_type40                                                                            |
| Function Parameter Types       | int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8 int8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| IAM Role                       | default-aws-iam-role                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| S3 Bucket                      | amzn-s3-demo-bucket                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| Max Runtime                    |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          15000 |
+--------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

## 3단계: 모델 검증
<a name="tutorial_linear_learner_multi-class_classification_step_validate"></a>

1. 다음 예측 쿼리는 다중 클래스 정확도를 계산하여 `covertype_validation` 데이터 세트에서 모델의 정확도를 검증합니다. 다중 클래스 정확도는 올바른 모델 예측의 백분율입니다.

   ```
   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
               Elevation,
               Aspect,
               Slope,
               Horizontal_distance_to_hydrology,
               Vertical_distance_to_hydrology,
               Horizontal_distance_to_roadways,
               HIllshade_9am,
               Hillshade_noon,
               Hillshade_3pm,
               Horizontal_Distance_To_Fire_Points,
               Wilderness_Area1,
               Wilderness_Area2,
               Wilderness_Area3,
               Wilderness_Area4,
               soil_type1,
               Soil_Type2,
               Soil_Type3,
               Soil_Type4,
               Soil_Type5,
               Soil_Type6,
               Soil_Type7,
               Soil_Type8,
               Soil_Type9,
               Soil_Type10,
               Soil_Type11,
               Soil_Type12,
               Soil_Type13,
               Soil_Type14,
               Soil_Type15,
               Soil_Type16,
               Soil_Type17,
               Soil_Type18,
               Soil_Type19,
               Soil_Type20,
               Soil_Type21,
               Soil_Type22,
               Soil_Type23,
               Soil_Type24,
               Soil_Type25,
               Soil_Type26,
               Soil_Type27,
               Soil_Type28,
               Soil_Type29,
               Soil_Type30,
               Soil_Type31,
               Soil_Type32,
               Soil_Type33,
               Soil_Type34,
               Soil_Type36,
               Soil_Type37,
               Soil_Type38,
               Soil_Type39,
               Soil_Type40,
               Cover_type AS actual_cover_type,
               predict_cover_type(
                   Elevation,
                   Aspect,
                   Slope,
                   Horizontal_distance_to_hydrology,
                   Vertical_distance_to_hydrology,
                   Horizontal_distance_to_roadways,
                   HIllshade_9am,
                   Hillshade_noon,
                   Hillshade_3pm,
                   Horizontal_Distance_To_Fire_Points,
                   Wilderness_Area1,
                   Wilderness_Area2,
                   Wilderness_Area3,
                   Wilderness_Area4,
                   soil_type1,
                   Soil_Type2,
                   Soil_Type3,
                   Soil_Type4,
                   Soil_Type5,
                   Soil_Type6,
                   Soil_Type7,
                   Soil_Type8,
                   Soil_Type9,
                   Soil_Type10,
                   Soil_Type11,
                   Soil_Type12,
                   Soil_Type13,
                   Soil_Type14,
                   Soil_Type15,
                   Soil_Type16,
                   Soil_Type17,
                   Soil_Type18,
                   Soil_Type19,
                   Soil_Type20,
                   Soil_Type21,
                   Soil_Type22,
                   Soil_Type23,
                   Soil_Type24,
                   Soil_Type25,
                   Soil_Type26,
                   Soil_Type27,
                   Soil_Type28,
                   Soil_Type29,
                   Soil_Type30,
                   Soil_Type31,
                   Soil_Type32,
                   Soil_Type33,
                   Soil_Type34,
                   Soil_Type36,
                   Soil_Type37,
                   Soil_Type38,
                   Soil_Type39,
                   Soil_Type40
               ) AS predicted_cover_type,
               CASE
                   WHEN actual_cover_type = predicted_cover_type THEN 1
                   ELSE 0
               END AS match,
               CASE
                   WHEN actual_cover_type <> predicted_cover_type THEN 1
                   ELSE 0
               END AS nonmatch
           FROM
               public.covertype_validation
       ) t1;
   ```

   이전 쿼리의 출력은 다음 예시와 비슷합니다. 다중 클래스 정확도 메트릭의 값은 SHOW MODEL 작업의 출력에 표시되는 `validation:multiclass_accuracy` 메트릭과 유사할 것입니다.

   ```
   +-------------------+-----------------------+-------------------+--------------+
   | predicted_matches | predicted_non_matches | total_predictions | pct_accuracy |
   +-------------------+-----------------------+-------------------+--------------+
   |             41211 |                 16324 |             57535 |   0.71627704 |
   +-------------------+-----------------------+-------------------+--------------+
   ```

1. 다음 쿼리는 `wilderness_area2`에서 가장 일반적인 식물 유형을 예측합니다. 이 데이터 세트에는 4개의 황야 지역과 7개의 식물 유형이 포함되어 있습니다. 황야 지역에는 여러 식물 유형이 있을 수 있습니다.

   ```
   SELECT t1. predicted_cover_type, COUNT(*) 
   FROM 
   (     
   SELECT 
      Elevation, 
      Aspect,  
      Slope,  
      Horizontal_distance_to_hydrology,  
      Vertical_distance_to_hydrology,   
      Horizontal_distance_to_roadways,  
      HIllshade_9am,  
      Hillshade_noon,  
      Hillshade_3pm , 
      Horizontal_Distance_To_Fire_Points,  
      Wilderness_Area1,  
      Wilderness_Area2,   
      Wilderness_Area3,  
      Wilderness_Area4,  
      soil_type1,
      Soil_Type2,
      Soil_Type3, 
      Soil_Type4, 
      Soil_Type5,  
      Soil_Type6, 
      Soil_Type7,  
      Soil_Type8, 
      Soil_Type9, 
      Soil_Type10 , 
      Soil_Type11,  
      Soil_Type12 , 
      Soil_Type13 ,
      Soil_Type14, 
      Soil_Type15, 
      Soil_Type16,  
      Soil_Type17, 
      Soil_Type18,  
      Soil_Type19,  
      Soil_Type20,  
      Soil_Type21,  
      Soil_Type22,  
      Soil_Type23,  
      Soil_Type24, 
      Soil_Type25,  
      Soil_Type26, 
      Soil_Type27,  
      Soil_Type28,  
      Soil_Type29,  
      Soil_Type30,  
      Soil_Type31, 
      Soil_Type32, 
      Soil_Type33,  
      Soil_Type34, 
      Soil_Type36, 
      Soil_Type37,  
      Soil_Type38,  
      Soil_Type39, 
      Soil_Type40,
      predict_cover_type( Elevation, 
      Aspect,  
      Slope,  
      Horizontal_distance_to_hydrology,  
      Vertical_distance_to_hydrology,   
      Horizontal_distance_to_roadways,  
      HIllshade_9am,  
      Hillshade_noon,  
      Hillshade_3pm , 
      Horizontal_Distance_To_Fire_Points,  
      Wilderness_Area1,  
      Wilderness_Area2,   
      Wilderness_Area3,  
      Wilderness_Area4,  
      soil_type1,
      Soil_Type2,
      Soil_Type3, 
      Soil_Type4, 
      Soil_Type5,  
      Soil_Type6, 
      Soil_Type7,  
      Soil_Type8, 
      Soil_Type9, 
      Soil_Type10,
      Soil_Type11,  
      Soil_Type12, 
      Soil_Type13,
      Soil_Type14, 
      Soil_Type15, 
      Soil_Type16,  
      Soil_Type17, 
      Soil_Type18,  
      Soil_Type19,  
      Soil_Type20,  
      Soil_Type21,  
      Soil_Type22,  
      Soil_Type23,  
      Soil_Type24, 
      Soil_Type25,  
      Soil_Type26, 
      Soil_Type27,  
      Soil_Type28,  
      Soil_Type29,  
      Soil_Type30,  
      Soil_Type31, 
      Soil_Type32, 
      Soil_Type33,  
      Soil_Type34, 
      Soil_Type36, 
      Soil_Type37,  
      Soil_Type38,  
      Soil_Type39, 
      Soil_Type40) AS predicted_cover_type 
   
   FROM public.covertype_test
   WHERE wilderness_area2 = 1)
   t1
   GROUP BY 1;
   ```

   이전 작업의 출력은 다음 예시와 비슷할 것입니다. 이 출력은 모델이 식물의 대부분이 식물 유형 1이고 식물 유형 2, 7이 일부 있다고 예측했음을 의미합니다.

   ```
   +----------------------+-------+
   | predicted_cover_type | count |
   +----------------------+-------+
   |                    2 |   564 |
   |                    7 |    97 |
   |                    1 |  2309 |
   +----------------------+-------+
   ```

1. 다음 쿼리는 하나의 황야 지역에서 가장 일반적인 식물 유형을 보여줍니다. 쿼리에는 해당 식물 유형의 양과 해당 식물 유형의 황야 지역이 표시됩니다.

   ```
   SELECT t1. predicted_cover_type, COUNT(*), wilderness_area 
   FROM 
   (     
   SELECT 
      Elevation, 
      Aspect,  
      Slope,  
      Horizontal_distance_to_hydrology,  
      Vertical_distance_to_hydrology,   
      Horizontal_distance_to_roadways,  
      HIllshade_9am,  
      Hillshade_noon,  
      Hillshade_3pm , 
      Horizontal_Distance_To_Fire_Points,  
      Wilderness_Area1,  
      Wilderness_Area2,   
      Wilderness_Area3,  
      Wilderness_Area4,  
      soil_type1,
      Soil_Type2,
      Soil_Type3, 
      Soil_Type4, 
      Soil_Type5,  
      Soil_Type6, 
      Soil_Type7,  
      Soil_Type8, 
      Soil_Type9, 
      Soil_Type10 , 
      Soil_Type11,  
      Soil_Type12 , 
      Soil_Type13 ,
      Soil_Type14, 
      Soil_Type15, 
      Soil_Type16,  
      Soil_Type17, 
      Soil_Type18,  
      Soil_Type19,  
      Soil_Type20,  
      Soil_Type21,  
      Soil_Type22,  
      Soil_Type23,  
      Soil_Type24, 
      Soil_Type25,  
      Soil_Type26, 
      Soil_Type27,  
      Soil_Type28,  
      Soil_Type29,  
      Soil_Type30,  
      Soil_Type31, 
      Soil_Type32, 
      Soil_Type33,  
      Soil_Type34, 
      Soil_Type36, 
      Soil_Type37,  
      Soil_Type38,  
      Soil_Type39, 
      Soil_Type40,
      predict_cover_type( Elevation, 
      Aspect,  
      Slope,  
      Horizontal_distance_to_hydrology,  
      Vertical_distance_to_hydrology,   
      Horizontal_distance_to_roadways,  
      HIllshade_9am,  
      Hillshade_noon,  
      Hillshade_3pm , 
      Horizontal_Distance_To_Fire_Points,  
      Wilderness_Area1,  
      Wilderness_Area2,   
      Wilderness_Area3,  
      Wilderness_Area4,  
      soil_type1,
      Soil_Type2,
      Soil_Type3, 
      Soil_Type4, 
      Soil_Type5,  
      Soil_Type6, 
      Soil_Type7,  
      Soil_Type8, 
      Soil_Type9, 
      Soil_Type10,
      Soil_Type11,  
      Soil_Type12, 
      Soil_Type13,
      Soil_Type14, 
      Soil_Type15, 
      Soil_Type16,  
      Soil_Type17, 
      Soil_Type18,  
      Soil_Type19,  
      Soil_Type20,  
      Soil_Type21,  
      Soil_Type22,  
      Soil_Type23,  
      Soil_Type24, 
      Soil_Type25,  
      Soil_Type26, 
      Soil_Type27,  
      Soil_Type28,  
      Soil_Type29,  
      Soil_Type30,  
      Soil_Type31, 
      Soil_Type32, 
      Soil_Type33,  
      Soil_Type34, 
      Soil_Type36, 
      Soil_Type37,  
      Soil_Type38,  
      Soil_Type39, 
      Soil_Type40) AS predicted_cover_type,
      CASE WHEN Wilderness_Area1 = 1 THEN 1
           WHEN Wilderness_Area2 = 1 THEN 2
           WHEN Wilderness_Area3 = 1 THEN 3
           WHEN Wilderness_Area4 = 1 THEN 4
           ELSE 0
      END AS wilderness_area
   
   FROM public.covertype_test)
   t1
   GROUP BY 1, 3
   ORDER BY 2 DESC
   LIMIT 1;
   ```

   이전 작업의 출력은 다음 예시와 비슷할 것입니다.

   ```
   +----------------------+-------+-----------------+
   | predicted_cover_type | count | wilderness_area |
   +----------------------+-------+-----------------+
   |                    2 | 15738 |               1 |
   +----------------------+-------+-----------------+
   ```

## 관련 주제
<a name="tutorial_linear_learner_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))

# Amazon Redshift ML과 Amazon Bedrock의 통합
<a name="machine-learning-br"></a>

이 섹션에서는 Amazon Redshift ML과 Amazon Bedrock의 통합을 사용하는 방법에 대해 설명합니다. 이 기능을 사용하면 SQL을 사용하여 Amazon Bedrock 모델을 간접적으로 호출할 수 있으며 Amazon Redshift 데이터 웨어하우스의 데이터를 사용하여 텍스트 작성, 감정 분석 또는 번역과 같은 생성형 AI 애플리케이션을 구축할 수 있습니다.

**Topics**
+ [Amazon Redshift ML과 Amazon Bedrock의 통합을 위한 IAM 역할 생성 또는 업데이트](#machine-learning-br-iam)
+ [Amazon Redshift ML과 Amazon Bedrock의 통합용 외부 모델 생성](#machine-learning-br-create)
+ [Amazon Redshift ML과 Amazon Bedrock의 통합용 외부 모델 사용](#machine-learning-br-use)
+ [Amazon Redshift ML과 Amazon Bedrock의 통합 시 프롬프트 엔지니어링](#machine-learning-br-prompt)

## Amazon Redshift ML과 Amazon Bedrock의 통합을 위한 IAM 역할 생성 또는 업데이트
<a name="machine-learning-br-iam"></a>

이 섹션에서는 Amazon Redshift ML과 Amazon Bedrock의 통합에 사용할 IAM 역할을 만드는 방법에 대해 보여 줍니다.

Amazon Redshift ML과 Amazon Bedrock의 통합에 사용하는 IAM 역할에 다음 정책을 추가합니다.
+ `AmazonBedrockFullAccess`

Amazon Redshift가 다른 서비스와 상호 작용하는 역할을 맡도록 허용하려면 IAM 역할에 다음의 신뢰 정책을 추가합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "Service": [
               "redshift.amazonaws.com"
            ]
         },
         "Action": "sts:AssumeRole"
      }
   ]
}
```

------

클러스터 또는 네임스페이스가 VPC에 있는 경우 [Amazon Redshift 기계 학습 관리를 위한 클러스터 및 구성 설정](getting-started-machine-learning.md#admin-setup)에 나와 있는 설명을 따릅니다.

더 제한적인 정책이 필요한 경우 다음 페이지에 명시된 Amazon Bedrock 권한만 포함하는 정책을 생성할 수 있습니다.
+ [Amazon Redshift 기계 학습 관리를 위한 클러스터 및 구성 설정](getting-started-machine-learning.md#admin-setup)
+ [Amazon Redshift 기계 학습(ML)을 사용하는 데 필요한 권한](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#iam-permission-ml?)

IAM 역할 생성에 관한 자세한 내용은 *AWS Identity and Access Management 사용 설명서*에 나와 있는 [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html) 섹션을 참조하시기 바랍니다.

## Amazon Redshift ML과 Amazon Bedrock의 통합용 외부 모델 생성
<a name="machine-learning-br-create"></a>

이 섹션에서는 Amazon Redshift 데이터 웨어하우스 내에서 Amazon Bedrock의 인터페이스로 사용할 외부 모델을 생성하는 방법을 보여 줍니다.

Amazon Redshift에서 Amazon Bedrock 모델을 간접적으로 호출하려면 먼저 `CREATE EXTERNAL MODEL` 명령을 실행해야 합니다. 이 명령을 사용하면 데이터베이스에 외부 모델 객체와 Amazon Bedrock을 사용하여 텍스트 콘텐츠를 작성하는 데 사용하는 관련 사용자 함수가 만들어집니다.

다음 코드 예제는 기본 `CREATE EXTERNAL MODEL` 명령을 보여 줍니다.

```
CREATE EXTERNAL MODEL llm_claude
FUNCTION llm_claude_func
IAM_ROLE '<IAM role arn>'
MODEL_TYPE BEDROCK
SETTINGS (
   MODEL_ID 'anthropic.claude-v2:1',
   PROMPT 'Summarize the following text:');
```

`CREATE EXTERNAL MODEL` 명령은 메시지를 지원하는 모든 파운데이션 모델(FM)에 대해 Amazon Bedrock과 일관된 통합 인터페이스를 제공합니다. `CREATE EXTERNAL MODEL` 명령을 사용하거나 요청 유형을 `UNIFIED`로 명시적으로 지정할 경우의 기본 옵션입니다. 자세한 내용은 Amazon Bedrock API 설명서**에 나와 있는 [Converse API 설명서](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)를 참조하시기 바랍니다.

다음 예제에서 설명하듯, FM이 메시지를 지원하지 않는 경우 `request_type` 설정을 `RAW`로 설정해야 합니다. `request_type`을 `RAW`로 설정하면 선택한 FM을 기반으로 추론 함수를 사용할 경우 Amazon Bedrock에 전송된 요청을 구성해야 합니다. 다음 예제를 실행하기 전에 Amazon Bedrock에서 Titan Text G1 – Express 모델에 대한 액세스를 활성화해야 합니다.

```
CREATE EXTERNAL MODEL titan_raw
FUNCTION func_titan_raw
IAM_ROLE '<IAM role arn>'
MODEL_TYPE BEDROCK
SETTINGS (
   MODEL_ID 'amazon.titan-text-express-v1',
   REQUEST_TYPE RAW,
   RESPONSE_TYPE SUPER);
```

총 토큰과 같은 입력 요청에 대한 추가 정보가 필요한 경우 모델을 생성할 때 `RESPONSE_TYPE`을 `super`로 요청할 수 있습니다.

```
CREATE EXTERNAL MODEL patient_recommendations_v2
FUNCTION patient_recommendations_func_v2
IAM_ROLE '<IAM role arn>'
MODEL_TYPE BEDROCK
SETTINGS (
   MODEL_ID 'anthropic.claude-v2',
   PROMPT 'Generate personalized diet plan for following patient:',
   RESPONSE_TYPE SUPER);
```

`CREATE EXTERNAL MODEL` 명령의 `PROMPT` 파라미터는 정적 프롬프트입니다. 애플리케이션에 동적 프롬프트가 필요하면 추론 함수 사용 시 동적 프롬프트를 지정해야 합니다. 자세한 내용은 [Amazon Redshift ML과 Amazon Bedrock의 통합 시 프롬프트 엔지니어링](#machine-learning-br-prompt) 섹션을 참조하세요.

`CREATE EXTERNAL MODEL` 스테이트먼트와 해당 파라미터, 설정에 대한 자세한 내용은 [CREATE EXTERNAL MODEL](r_create_external_model.md) 섹션을 참조하시기 바랍니다.

## Amazon Redshift ML과 Amazon Bedrock의 통합용 외부 모델 사용
<a name="machine-learning-br-use"></a>

이 섹션에서는 외부 모델을 간접적으로 호출하여 제공된 프롬프트에 대한 응답으로 텍스트를 작성하는 방법을 보여 줍니다. 외부 모델을 간접적으로 호출하려면 `CREATE EXTERNAL MODEL`로 생성한 추론 함수를 사용합니다.

**Topics**
+ [`UNIFIED` 요청 유형 모델로 추론](#machine-learning-br-use-unified)
+ [`RAW` 요청 유형 모델로 추론](#machine-learning-br-use-raw)
+ [리더 전용 함수로서의 추론 함수](#machine-learning-br-use-leader)
+ [추론 함수 사용 정보](#machine-learning-br-use-usage)

### `UNIFIED` 요청 유형 모델로 추론
<a name="machine-learning-br-use-unified"></a>

`UNIFIED` 요청 유형이 있는 모델의 추론 함수에는 함수에 전달되는 다음 3가지 파라미터가 순서대로 포함됩니다.
+ **입력 텍스트**(필수): 이 파라미터는 Amazon Redshift가 Amazon Bedrock에 전달하는 입력 텍스트를 지정합니다.
+ **추론 구성** 및 **추가 모델 요청 필드**(선택 사항): Amazon Redshift는 이러한 파라미터를 Converse 모델 API의 해당 파라미터에 전달합니다.

다음 코드 예제는 `UNIFIED` 유형 추론 함수를 사용하는 방법을 보여 줍니다.

```
SELECT llm_claude_func(input_text, object('temperature', 0.7, 'maxtokens', 500))
   FROM some_data;
```

### `RAW` 요청 유형 모델로 추론
<a name="machine-learning-br-use-raw"></a>

`RAW` 요청 유형이 있는 모델의 추론 함수에는 `SUPER` 데이터 유형의 파라미터가 하나만 포함됩니다. 이 파라미터의 구문은 사용된 Amazon Bedrock 모델에 따라 달라집니다.

다음 코드 예제는 `RAW` 유형 추론 함수를 사용하는 방법을 보여 줍니다.

```
SELECT llm_titan_func(
    object(
        "inputText", "Summarize the following text: " | input_text,
        "textGenerationConfig", object("temperature", 0.5, "maxTokenCount", 500)
    )
)
FROM some_data;
```

### 리더 전용 함수로서의 추론 함수
<a name="machine-learning-br-use-leader"></a>

Amazon Bedrock 모델의 추론 함수는 이를 사용하는 쿼리가 테이블을 참조하지 않을 때 리더 노드 전용 함수로 실행될 수 있습니다. 이는 LLM에 빠르게 질문하려는 경우에 유용할 수 있습니다.

다음 코드 예제는 리더 전용 추론 함수를 사용하는 방법을 보여 줍니다.

```
SELECT general_titan_llm_func('Summarize the benefits of LLM on data analytics in 100 words');
```

### 추론 함수 사용 정보
<a name="machine-learning-br-use-usage"></a>

Amazon Redshift ML과 Amazon Bedrock의 통합으로 추론 함수를 사용할 때 다음 사항을 참고하시기 바랍니다.
+ 모든 Amazon Bedrock 모델의 파라미터 이름은 대문자와 소문자를 구분합니다. 파라미터가 모델에 필요한 파라미터와 일치하지 않으면 Amazon Bedrock에서는 조용히 파라미터를 무시할 수 있습니다.
+ 추론 쿼리의 처리량은 Amazon Bedrock이 제공하는 다양한 모델의 런타임 할당량에 따라 다른 리전에서 제한됩니다. 자세한 내용은 *Amazon Bedrock 사용자 가이드*에 나와 있는 [Amazon Bedrock 할당량](https://docs.aws.amazon.com/bedrock/latest/userguide/quotas.html)을 참조하시기 바랍니다.
+ 안정적이고 일관된 처리량이 필요한 경우 Amazon Bedrock에서 필요한 모델의 프로비저닝 처리량을 가져오는 것이 좋습니다. 자세한 내용은 *Amazon Bedrock 사용자 가이드*에 나와 있는 [Increase model invocation capacity with Provisioned Throughput in Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/prov-throughput.html)을 참조하시기 바랍니다.
+ 대량 데이터가 포함된 추론 쿼리에서는 스로틀링 예외가 발생할 수도 있습니다. 이는 Amazon Bedrock의 런타임 할당량이 제한되어 있기 때문입니다. Amazon Redshift는 요청을 여러 번 재시도하지만, 프로비저닝되지 않은 모델의 처리량이 가변적일 수 있으므로 쿼리는 여전히 스로틀링될 수 있습니다.
+ 소량의 데이터라도 `Too many requests, please wait before trying again.`과 같이 Amazon Bedrock에서 발생하는 스로틀링 예외가 있는 경우 Amazon Bedrock 계정의 **Service Quotas**에서 할당량을 확인합니다. 적용된 계정 수준 할당량이 사용 중인 모델의 **InvokeModel** 요청에 대한 AWS 기본 할당량 값과 적어도 동일한지 확인합니다.

## Amazon Redshift ML과 Amazon Bedrock의 통합 시 프롬프트 엔지니어링
<a name="machine-learning-br-prompt"></a>

이 섹션에서는 외부 모델에서 정적 프롬프트를 사용하는 방법을 보여 줍니다.

외부 모델에 정적 접두사 및 접미사 프롬프트를 사용하려면 `CREATE EXTERNAL MODEL` 스테이트먼트에서 `PROMPT` 및 `SUFFIX` 파라미터를 사용하여 제공합니다. 이러한 프롬프트는 외부 모델을 사용하여 모든 쿼리에 추가됩니다.

다음 예제에서는 외부 모델에 접두사 및 접미사 프롬프트를 추가하는 방법을 보여 줍니다.

```
CREATE EXTERNAL MODEL llm_claude
FUNCTION llm_claude_func
IAM_ROLE '<IAM role arn>'
MODEL_TYPE BEDROCK
SETTINGS (
   MODEL_ID 'anthropic.claude-v2:1',
   PROMPT 'Summarize the following text:',
   SUFFIX 'Respond in an analytic tone');
```

동적 프롬프트를 사용하려면 추론 함수 사용 시 함수 입력에 이를 연결하여 제공할 수 있습니다. 다음 예제에서는 추론 함수와 함께 동적 프롬프트를 사용하는 방법을 보여 줍니다.

```
SELECT llm_claude_func('Summarize the following review:' | input_text | 'The review should have formal tone.')
FROM some_data
```