

 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 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 Bedrock と Amazon Redshift の連携については、「[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 に関するよくある質問](https://aws.amazon.com/bedrock/faqs/)

**注記**  
 LLM は、不正確または不完全な情報を生成する可能性があります。LLM が生成する情報を検証して、正確性と完全性を確認することをお勧めします。

**Amazon Redshift ML と 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/ja_jp/redshift/latest/dg/images/machine_learning_overview.png)


一般的なワークフローは次のとおりです。

1. Amazon Redshift は、トレーニングデータを Amazon S3 にエクスポートします。

1. Amazon SageMaker AI Autopilot がトレーニングデータを前処理します。*前処理*では、欠損値の補完などの重要な機能を担います。特定の列がカテゴリ (郵便番号など) であることを認識し、トレーニング用に適切にフォーマットし、他の多くのタスクを実行します。トレーニングデータセットに最適なプリプロセッサを選ぶこと自体が 1 つの課題ですが、Amazon SageMaker AI Autopilot はその解決を自動化します。

1. Amazon SageMaker AI Autopilot が、最も予測精度の高いモデルを実現するアルゴリズムとアルゴリズムハイパーパラメータを見つけます。

1. Amazon Redshift は、予測関数を SQL 関数として Amazon Redshift クラスターに登録します。

1. CREATE MODEL ステートメントを実行すると、Amazon Redshift はトレーニングに Amazon SageMaker AI を使用します。したがって、モデルのトレーニングには関連するコストがかかります。これは、AWS の請求書に Amazon SageMaker AI の明細項目として別途記載されます。また、トレーニングデータを保存するために Amazon S3 で使用されるストレージについてもお支払いいただきます。Redshift クラスター上でコンパイルと実行が可能な、CREATE MODEL で作成されたモデルを使用した推論に対しては課金されません。Amazon Redshift ML を使用する場合 Amazon Redshift の追加料金は発生しません。

**Topics**
+ [Machine Learning の概要](machine_learning_overview.md)
+ [初心者やエキスパート向けの Machine Learning](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)

# Machine Learning の概要
<a name="machine_learning_overview"></a>

Amazon Redshift では、機械学習機能を活用して、データから貴重なインサイトを得ることができます。この機械学習 (ML) の概要では、ML モデルのトレーニングとデプロイのためにデータを調査、視覚化、準備する方法について説明します。以下のセクションでは、Amazon Redshift ML を使用し、機械学習を通じてデータの可能性を引き出すプロセスについて説明します。

Amazon Redshift ML を使用すると、SQL ステートメントを使用して機械学習モデルをトレーニングし、予測のために SQL クエリでそれらを呼び出すことができます。

Amazon Redshift ML の使用方法については、以下の動画をご覧ください。

[![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 クラスターまたは Serverless ワークグループをセットアップするための前提条件、アクセス許可、Amazon Redshift ML を使用するための所有権については、以下のセクションを参照してください。これらのセクションでは、Amazon Redshift ML での簡単なトレーニングと予測の仕組みについても説明します。

## 機械学習による問題解決のしくみ
<a name="solve_problem"></a>

機械学習モデルは、トレーニングデータでパターンを見つけ、これらのパターンを新しいデータに適用することで予測を生成します。機械学習では、データを最もよく説明するパターンを学習することで、これらのモデルをトレーニングします。その後、モデルを使用して新しいデータを予測します (推論とも呼ぶ)。機械学習は通常、パラメータを変更し、トレーニングデータを改善することによって予測の精度を継続的に向上させることができる反復的なプロセスです。データが変更されると、新しいデータセットを使用して新しいモデルを再トレーニングします。

さまざまなビジネス目標に対応するために、さまざまな基本的な機械学習アプローチがあります。

### Amazon Redshift 機械学習での教師あり学習
<a name="supervised_learning"></a>

Amazon Redshift は、高度なエンタープライズ分析への最も一般的なアプローチである教師あり学習をサポートしています。教師あり学習は、確立されたデータセットがあり、特定の入力データがさまざまなビジネス成果を予測する方法を理解している場合に、好ましい機械学習アプローチです。これらの結果は、ラベルと呼ばれることもあります。特に、データセットは、特徴 (入力) とターゲット (出力) で構成される属性を持つテーブルです。たとえば、過去と現在の顧客の年齢と郵便番号を記載したテーブルがあるとします。また、現在の顧客に対しては true、メンバーシップを停止した顧客に対しては false という「アクティブ」フィールドもあるとします。教師あり機械学習の目的は、ターゲットが「False」である顧客によって表される、カスタマーチャーンにつながる年齢と郵便番号のパターンを見つけることです。このモデルを使用して、メンバーシップの一時停止など、解約する可能性が高く、保持インセンティブを提供する可能性のある顧客を予測できます。

Amazon Redshift は、回帰、バイナリ分類、およびマルチクラス分類を含む教師あり学習をサポートします。回帰とは、顧客の総支出など、連続値を予測する問題を指します。バイナリ分類は、顧客が解約するかどうかを予測するなど、2 つの結果のうちの 1 つを予測する問題を指します。マルチクラス分類とは、顧客が関心を持つ可能性のある項目を予測するなど、多くの結果の 1 つを予測する問題を指します。データアナリストとデータサイエンティストは、これを使用して教師あり学習を実行し、予測、パーソナライゼーション、顧客解約の予測などの問題に取り組むことができます。また、締結しそうな売買の予測、収益予測、不正検出、顧客の生涯価値予測などの問題のためにも、教師あり学習を使用できます。

### Amazon Redshift 機械学習での教師なし学習
<a name="unsupervised_learning"></a>

教師なし学習では、機械学習アルゴリズムを使用して、ラベル付けされていないトレーニングデータの分析とグループ化を行います。このアルゴリズムでは、隠れたパターンやグループを検出します。教師なし学習の目標は、データの基礎となる構造や分布をモデル化して、データの詳細を明らかにすることです。

Amazon Redshift は、教師なし学習での問題に対応するために、K-Means によるクラスタリングアルゴリズムをサポートしています。このアルゴリズムは、データ内でグループを検出する際にクラスタリングで発生する問題を解決します。K-Means アルゴリズムは、データ内にある離散群の検出を試みます。未分類のデータについては、その類似点と相違点に基づいたグループ分けと分割が行われます。グループ化によって、K-Means アルゴリズムは最適な重心を反復的に決定し、各メンバーを最も近い重心に割り当てます。最も近い重心が同じである各メンバーは、同じグループに属します。1 つのグループには、可能な限り互いに類似した (かつ、他のグループのメンバーとは可能な限り相違する) メンバーが集められます。例えば、パンデミックの影響を受けた都市を分類したり、消費者製品の人気に基づいて都市を分類したりするために、K-Means クラスタリングアルゴリズムを使用できます。

K-Means アルゴリズムを使用する場合は、入力として `k` を指定します。これにより、データ内で検索しようとするクラスターの数を指定します。このアルゴリズムは k 個の重心を出力します。各データポイントは、k 個のクラスターの内で最も近方の 1 つに属します。各クラスターは、その重心によって表現されます。1 つの重心は、クラスターの多次元平均と考えることができます。K-Means アルゴリズムは、クラスター間の距離を比較して、互いにどの程度異なっているかを評価します。一般に、距離が大きいほどクラスター間の相違が大きいことを意味します。

K-Means では、モデルの特徴が同じスケールにとどまることや、信頼性の高い結果が求められるため、データの前処理は重要です。Amazon Redshift では CREATE MODEL ステートメント用として、StandardScaler、MinMax、NumericPassthrough など、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 ML の概念の一部を説明するために使用されます。
+ Amazon Redshift の*機械学習*は、1 つの SQL コマンドでモデルをトレーニングします。Amazon Redshift ML と Amazon SageMaker AI は、データ変換、アクセス許可、リソース使用量、適切なモデルの検出をすべて管理します。
+ *トレーニング*は、Amazon Redshift が指定されたデータのサブセットをモデルに実行することにより、機械学習モデルを作成するフェーズです。Amazon Redshift は、Amazon SageMaker AI でトレーニングジョブを自動的に開始し、モデルを生成します。
+ *予測* (*推論*とも言う) とは、Amazon Redshift SQL クエリでモデルを使用して結果を予測することです。推論時に、Amazon Redshift はより大きなクエリの一部としてモデルベースの予測関数を使用して予測を生成します。予測は Amazon Redshift クラスターでローカルに計算されるため、高いスループットと低レイテンシーを実現し、追加コストなしで利用できます。
+ *Bring Your Own Model (BYOM)* では、Amazon Redshift の外部で Amazon SageMaker AI を使用してトレーニングされたモデルを使用し、Amazon Redshift でローカルにデータベース内推論を実行できます。Amazon Redshift ML では、ローカル推論での BYOM の使用がサポートされています。
+ *ローカル推論*は、モデルが Amazon SageMaker AI で事前トレーニングされ、Amazon SageMaker AI Neo によってコンパイルされ、Amazon Redshift ML でローカライズされる場合に使用されます。ローカル推論でサポートされているモデルを Amazon Redshift にインポートするには、CREATE MODEL コマンドを使用します。Amazon Redshift は Amazon SageMaker AI Neo を呼び出して、事前にトレーニングされた SageMaker AI モデルをインポートします。そこでモデルをコンパイルし、コンパイルされたモデルを Amazon Redshift にインポートします。ローカル推論を使用して、高速化と低コストを実現します。
+ *リモート推論*は、SageMaker AI にデプロイされたモデルエンドポイントを Amazon Redshift が呼び出す場合に使用されます。リモート推論では、あらゆるタイプのカスタムモデルと深層学習モデル (Amazon SageMaker AI で構築およびデプロイした TensorFlow モデルなど) を柔軟に呼び出すことができます。

また、次の点も重要です。
+ *Amazon SageMaker AI* は、フルマネージド型の機械学習サービスです。Amazon SageMaker AI では、データサイエンティストとデベロッパーが簡単にモデルの構築とトレーニングを簡単に行い、本番稼働のホスト環境に直接デプロイできます。Amazon SageMaker AI の詳細については、「*Amazon SageMaker AI デベロッパーガイド*」の「[What is Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html)」を参照してください。
+ *Amazon SageMaker AI Autopilot* は、お手元のデータに基づいて、分類または回帰に最適な機械学習モデルを自動的にトレーニングおよびチューニングする機能セットです。ユーザーは、このための完全な制御性と可視性を維持します。Amazon SageMaker AI Autopilot は、表形式の入力データに対応しています。データのクリーニングと前処理を自動で行い、線形回帰、二項分類、多クラス分類に適したアルゴリズムを自動選定します。また、ハイパーパラメータの自動最適化 (HPO)、ディストリビューショントレーニング、自動インスタンス、クラスターサイズの選択もサポートしています。Amazon SageMaker AI Autopilot の詳細については、「*Amazon SageMaker AI デベロッパーガイド*」の「[Automate model development with Amazon SageMaker AI Autopilot](https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-automate-model-development.html)」を参照してください。
+ *Amazon Bedrock* は、AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI、Amazon などの主要な AI 企業から、生成 AI アプリケーションの構築に必要な幅広い機能とともに、高性能の基盤モデル (FM) を単一の API で提供するフルマネージドサービスです。

# 初心者やエキスパート向けの Machine Learning
<a name="novice_expert"></a>

Amazon Redshift では、機械学習 (ML) 機能を活用して、ユーザーが初心者であるか ML の専門家であるかにかかわらず、データからインサイトを得ることができます。機械学習は、広範な ML の専門知識や複雑なデータエンジニアリングを必要とすることなく、SQL コマンドを使用して ML モデルを作成、トレーニング、デプロイできる Amazon Redshift の機能です。

以下のセクションでは、Amazon Redshift でデータが持つすべての可能性を引き出すための、機械学習の活用プロセスについて説明します。

Amazon Redshift ML では、1 つの SQL CREATE MODEL コマンドを使用してモデルをトレーニングできます。CREATE MODEL コマンドは、使い慣れた SQL 構造を使用してモデルベースの予測を生成するために Amazon Redshift が使用するモデルを作成します。

Amazon Redshift ML は、機械学習、ツール、言語、アルゴリズム、API の専門知識がない場合に特に役立ちます。Amazon Redshift ML を使用すると、外部の機械学習サービスとの統合に必要な、差別化されていない重労働を実行する必要がありません。Amazon Redshift を使用すると、データのフォーマットと移動および許可コントロールの管理、ならびにカスタム統合やワークフローそしてスクリプトの構築などにかかる時間を節約できます。一般的な機械学習アルゴリズムを簡単に使用して、トレーニングから予測まで頻繁に繰り返す必要があるトレーニングのニーズを簡素化できます。Amazon Redshift は自動的に最適なアルゴリズムを検出し、問題に最適なモデルをチューニングします。Amazon Redshift からデータを移動したり、別のサービスとやり取りして料金を支払ったりすることなく、Amazon Redshift クラスター内から予測を行うことができます。

Amazon Redshift ML は、データアナリストとデータサイエンティストによる機械学習の使用をサポートします。また、知識を持つ機械学習の専門家であれば、指定した側面のみを使用するように、CREATE MODEL ステートメントに指示することもできます。これにより、CREATE MODEL が最適な候補を検索するためや、モデルの精度を向上させるために必要な時間も短縮できます。

CREATE MODEL ステートメントは、トレーニングジョブにパラメータを指定する方法に柔軟性を加えます。この柔軟性により、機械学習の初心者やエキスパートのどちらでも、好みのプリプロセッサ、アルゴリズム、問題の種類、またはハイパーパラメータを選択できるようになります。たとえば、顧客離れに関心のあるユーザーは、顧客離れに適した問題の種類として、バイナリ分類を CREATE MODEL ステートメントに対し指定できます。次に、CREATE MODEL ステートメントは、最適なモデルの検索をバイナリ分類モデルに絞り込みます。ユーザーが問題の種類を選択した場合でも、CREATE MODEL ステートメントで使用できるオプションはたくさんあります。たとえば、CREATE MODEL は最適な前処理変換を検出して適用し、最適なハイパーパラメータの設定を検出します。

Amazon Redshift ML は、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 リファレンス*」の「[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 では、その他の特徴の処理に最適なプリプロセッサや、最適なハイパーパラメータの検出も継続して実行します。トレーニングパイプラインの 1 つ以上の側面を制限するための詳細方法については、「[ユーザーガイダンス付きの 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)」を参照してください。
+ *データエンジニア*は、事前にトレーニングされた XGBoost モデルを Amazon SageMaker AI に取り込み、Amazon Redshift にインポートして、ローカル推論に使用できます。Bring Your Own Model (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 ML ユーザーは、次のオプションのいずれかを選択して、モデルをトレーニングおよびデプロイできます。
+ 問題の種類については、「[ユーザーガイダンス付きの 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 の使用に関連するコストについて説明し、強力な機械学習統合を活用しながら、コストを計画し最適化する方法について説明します。

## Amazon Redshift ML と SageMaker AI を使用するためのコスト
<a name="cost_sm"></a>

SageMaker AI を使用した Amazon Redshift ML では、既存のクラスターリソースを予測に使用するため、Amazon Redshift で別途料金が発生することはありません。モデルの作成または使用に対しては、追加の Amazon Redshift の料金は発生しません。予測は Redshift クラスター内でローカルに実行されるため、クラスターのサイズを変更する必要がない限り追加料金は発生しません。ただし、Amazon Redshift ML はモデルのトレーニングに 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 ML は SageMaker AI Autopilot を使用して、さまざまなモデル (または候補) を自動的かつインテリジェントに探索し、最適なモデルを見つけます。MAX\$1RUNTIME は、費やされる時間と計算の量を制限します。MAX\$1RUNTIME の設定が低すぎると、候補が 1 つでも探索するのに十分な時間がない可能性があります。「Autopilot の候補にモデルがありません」というエラーが表示された場合は、MAX\$1RUNTIME の値を大きくして CREATE MODEL を再実行してください。このパラメータの詳細については、「*Amazon SageMaker API リファレンス*」の「[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 を減らすと、CREATE MODEL の SELECT クエリの結果の行数が減ります。これらの行を Amazon Redshift がエクスポートし、モデルのトレーニングのために SageMaker AI に送信します。したがって、MAX\$1CELLS を減らすと、AUTO ON と AUTO OFF の両方でモデルをトレーニングするために使用されるデータセットのサイズが小さくなります。このアプローチは、モデルのトレーニングにかかるコストと時間を削減する場合に役に立ちます。特定のトレーニングジョブのトレーニングと請求時間に関する情報を表示するには、Amazon SageMaker AI で **[トレーニングジョブ]** を選択します。

MAX\$1RUNTIME と MAX\$1CELLS を増やすと、SageMaker AI がより多くの候補を試せるため、たいていはモデルの品質が向上します。この場合、SageMaker AI が各候補モデルのトレーニングに費やす時間が増え、より多くのデータでトレーニングを行うので、質の高いモデルになります。データセットの反復または探索を高速化したい場合は、MAX\$1RUNTIME および MAX\$1CELLS を小さくしてください。モデルの精度を向上させたい場合は、より高い MAX\$1RUNTIME および MAX\$1CELLS を使用してください。

さまざまなセル番号に関連するコストと無料トライアルの詳細については、[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 ML を使用すると、SQL ユーザーは、使い慣れた SQL コマンドを使用して、機械学習モデルを簡単に作成、トレーニング、デプロイできます。Amazon Redshift ML では、Redshift クラスター内のデータを使用して、Amazon SageMaker AI でモデルをトレーニングできます。その後、モデルはローカライズされ、Amazon Redshift データベース内で予測が行われます。Amazon Redshift ML は現在、機械学習アルゴリズム XGBoost (AUTO ON および AUTO OFF) と多層パーセプトロン (AUTO ON)、K-Means (AUTO OFF)、線形学習をサポートしています。

**Topics**
+ [Amazon Redshift ML 管理者によるクラスターと設定のセットアップ](#admin-setup)
+ [Amazon Redshift 機械学習でのモデルの説明可能性の使用](#clarify)
+ [Amazon Redshift ML 確率メトリクス](#probability_metrics)

## Amazon Redshift ML 管理者によるクラスターと設定のセットアップ
<a name="admin-setup"></a>

Amazon Redshift ML で作業する前に、クラスターの設定を完了し、Amazon Redshift ML を使用するためのアクセス許可を設定します。

### Amazon Redshift ML を使用するためのクラスターの設定
<a name="cluster-setup"></a>

Amazon Redshift ML を使用する前に、以下の前提条件を満たしてください。

Amazon Redshift でプロビジョニングされたクラスターを使用するには、Amazon Redshift の管理者は、次の 1 回限りのセットアップを行う必要があります。Amazon Redshift Serverless で Amazon Redshift ML を使用するには、「[Amazon Redshift Serverless データウェアハウスの使用を開始](https://docs.aws.amazon.com/redshift/latest/gsg/new-user-serverless.html)」を参照してください。

Amazon Redshift ML のワンタイムクラスターセットアップを実行するには 

1. AWS マネジメントコンソール または AWS Command Line Interface (AWS CLI) を使用して、Redshift クラスターを作成します。クラスターの作成時には、必ずAWS Identity and Access Management (IAM) ポリシーをアタッチするようにしてください。Amazon Redshift ML で Amazon SageMaker AI を利用するために必要なアクセス許可の詳細については、「[Amazon Redshift でのアイデンティティベースのポリシー (IAM ポリシー) の使用](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#iam-permission-ml?)」を参照してください。

1. 以下のいずれかの方法で Amazon Redshift ML を使用するために必要な IAM ロールを作成します。
   + Amazon Redshift ML で SageMaker AI を使用するには、`AmazonS3FullAccess` ポリシーと `AmazonSageMakerFullAccess` ポリシーをアタッチした IAM ロールを作成します。Forecast モデルも作成する予定がある場合は、ロールにも `AmazonForecastFullAccess` ポリシーを添付してください。
   + Amazon Redshift ML で Amazon Bedrock を使用するには、`AmazonS3FullAccess` ポリシーと `AmazonBedrockFullAccess` ポリシーを持つ IAM ロールを作成します。
   + IAM ロールを作成する際は、CREATE MODEL など SQL コマンドの実行が許可された `AmazonRedshiftAllCommandsFullAccess` ポリシーを持つ、Amazon Redshift コンソールを使用することをお勧めします。Amazon Redshift は、シームレスな API ベースのメカニズムを使用して、AWS アカウント 内でユーザーに代わりプログラム的に IAM ロールを作成します。Amazon Redshift は、既存の AWS 管理ポリシーを IAM ロールに自動的にアタッチします。このアプローチにより、ロール作成のために IAM コンソールに切り替える必要はなくなり、作業を Amazon Redshift コンソール内で完了できます。詳細については、「[Creating an IAM role as default for Amazon Redshift](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 ML の使用中に 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 SageMaker AI に送信されたトレーニングデータを保存し、トレーニング済みのモデルを Amazon SageMaker AI から受信するために、Amazon Redshift が使用します。

1. (オプション) さまざまなユーザーグループへのアクセスを制御するために、IAM ロールと Amazon S3 バケットのさまざまな組み合わせを作成します。

1. 拡張 VPC ルーティングを有効にすると、Redshift ML と S3 バケット間のトラフィックはプライベート VPC を経由するようになります。VPC ルーティングの詳細については、「[Amazon Redshift の拡張 VPC ルーティング](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 ステートメントを使用して、さまざまなユースケースモデルの作成を開始する方法については、「[モデルを作成する](r_CREATE_MODEL.md)」を参照してください。

### 許可と所有権の管理
<a name="permissions-ownership"></a>

Amazon Redshift はテーブルや関数などの他のデータベースオブジェクトと同様に、機械学習モデルの作成と使用をバインドし、制御メカニズムにアクセスします。予測関数を実行するモデルの作成に関しては、個別の許可があります。

次の例では、`retention_analyst_grp`(モデルクリエーター) と`marketing_analyst_grp`(モデルユーザー)の 2 つのユーザーグループを使用して、Amazon Redshift がアクセス制御を管理する方法を示します。この retention analyst は、他のユーザーセットが取得した許可を通じて使用できる機械学習モデルを作成します。

スーパーユーザーは、次のステートメントを使用して、USER または GROUP に機械学習モデルを作成するための許可を GRANT (付与) できます。

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

この許可を持つユーザーまたはグループは、クラスター内で任意のスキーマのモデルを作成できます (ユーザーが SCHEMA に対する通常の CREATE 許可を持っている場合)。機械学習モデルは、テーブル、ビュー、プロシージャ、およびユーザー定義関数と同様にスキーマ階層の一部です。

スキーマ `demo_ml` がすでに存在すると仮定して、次のように 2 つのユーザーグループにスキーマに対する許可を付与します。

```
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\$1analst\$1grp GROUP に付与します。

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

ユーザーまたはグループからこれらの許可を取り消すには、CREATE MODEL および EXECUTE とともに REVOKE ステートメントを使用します。アクセス許可のコントロールコマンドの詳細については、「[GRANT](r_GRANT.md)」および「[REVOKE](r_REVOKE.md)」を参照してください。

## Amazon Redshift 機械学習でのモデルの説明可能性の使用
<a name="clarify"></a>

Amazon Redshift 機械学習 のモデルの説明可能性では、特徴量の重要度の値を使用して、トレーニングデータの各属性が予測結果にどのように寄与するかを理解することができます。

モデルの説明可能性は、モデルの予測を説明することで、機械学習 (ML) モデルの改善に役立ちます。モデルの説明可能性は、これらのモデルが特徴属性アプローチを使用してどのように予測するかを説明するのに役立ちます。

Amazon Redshift機械学習 には、モデルの説明機能が組み込まれており、モデルの説明機能が Amazon Redshift 機械学習 ユーザーに提供されます。モデルの説明可能性の詳細については、「*Amazon SageMaker AI デベロッパーガイド*」の「[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 は自動的に 2 つ目の推論関数を作成します。これを使用して、各ラベルに対する確率を出力できます。この 2 番目の推論関数の名前は、指定した推論関数名の後に文字列 `_probabilities` が続くものです。たとえば、推論関数に `customer_churn_predict` という名前を付けると、2 番目の推論関数の名前は `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
```

 次の例では、顧客が解約する可能性が高いことを示す 0.7 を超える確率の `True` ラベルが付いたすべての行が返されます。

```
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 の機械学習は、1 つの SQL コマンドでモデルをトレーニングします。Amazon Redshift は、Amazon SageMaker AI でトレーニングジョブを自動的に開始し、モデルを生成します。モデルが作成されると、そのモデルの予測関数を使用して Amazon Redshift で予測を実行できます。

これらのチュートリアルのステップに従って、Amazon Redshift ML の特徴について学習します。
+ [チュートリアル: カスタマーチャーンモデルの構築](tutorial_customer_churn.md) - このチュートリアルでは、Amazon Redshift ML を使用して CREATE MODEL コマンドでカスタマーチャーンモデルを作成し、ユーザーシナリオの予測クエリを実行します。次に、CREATE MODEL コマンドが生成する SQL 関数を使用してクエリを実装します。
+ [チュートリアル: K-means クラスタリングモデルの構築](tutorial_k-means_clustering.md) - このチュートリアルでは、Amazon Redshift ML を使用して、[K-means アルゴリズム](url-sm-dev;k-means.html)に基づく機械学習モデルを作成、トレーニングおよびデプロイします。
+ [チュートリアル: 複数クラス分類モデルの構築](tutorial_multi-class_classification.md) - このチュートリアルでは、Amazon Redshift ML を使用して、複数クラス分類の問題を解決する機械学習モデルを作成します。多クラス分類アルゴリズムは、データポイントを 3 つ以上のクラスのいずれかに分類します。次に、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 ML 管理者によるクラスターと設定のセットアップ](https://docs.aws.amazon.com/redshift/latest/dg/admin-setup.html)」のドキュメントを使用します。
+ モデルの作成に使用する Amazon Redshift クラスターと、トレーニングデータを使用し、モデルアーティファクトのステージングを保管する Amazon S3 バケットは、同じ AWS リージョンに置かれている必要があります。
+ このドキュメントで使用されている SQL コマンドおよびサンプルデータセットをダウンロードするには、次のいずれかの操作を行います。
  + [[SQL commands (SQL コマンド)](https://s3.amazonaws.com/redshift-downloads/redshift-ml/tutorial-scripts/redshift-ml-tutorial.sql)]、[[Customer activity file (顧客のアクティビティファイル)](https://s3.amazonaws.com/redshift-downloads/redshift-ml/customer_activity/customer_activity.csv)]、および [[Abalone file (アワビファイル)](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 オペレーションが予測する方法を学習するために使用する機械学習ラベルである列を指定します。ターゲット列の「churn」は、顧客がまだ有効なメンバーシップを持っているか、メンバーシップを一時停止しているかを示します。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-S3 を使用して暗号化されます。

入力に対し、AWS KMS マネージドキーを使用したサーバー側の暗号化 (SSE-KMS) が行われている場合は、次のアクセス許可を追加します。

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

Amazon SageMaker AI のロールの詳細については、「*Amazon SageMaker AI デベロッパーガイド*」の「[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 年 1 月 1 日より前のデータでモデルをトレーニングしたので、テストセットで予測関数を使用します。例えば、次のクエリは、2020 年 1 月 1 日以降にサインアップしたカスタマーが、解約するかどうかを予測します。

   ```
   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 年 1 月 1 日以降のさまざまな州からのカスタマーにおいて、解約者と非解約者の割合を予測します。

   ```
   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 年 1 月 1 日より後の場合の解約率を予測します。

   ```
   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 ML 機械学習を使用するためのコスト](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)
+ [CREATE MODEL コマンド](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_MODEL.html)
+ [EXPLAIN\$1MODEL 関数](https://docs.aws.amazon.com/redshift/latest/dg/r_explain_model_function.html)

機械学習の詳細については、以下のドキュメントを参照してください。
+ [機械学習の概要](https://docs.aws.amazon.com/redshift/latest/dg/machine_learning_overview.html)
+ [初心者やエキスパート向けの機械学習](https://docs.aws.amazon.com/redshift/latest/dg/novice_expert.html)
+ [機械学習予測の公平性とモデルの説明可能性とは](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html)

# チュートリアル: K-means クラスタリングモデルの構築
<a name="tutorial_k-means_clustering"></a>

このチュートリアルでは、Amazon Redshift ML を使用して、[k-means アルゴリズム](url-sm-dev;k-means.html)に基づく機械学習モデルを作成、トレーニングおよびデプロイします。このアルゴリズムは、データ内でグループを検出する際にクラスタリングで発生する問題を解決します。K-means は、まだラベル付けされていないデータのグループ化に役立ちます。K-means クラスタリングの詳細については、「Amazon SageMaker AI デベロッパーガイド」の「[K-means クラスタリングの仕組み](https://docs.aws.amazon.com/sagemaker/latest/dg/algo-kmeans-tech-notes.html)」を参照してください。

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

このチュートリアルでは、K-means を[イベント、言語、トーンのグローバルデータベース (GDELT)](https://aws.amazon.com/public-datasets/gdelt/) データセットで使用し、世界中のニュースを監視して、データを日々秒単位で保存します K-means は、似たようなトーン、俳優、または場所のイベントをグループ化します。データは、Amazon Simple Storage Service の 2 つの異なるフォルダに複数のファイルで保存されます。フォルダは、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-Means アルゴリズムは最適なクラスター中心を反復的に決定します。次に、アルゴリズムは各データポイントを最も近いクラスター中心に割り当てます。最も近い中心が同じである各メンバーは、同じグループに属します。1 つのグループには、可能な限り互いに類似した (かつ、他のグループのメンバーとは可能な限り相違する) メンバーが集められます。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>

次のクエリを使用して、5 番目のクラスターに割り当てられたポイントのデータを返します。選択した記事には 2 人の俳優が含まれている必要があります。

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

次のクエリは、肯定的なトーンのイベントについて書かれた記事数を係数します。また、このクエリでは、2 人の俳優の民族コードが同じである必要があり、各イベントが割り当てられているクラスターが返されます。

```
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)
+ [機械学習予測の公平性とモデルの説明可能性とは](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html)

# チュートリアル: 複数クラス分類モデルの構築
<a name="tutorial_multi-class_classification"></a>

このチュートリアルでは、Amazon Redshift ML を使用して、複数クラス分類の問題を解決する機械学習モデルを作成します。多クラス分類アルゴリズムは、データポイントを 3 つ以上のクラスのいずれかに分類します。次に、CREATE MODEL コマンドが生成する SQL 関数を使用してクエリを実装します。

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

このチュートリアルでは、パブリックデータセットの [E-Commerce Sales Forecast](https://www.kaggle.com/allunia/e-commerce-sales-forecast) を使用します。これには、英国のオンライン小売業者の販売データが含まれます。生成するモデルは、特別なカスタマーロイヤルティプログラムで最もアクティブなカスタマーをターゲットにします。多クラス分類では、このモデルを使用して、カスタマーが 13 か月間でアクティブになる月数を予測できます。予測機能は、プログラムへの加入期間が 7 か月以上続くと予測されるカスタマーを指定します。

## ユースケースの例
<a name="tutorial_multi-class_classification_tasks"></a>

Amazon Redshift ML では、製品ラインからベストセラー製品を予測するなど、その他の多クラス分類の問題を解決できます。また、リンゴ、ナシ、オレンジの選択など、画像に含まれる果物を予測することもできます。

**タスク**
+ 前提条件
+ ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする
+ ステップ 2: 機械学習モデルを作成する
+ ステップ 3: モデルを使用して予測を実行する

## 前提条件
<a name="tutorial_multi-class_classification_prereqs"></a>

このチュートリアルを完了するには、Amazon Redshift ML の「[管理の設定](https://docs.aws.amazon.com/redshift/latest/dg/admin-setup.html)」を完了している必要があります。

## ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする
<a name="tutorial_multi-class_classification_step_load"></a>

[Amazon Redshift クエリエディタv2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) を使用する次のクエリを実行します。これらのクエリは、サンプルデータを Amazon Redshift にロードします。

1. 次のクエリでは、`ecommerce_sales` という名前のテーブルを作成します。

   ```
   CREATE TABLE IF NOT EXISTS ecommerce_sales (
       invoiceno VARCHAR(30),
       stockcode VARCHAR(30),
       description VARCHAR(60),
       quantity DOUBLE PRECISION,
       invoicedate VARCHAR(30),
       unitprice DOUBLE PRECISION,
       customerid BIGINT,
       country VARCHAR(25)
   );
   ```

1. 次のクエリは、サンプルデータを [E-Commerce Sales Forecast データセット](https://www.kaggle.com/allunia/e-commerce-sales-forecast)から `ecommerce_sales` テーブルにコピーします。

   ```
   COPY ecommerce_sales
   FROM
       's3://redshift-ml-multiclass/ecommerce_data.txt' 
   IAM_ROLE default 
   DELIMITER '\t' 
   IGNOREHEADER 1 
   REGION 'us-east-1' 
   MAXERROR 100;
   ```

### データを分割する
<a name="tutorial_multi-class_classification_split_data"></a>

Amazon Redshift ML でモデルを作成すると、SageMaker AI はデータをトレーニングセットとテストセットに自動的に分割します。これにより、SageMaker AI がモデルの精度を判定できるようになります。このステップでデータを手動で分割することにより、追加の予測セットを割り当てることでモデルの精度を検証できます。

次の SQL ステートメントを使用して、データをトレーニング、検証、および予測の 3 つのセットに分割します。

```
--creates table with all data
CREATE TABLE ecommerce_sales_data AS (
    SELECT
        t1.stockcode,
        t1.description,
        t1.invoicedate,
        t1.customerid,
        t1.country,
        t1.sales_amt,
        CAST(RANDOM() * 100 AS INT) AS data_group_id
    FROM
        (
            SELECT
                stockcode,
                description,
                invoicedate,
                customerid,
                country,
                SUM(quantity * unitprice) AS sales_amt
            FROM
                ecommerce_sales
            GROUP BY
                1,
                2,
                3,
                4,
                5
        ) t1
);

--creates training set
CREATE TABLE ecommerce_sales_training AS (
    SELECT
        a.customerid,
        a.country,
        a.stockcode,
        a.description,
        a.invoicedate,
        a.sales_amt,
        (b.nbr_months_active) AS nbr_months_active
    FROM
        ecommerce_sales_data a
        INNER JOIN (
            SELECT
                customerid,
                COUNT(
                    DISTINCT(
                        DATE_PART(y, CAST(invoicedate AS DATE)) || '-' || LPAD(
                            DATE_PART(mon, CAST(invoicedate AS DATE)),
                            2,
                            '00'
                        )
                    )
                ) AS nbr_months_active
            FROM
                ecommerce_sales_data
            GROUP BY
                1
        ) b ON a.customerid = b.customerid
    WHERE
        a.data_group_id < 80
);

--creates validation set
CREATE TABLE ecommerce_sales_validation AS (
    SELECT
        a.customerid,
        a.country,
        a.stockcode,
        a.description,
        a.invoicedate,
        a.sales_amt,
        (b.nbr_months_active) AS nbr_months_active
    FROM
        ecommerce_sales_data a
        INNER JOIN (
            SELECT
                customerid,
                COUNT(
                    DISTINCT(
                        DATE_PART(y, CAST(invoicedate AS DATE)) || '-' || LPAD(
                            DATE_PART(mon, CAST(invoicedate AS DATE)),
                            2,
                            '00'
                        )
                    )
                ) AS nbr_months_active
            FROM
                ecommerce_sales_data
            GROUP BY
                1
        ) b ON a.customerid = b.customerid
    WHERE
        a.data_group_id BETWEEN 80
        AND 90
);

--creates prediction set
CREATE TABLE ecommerce_sales_prediction AS (
    SELECT
        customerid,
        country,
        stockcode,
        description,
        invoicedate,
        sales_amt
    FROM
        ecommerce_sales_data
    WHERE
        data_group_id > 90);
```

## ステップ 2: 機械学習モデルを作成する
<a name="tutorial_multi-class_classification_step_create_model"></a>

このステップでは、CREATE MODEL ステートメントを使用して、多クラス分類を使用して機械学習モデルを作成します。

次のクエリは、CREATE MODEL オペレーションを使用して、トレーニングセットを含む多クラス分類モデルを作成します。amzn-s3-demo-bucket は、ユーザーの Amazon S3 バケットに置き換えます。

```
CREATE MODEL ecommerce_customer_activity
FROM
    (
        SELECT
            customerid,
            country,
            stockcode,
            description,
            invoicedate,
            sales_amt,
            nbr_months_active
        FROM
            ecommerce_sales_training
    ) TARGET nbr_months_active FUNCTION predict_customer_activity IAM_ROLE default PROBLEM_TYPE MULTICLASS_CLASSIFICATION SETTINGS (
        S3_BUCKET 'amzn-s3-demo-bucket',
        S3_GARBAGE_COLLECT OFF
    );
```

このクエリでは、問題タイプを `Multiclass_Classification` に指定します。モデルについて予測するターゲットは `nbr_months_active` です。SageMaker AI でモデルのトレーニングが終了すると、`predict_customer_activity` 関数が作成されます。この関数を使用して、Amazon Redshift で予測を行います。

### モデルトレーニングのステータスを表示する (オプション)
<a name="tutorial_multi-class_classification_show_status"></a>

SHOW MODEL コマンドを使用して、モデルの準備が完了したことを知ることができます。

次のクエリを使用して、モデルの状態や精度など、モデルのさまざまなメトリクスを返します。

```
SHOW MODEL ecommerce_customer_activity;
```

モデルの準備が整うと、前のオペレーションの出力は `Model State` が `Ready` であることが表示されます。次は SHOW MODEL オペレーションの出力例です。

```
+--------------------------+-----------------------------------------------------------------------------------------------+
|        Model Name        |                                  ecommerce_customer_activity                                  |
+--------------------------+-----------------------------------------------------------------------------------------------+
|       Schema Name        |                                            public                                             |
|          Owner           |                                            awsuser                                            |
|      Creation Time       |                                   Fri, 17.06.2022 19:02:15                                    |
|       Model State        |                                             READY                                             |
|   Training Job Status    |                                  MaxAutoMLJobRuntimeReached                                   |
|   validation:accuracy    |                                           0.991280                                            |
|      Estimated Cost      |                                           7.897689                                            |
|                          |                                                                                               |
|      TRAINING DATA:      |                                                                                               |
|          Query           | SELECT CUSTOMERID, COUNTRY, STOCKCODE, DESCRIPTION, INVOICEDATE, SALES_AMT, NBR_MONTHS_ACTIVE |
|                          |                                 FROM ECOMMERCE_SALES_TRAINING                                 |
|      Target Column       |                                       NBR_MONTHS_ACTIVE                                       |
|                          |                                                                                               |
|       PARAMETERS:        |                                                                                               |
|        Model Type        |                                            xgboost                                            |
|       Problem Type       |                                   MulticlassClassification                                    |
|        Objective         |                                           Accuracy                                            |
|     AutoML Job Name      |                                redshiftml-20220617190215268770                                |
|      Function Name       |                                   predict_customer_activity                                   |
|   Function Parameters    |                customerid country stockcode description invoicedate sales_amt                 |
| Function Parameter Types |                          int8 varchar varchar varchar varchar float8                          |
|         IAM Role         |                                     default-aws-iam-role                                      |
|        S3 Bucket         |                                         amzn-s3-demo-bucket                                    |
|       Max Runtime        |                                             5400                                              |
+--------------------------+-----------------------------------------------------------------------------------------------+
```

## ステップ 3: モデルを使用して予測を実行する
<a name="tutorial_multi-class_classification_step_perform_predictions"></a>

次のクエリは、どのカスタマーがカスタマーロイヤルティプログラムの対象となるかを示します。モデルは、カスタマーが少なくとも 7 か月間アクティブになると予測する場合、ロイヤルティプログラムにそのカスタマーを選択します。

```
SELECT
    customerid,
    predict_customer_activity(
        customerid,
        country,
        stockcode,
        description,
        invoicedate,
        sales_amt
    ) AS predicted_months_active
FROM
    ecommerce_sales_prediction
WHERE
    predicted_months_active >= 7
GROUP BY
    1,
    2
LIMIT
    10;
```

### 検証データに対して予測クエリを実行する (オプション)
<a name="tutorial_multi-class_classification_run_validation_prediction"></a>

検証データに対して次の予測クエリを実行して、モデルの精度レベルを確認します。

```
SELECT
    CAST(SUM(t1.match) AS decimal(7, 2)) AS predicted_matches,
    CAST(SUM(t1.nonmatch) AS decimal(7, 2)) AS predicted_non_matches,
    CAST(SUM(t1.match + t1.nonmatch) AS decimal(7, 2)) AS total_predictions,
    predicted_matches / total_predictions AS pct_accuracy
FROM
    (
        SELECT
            customerid,
            country,
            stockcode,
            description,
            invoicedate,
            sales_amt,
            nbr_months_active,
            predict_customer_activity(
                customerid,
                country,
                stockcode,
                description,
                invoicedate,
                sales_amt
            ) AS predicted_months_active,
            CASE
                WHEN nbr_months_active = predicted_months_active THEN 1
                ELSE 0
            END AS match,
            CASE
                WHEN nbr_months_active <> predicted_months_active THEN 1
                ELSE 0
            END AS nonmatch
        FROM
            ecommerce_sales_validation
    )t1;
```

### エントリを逃した顧客の数を予測する（オプション）
<a name="tutorial_multi-class_classification_run_missed_entries"></a>

次のクエリは、5 か月または 6 か月間のみアクティブであると予測されるカスタマーの数を比較します。このモデルは、これらのカスタマーがロイヤルティプログラムに選ばれないと予測しています。次に、クエリは、プログラムをわずかな差で逃す数と、ロイヤルティプログラムの対象となると予測される数を比較します。このクエリは、ロイヤルティプログラムのしきい値を下げるかどうかの決定を通知するために使用できます。また、プログラムをわずかな差で逃すカスタマーの数が多数存在するかどうかについても判断できます。これにより、これらのカスタマーに対して、ロイヤルティプログラムのメンバーシップを取得するための活動を増やすように促すことができます。

```
SELECT
    predict_customer_activity(
        customerid,
        country,
        stockcode,
        description,
        invoicedate,
        sales_amt
    ) AS predicted_months_active,
    COUNT(customerid)
FROM
    ecommerce_sales_prediction
WHERE
    predicted_months_active BETWEEN 5 AND 6
GROUP BY
    1
ORDER BY
    1 ASC
LIMIT
    10)
UNION
(SELECT
      NULL AS predicted_months_active,
    COUNT (customerid)
FROM 
    ecommerce_sales_prediction
WHERE
    predict_customer_activity(
        customerid,
        country,
        stockcode,
        description,
        invoicedate,
        sales_amt
    ) >=7);
```

## 関連トピック
<a name="tutorial_multi-class_classification_related_topics"></a>

Amazon Redshift ML の詳細については、次のドキュメントを参照してください。
+ [ Amazon Redshift 機械学習を使用するためのコスト](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)
+ [CREATE MODEL オペレーション](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_MODEL.html)
+ [ EXPLAIN\$1MODEL 関数](https://docs.aws.amazon.com/redshift/latest/dg/r_explain_model_function.html)

機械学習の詳細については、以下のドキュメントを参照してください。
+ [機械学習の概要](https://docs.aws.amazon.com/redshift/latest/dg/machine_learning_overview.html)
+ [初心者やエキスパート向けの機械学習](https://docs.aws.amazon.com/redshift/latest/dg/novice_expert.html)
+ [機械学習予測の公平性とモデルの説明可能性とは](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html)

# チュートリアル: XGBoost モデルの構築
<a name="tutorial_xgboost"></a>

このチュートリアルでは、Amazon S3 のデータを使用してモデルを作成し、Amazon Redshift ML を使用してそのモデルで予測クエリを実行します。XGBoost アルゴリズムは、勾配ブーストツリーアルゴリズムの最適化された実装です。XGBoost は、他の勾配ブーストツリーアルゴリズムよりも多くのデータ型、リレーションシップ、および分布を処理します。XGBoost は、リグレッション、分類 (二項分類および多クラス分類)、ランキングの問題に使用できます。XGBoost アルゴリズムの詳細については、「Amazon SageMaker AI デベロッパーガイド」の「[XGBoost アルゴリズム](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html)」を参照してください。

`AUTO OFF` オプションの Amazon Redshift ML `CREATE MODEL` オペレーションは、現在 XGBoost を `MODEL_TYPE` としてサポートしています。目的やハイパーパラメータなどの関連情報をユースケースに基づいて、`CREATE MODEL` コマンドの一部として提供できます。

このチュートリアルでは、[紙幣認証データセット](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) を使用する次のクエリを実行します。

次のクエリは、2 つのテーブルを作成し、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` ユーザーの `S3_BUCKET` と置換します。これにより、入力データセットと他の Redshift ML アーティファクトが格納されます。

```
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)
+ [機械学習予測の公平性とモデルの説明可能性とは](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 を使用して、1 日の任意の時間にトロント市の自転車シェアサービスを利用する人の数を予測するリグレッションモデルを構築します。モデルの入力には、祝日と気象条件が含まれます。この問題には数値的な結果が必要なため、リグレッションモデルを使用します。

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

## ユースケースの例
<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. 3 つのパブリックデータセットを Amazon Redshift に読み込むには、3 つのテーブルを作成する必要があります。データセットは[トロントバイクライダーシップデータ](https://open.toronto.ca/dataset/bike-share-toronto-ridership-data/)、[履歴気象データ](https://climate.weather.gc.ca/historical_data/search_historic_data_e.html)、および[履歴的な休日データ](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` という名前の 2 つの新しいビューを作成することによってテーブルを単純化します。

   ```
   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 年 1 月 1 日の各トリップ時間に対するトリップ数の誤差率を計算します。このクエリは、誤差率が最も低い時間から誤差率が最も高い時間にトリップ時間を並べ替えます。

   ```
   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)
+ [機械学習予測の公平性とモデルの説明可能性とは](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 デベロッパーガイド」の「[機械学習パラダイムの問題タイプ](https://docs.aws.amazon.com/sagemaker/latest/dg/algorithms-choose.html#basic-machine-learning-paradigms)」を参照してください。このチュートリアルでは、リグレッション問題を解決します。線形学習アルゴリズムは、多数のモデルを並列でトレーニングし、最も最適化されたモデルを自動的に決定します。Amazon Redshift で CREATE MODEL オペレーションを使用すると、SageMaker AI で線形学習モデルが作成され、予測関数が Amazon Redshift に送信されます。線形学習アルゴリズムの詳細については、「Amazon SageMaker AI デベロッパーガイド」の「[線形学習アルゴリズム](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)」を参照してください。

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

線形学習モデルは、連続的な目標または離散的な目標のいずれかを最適化します。連続的な目標はリグレッションに使用され、離散変数は分類に使用されます。リグレッション法など、一部の方法は、連続的な目標のみに対する解を提供します。線形学習アルゴリズムは、Naive Bayes 手法などの単純なハイパーパラメータ最適化手法より高速です。単純な最適化手法では、各入力変数は独立していると仮定します。線形学習アルゴリズムを使用するには、入力の次元を表す列を指定し、観測値を表す行を指定する必要があります。線形学習アルゴリズムの詳細については、「Amazon SageMaker AI デベロッパーガイド」の「[線形学習アルゴリズム](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)」を参照してください。

このチュートリアルでは、アワビの年齢を予測する線形学習モデルを作成します。[アワビのデータセット](http://archive.ics.uci.edu/ml/datasets/Abalone)に対してCREATE MODEL コマンドを使用し、アワビの物理的測定値の関係を決定します。次に、モデルを使用してアワビの年齢を判断します。

## ユースケースの例
<a name="tutorial_linear_learner_regression_tasks"></a>

家の価格を予測するなど、線形学習と Amazon Redshift ML を使用して他のリグレッション問題を解決することもできます。また、Redshift ML を使用して、都市の自転車レンタルサービスを利用する人数を予測することもできます。

**タスク**
+ 前提条件
+ ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする
+ ステップ 2: 機械学習モデルを作成する
+ ステップ 3: モデルを検証する

## 前提条件
<a name="tutorial_linear_learner_regression_prereqs"></a>

このチュートリアルを完了するには、Amazon Redshift ML の「[管理の設定](https://docs.aws.amazon.com/redshift/latest/dg/admin-setup.html)」を完了している必要があります。

## ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする
<a name="tutorial_linear_learner_regression_step_load_data"></a>

[Amazon Redshift クエリエディタv2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) を使用する次のクエリを実行します。これらのクエリは、Redshift にサンプルデータをロードし、データをトレーニングセットと検証セットに分割します。

1. 次のクエリは、`abalone_dataset` テーブルを作成します。

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

1. 次のクエリは、サンプルデータを Amazon S3 の [アワビのデータセット](http://archive.ics.uci.edu/ml/datasets/Abalone)から Amazon Redshift で以前に作成した `abalone_dataset` テーブルにコピーします。

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

1. データを手動で分割することにより、追加の予測セットを割り当てることでモデルの精度を検証できます。次のクエリは、データを 2 つのセットに分割します。`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 個以下で、正確な予測では、実際の輪の数が 1 輪以内で高精度となります。

   ```
   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)
+ [機械学習予測の公平性とモデルの説明可能性とは](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 デベロッパーガイド」の「[機械学習パラダイムの問題タイプ](https://docs.aws.amazon.com/sagemaker/latest/dg/algorithms-choose.html#basic-machine-learning-paradigms)」を参照してください。このチュートリアルでは、複数クラス分類問題を解決します。線形学習アルゴリズムは、多数のモデルを並列でトレーニングし、最も最適化されたモデルを自動的に決定します。Amazon Redshift で CREATE MODEL オペレーションを使用すると、SageMaker AI で線形学習モデルが作成され、予測関数が Amazon Redshift に送信されます。線形学習アルゴリズムの詳細については、「Amazon SageMaker AI デベロッパーガイド」の「[線形学習アルゴリズム](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)」を参照してください。

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

線形学習モデルは、連続的な目標または離散的な目標のいずれかを最適化します。連続的な目標はリグレッションに使用され、離散変数は分類に使用されます。リグレッション法など、一部の方法は、連続的な目標のみに対する解を提供します。線形学習アルゴリズムは、Naive Bayes 手法などの単純なハイパーパラメータ最適化手法より高速です。単純な最適化手法では、各入力変数は独立していると仮定します。線形学習アルゴリズムは、多数のモデルを並列でトレーニングし、最も最適化されたモデルを選択します。同様のアルゴリズムが XGBoost です。XGBoost は、より単純で弱いモデルのセットから推定値を組み合わせて予測を行います。XGBoost の詳細については、「Amazon SageMaker AI デベロッパーガイド」の「[XGBoost アルゴリズム](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html)」を参照してください。

線形学習アルゴリズムを使用するには、入力の次元を表す列を指定し、観測値を表す行を指定する必要があります。線形学習アルゴリズムの詳細については、「Amazon SageMaker AI デベロッパーガイド」の「[線形学習アルゴリズム](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)」を参照してください。

このチュートリアルでは、特定地域の植生の種類を予測する線形学習モデルを作成します。UCI Machine Learning リポジトリの [Covertype データセット](https://archive.ics.uci.edu/ml/datasets/covertype) で CREATE MODEL コマンドを使用します。次に、コマンドで作成された予測関数を使用して、荒野地域の植生の種類を特定します。森林の種類の種類は、通常、樹木の一種です。Redshift ML がモデルの作成に使用する入力には、土壌タイプ、道路までの距離、および荒野地域の指定が含まれます。データセットの詳細については、UCI Machine Learning リポジトリの [Covertype データセット](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 S3 の [Covertype データセット](https://archive.ics.uci.edu/ml/datasets/covertype)から Amazon Redshift で以前に作成した `covertype_data` テーブルにコピーします。

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

1. データを手動で分割することにより、追加のテストセットを割り当てることでモデルの精度を検証できます。次のクエリは、データを 2 つのセットに分割します。`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. 次のクエリは、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)
+ [機械学習予測の公平性とモデルの説明可能性とは](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 ML 管理者によるクラスターと設定のセットアップ](getting-started-machine-learning.md#admin-setup)」の手順に従います。

より制限の厳しいポリシーが必要な場合は、以下のページで指定された Amazon Bedrock アクセス許可のみを含むポリシーを作成できます。
+ [Amazon Redshift ML 管理者によるクラスターと設定のセットアップ](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 documentation](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` データタイプのパラメータが 1 つだけあります。このパラメータの構文は、使用する 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 ユーザーガイド」の「[Quotas for 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 は複数回リクエストを再試行しますが、プロビジョニングされていないモデルのスループットは可変である可能性があるため、クエリはスロットリングされる可能性があります。
+ データが少量にもかかわらず Amazon Bedrock によるスロットリング例外 (`Too many requests, please wait before trying again.` など) が発生する場合は、Amazon Bedrock アカウントの **[サービスクォータ]** でクォータを確認します。適用されているアカウントレベルのクォータが、使用しているモデルに対する **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
```