

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 機器學習
<a name="machine_learning"></a>

Amazon Redshift 機器學習 (Amazon Redshift ML) 是一種強大的雲端型服務，可讓各種技能等級的分析師和資料科學家更輕鬆地使用機器學習技術。Amazon Redshift ML 使用模型來產生結果。您可以透過以下方式使用模型：
+ 您可以將想要訓練模型的資料，以及與資料輸入相關聯的中繼資料提供給 Amazon Redshift。然後 Amazon Redshift ML 會在 Amazon SageMaker AI 中建立模型，以便在輸入資料中擷取模式。透過將自有資料用於模型，您就可以使用 Amazon Redshift ML 來識別資料中的趨勢，例如流失預測、客戶生命週期價值或收入預測。您可以使用這些模型來產生新輸入資料的預測，而且不會產生額外費用。
+ 您可以使用 Amazon Bedrock 提供的其中一個基礎模型 (FM)，例如 Claude 或 Amazon Titan。使用 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 ML 的運作方式。

![\[Amazon Redshift ML 與 Amazon SageMaker AI Autopilot 整合的工作流程。\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/images/machine_learning_overview.png)


一般工作流程如下：

1. Amazon Redshift會 將訓練資料匯出至 Amazon S3。

1. Amazon SageMaker AI Autopilot 會預先處理訓練資料。*預處理*會執行重要功能，例如輸入遺漏值。其會識別特定資料欄是可分類的 (例如郵遞區號)，正確格式化這些資料欄以進行訓練，並執行許多其他工作。選擇要套用於訓練資料集的最佳預處理器本身就是個問題，而 Amazon SageMaker AI Autopilot 會自動執行其解決方案。

1. Amazon SageMaker AI Autopilot 會尋找演算法和演算法超參數，提高模型最準確的預測。

1. Amazon Redshift 會將預測函數註冊為您 Amazon Redshift 叢集中的 SQL 函數。

1. 當您執行 CREATE MODEL 陳述式時，Amazon Redshift 會使用 Amazon SageMaker AI 進行訓練。因此，訓練模型會產生相關的成本。這是 AWS 帳單中 Amazon SageMaker AI 的個別明細項目。您也需要支付 Amazon S3 用於存放訓練資料的儲存費用。使用透過 CREATE MODEL 建立且可在 Redshift 叢集上編譯和執行的模型進行推論不收費。使用 Amazon Redshift ML 不會收取額外的 Amazon Redshift 費用。

**Topics**
+ [機器學習概述](machine_learning_overview.md)
+ [適用於新手和專家的機器學習](novice_expert.md)
+ [使用 Amazon Redshift ML 的成本](cost.md)
+ [開始使用 Amazon RedShift ML](getting-started-machine-learning.md)
+ [Amazon Redshift ML 的教學課程](tutorials_for_amazon_redshift_ml.md)
+ [Amazon Redshift ML 與 Amazon Bedrock 整合](machine-learning-br.md)

# 機器學習概述
<a name="machine_learning_overview"></a>

透過 Amazon Redshift，您就可以利用機器學習功能從資料中獲得寶貴的深入分析。此機器學習 (ML) 概觀說明如何探索、視覺化和準備資料，以供 ML 模型訓練和部署使用。下列各節將引導您完成使用 Amazon Redshift ML 的程序，協助您透過機器學習充分發揮資料的潛力。

透過使用 Amazon Redshift 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 ML 中進行監督式學習
<a name="supervised_learning"></a>

Amazon Redshift 支援受監督式學習，這是進階企業分析最常用的方法。當您擁有一組已建立的資料並了解特定輸入資料如何預測各種業務成果時，監督式學習是首選的機器學習方法。這些結果有時稱為標籤。特別是，如果您的資料集是一個包含特徵 (輸入) 和目標 (輸出) 的屬性資料表。例如，假設您有一個提供過去和現在客戶的年齡和郵遞區號的資料表。假設您還有一個「作用中」欄位，而此欄位對於現在的客戶而言是 true，對於已暫停其會員資格的客戶來說是 false。監督式機器學習的目標是發現導致客戶流失的年齡和郵遞區號模式，以其目標為 “False” 的客戶表示。您可以使用此模型來預測可能流失的客戶，例如暫停其會員資格，並可能提供保留獎勵。

Amazon Redshift 支援監督式學習，其中包括迴歸、二進制分類和多類別分類。迴歸是指預測連續值的問題，例如客戶的總支出。二進制分類指的是預測兩個結果之一的問題，例如預測客戶是否會流失。多類別分類是指預測許多結果之一的問題，例如預測客戶可能感興趣的項目。資料分析師和資料科學家可以使用它來執行監督式學習，以解決諸如預測、個性化或客戶流失預測等問題。您還可以在諸如預測哪些銷售會結束、收入預測、詐騙偵測和客戶終身價值預測等問題中使用監督式學習。

### 在 Amazon Redshift ML 中進行非監督式學習
<a name="unsupervised_learning"></a>

非監督式學習會使用機器學習演算法來分析和分組未標籤的訓練資料。演算法會發現隱藏的模式或分組。目標是為資料中的基礎結構或分佈建立模型，以進一步了解資料。

Amazon Redshift 支援 K 平均值叢集演算法，以解決非監督式學習問題。此演算法可解決您想在資料中探索分組的叢集問題。K 平均值演算法會嘗試尋找資料中的離散群組。未分類的資料會根據其相似性和差異進行分組和分割。透過分組，K 平均值演算法會反覆決定最佳質心，並將每個成員指派給最接近的質心。最接近屬於同一群組的相同質心的成員。群組的成員會盡可能地與相同群組中的其他成員相似，並盡可能地和其他群組的成員不同。例如，K 平均值叢集演算法可用於對受到流行病影響的城市進行分類，或根據消費品產品的受歡迎程度對城市進行分類。

使用 K 平均值演算法時，您可以指定輸入 `k`，指定要在資料中尋找的叢集數目。該演算法的輸出是 k 個質心的集合。每個資料點都屬於 k 個叢集中最接近它的其中一個叢集。每個叢集都會由其質心描述。質心可以被認為是叢集的多維平均值。K 平均值演算法會比較距離，以了解叢集彼此之間有多不同。較大的距離通常表示叢集之間的差異較大。

預處理資料對 K 平均值來說很重要，因為可確保模型的特徵保持相同的比例並產生可靠的結果。Amazon Redshift 支援將一些 K 平均值預處理器用於 CREATE MODEL 陳述式，例如 StandardScaler、MinMax 和 NumericPassthrough。如果您不想對 K 平均值套用任何預處理，請明確選擇 NumericPassthrough 作為轉換器。如需 K 平均值的相關資訊，請參閱 [CREATE MODEL 與 K-MEANS 參數](r_create_model_use_cases.md#r_k-means-create-model-parameters)。

若要協助您了解如何使用 K 平均值叢集執行非監督式訓練，您可以觀看以下影片。

[![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 ML 的術語和概念
<a name="terminology"></a>

下列術語用來描述 Amazon Redshift ML 的一些概念。
+ Amazon Redshift 中的*機器學習*會使用一個 SQL 命令來訓練模型。Amazon Redshift ML 和 Amazon SageMaker AI 會管理適當模型的所有資料轉換、許可、資源使用情況和探索。
+ *訓練*是 Amazon Redshift 透過在模型中執行指定的資料子集來建立機器學習模型的階段。Amazon Redshift 會在 Amazon SageMaker AI 中自動啟動訓練任務，並產生一個模型。
+ *預測* (也稱為*推論*) 是在 Amazon Redshift SQL 查詢中使用模型來預測結果。在推論時，Amazon Redshift 會使用以模型為基礎的預測函數做為較大查詢的一部分來產生預測。預測是在 Redshift 叢集本機上計算的，因此可提供高輸送量、低延遲和零額外成本。
+ 透過*使用自有模型 (BYOM)*，您可以使用在 Amazon Redshift 外部訓練的模型搭配 Amazon SageMaker AI，以便在 Amazon Redshift 本機上進行資料庫內推論。Amazon Redshift 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。使用本機推論以加快速度並降低成本。
+ 當 Amazon Redshift 調用 SageMaker AI 中部署的模型端點時，就會使用*遠端推論*。遠端推論為調用所有類型的自訂模型和深度學習模型提供了靈活性，例如您在 Amazon SageMaker AI 中建立和部署的 TensorFlow 模型。

同樣重要的是以下各項：
+ *Amazon SageMaker AI* 是一種全受管機器學習服務。使用 Amazon SageMaker AI，資料科學家和開發人員可輕鬆建置、訓練模型，然後直接將模型部署至生產就緒的託管環境。如需 Amazon SageMaker AI 的詳細資訊，請參閱《Amazon SageMaker AI 開發人員指南》**中的[什麼是 Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html)。
+ *Amazon SageMaker AI Autopilot* 是一個功能集，可根據您的資料自動訓練和調整最佳機器學習模型，以進行分類或迴歸。您可以保持完整的控制權和可見性。Amazon SageMaker AI Autopilot 支援以資料表格式輸入資料。Amazon SageMaker AI Autopilot 提供自動資料清理和預處理、線性迴歸的自動演算法選擇、二進制分類和多類別分類。也支援自動超參數最佳化 (HPO)、分散式訓練、自動執行個體和叢集大小選擇。如需有關 Amazon SageMaker AI Autopilot 的詳細資訊，請參閱《Amazon SageMaker AI 開發人員指南》**中的[使用 Amazon SageMaker AI Autopilot 自動化模型開發](https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-automate-model-development.html)。
+ *Amazon Bedrock* 是一項全受管服務，透過單一 API 提供 AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI 和 Amazon 等領先 AI 公司精選的高效能基礎模型 (FM)，以及建置生成式 AI 應用程式所需的廣泛功能。

# 適用於新手和專家的機器學習
<a name="novice_expert"></a>

無論您是新手還是機器學習專家，只要使用 Amazon Redshift，您都可以利用機器學習 (ML) 功能從資料中獲得深入分析。機器學習是一項 Amazon Redshift 功能，可讓您使用 SQL 命令建立、訓練和部署 ML 模型，而不需要廣泛的 ML 專業知識或複雜的資料工程。

下列各節將引導您完成使用機器學習的程序，協助您透過 Amazon Redshift 充分發揮資料的完整潛力。

Amazon Redshift ML 可讓您使用單一 SQL CREATE MODEL 命令來訓練模型。CREATE MODEL 命令會建立一個模型，讓 Amazon Redshift 使用此模型來產生具有熟悉 SQL 建構模組的模型式預測。

當您沒有機器學習、工具、語言、演算法和 API 的專業知識時，Amazon Redshift ML 會特別有用。使用 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 仍會發現用於其餘特徵的最佳的預處理器和最佳超參數。如需如何限制訓練管道的一或多個層面的相關資訊，請參閱 [CREATE MODEL 和使用者指引](r_create_model_use_cases.md#r_user_guidance_create_model)。
+ 若是身為*機器學習專家*，您可以完全掌控訓練和超參數調整。然後 CREATE MODEL 陳述式就不會嘗試探索最佳的預處理器、演算法和超參數，因為您做出了所有選擇。如需如何搭配 AUTO OFF 使用 CREATE MODEL 的相關資訊，請參閱 [CREATE XGBoost 模型與 AUTO OFF](r_create_model_use_cases.md#r_auto_off_create_model)。
+ 身為*資料工程師*，您可以在 Amazon SageMaker AI 中導入預先訓練的 XGBoost 模型，並將其匯入 Amazon Redshift 以進行本機推論。透過使用自有模型 (BYOM)，您可以使用在 Amazon Redshift 外部訓練的模型搭配 Amazon SageMaker AI，以便在 Amazon Redshift 本機上進行資料庫內推論。Amazon Redshift ML 支援使用 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) 或 [CREATE XGBoost 模型與 AUTO OFF](r_create_model_use_cases.md#r_auto_off_create_model)。
+ 模型類型，請參閱 [CREATE XGBoost 模型與 AUTO OFF](r_create_model_use_cases.md#r_auto_off_create_model)。
+ 預處理器，請參閱 [CREATE MODEL 和使用者指引](r_create_model_use_cases.md#r_user_guidance_create_model)。
+ 超參數，請參閱 [CREATE XGBoost 模型與 AUTO OFF](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 ML 的成本
<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 設太低，則可能甚至沒有足夠時間來探索一個候選項目。如果您看到錯誤「Autopilot 候選項目沒有模型」，請以較大的 MAX\$1RUNTIME 值重新執行 CREATE MODEL。如需此參數的相關資訊，請參閱 *Amazon SageMaker AI 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，即可減少 Amazon Redshift 從 CREATE MODEL 的 SELECT 查詢結果中匯出並傳送給 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 Redshift ML 搭配 Amazon Bedrock 的成本
<a name="cost_sm"></a>

使用 Amazon Redshift ML 搭配 Amazon Bedrock 會產生額外的成本。如需詳細資訊，請參閱 [Amazon Bedrock 定價](https://aws.amazon.com/bedrock/pricing/)。

# 開始使用 Amazon RedShift ML
<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 和 OFF) 和多層感知器 (AUTO ON)、K 平均值 (AUTO OFF) 和線性學習程式。

**Topics**
+ [針對 Amazon Redshift ML 管理進行叢集和組態設定](#admin-setup)
+ [使用模型可解釋性與 Amazon Redshift ML](#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 佈建叢集。若要了解如何使用 Amazon Redshift ML 搭配 Amazon Redshift Serverless，請參閱 [Amazon Redshift Serverless 入門](https://docs.aws.amazon.com/redshift/latest/gsg/new-user-serverless.html)。

若要為 Amazon Redshift ML 執行一次性叢集設定 

1. 使用 AWS 管理主控台 或 AWS Command Line Interface () 建立 Redshift 叢集AWS CLI。請務必在建立叢集時連接 AWS Identity and Access Management (IAM) 政策。如需使用 Amazon Redshift ML 搭配 Amazon SageMaker AI 時所需許可的詳細資訊，請參閱[使用 Amazon Redshift 機器學習 (ML) 時所需的許可](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#iam-permission-ml?)。

1. 使用下列其中一個方法，建立使用 Amazon Redshift ML 所需的 IAM 角色：
   + 若要使用 SageMaker AI 搭配 Amazon Redshift ML，請建立具有 `AmazonS3FullAccess` 和 `AmazonSageMakerFullAccess` 政策的 IAM 角色。如果您打算同時建立預測模型，也可以將 `AmazonForecastFullAccess` 政策附加至您的角色。
   + 若要使用 Amazon Bedrock 搭配 Amazon Redshift ML，請建立具有 `AmazonS3FullAccess` 和 `AmazonBedrockFullAccess` 政策的 IAM 角色。
   + 我們建議您透過 Amazon Redshift 主控台建立 IAM 角色，其具有有權執行 SQL 命令 (例如 CREATE MODEL) 的 `AmazonRedshiftAllCommandsFullAccess` 政策。Amazon Redshift 使用無縫 API 型機制，以程式設計方式 AWS 帳戶 代表您在 中建立 IAM 角色。Amazon Redshift 會自動將現有的 AWS 受管政策連接到 IAM 角色。此方法意味著您可以保留在 Amazon Redshift 主控台內，而不必切換到 IAM 主控台來建立角色。如需詳細資訊，請參閱[建立 IAM 角色做為 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 Redshift 用來儲存傳送至 Amazon SageMaker AI 的訓練資料，並從 Amazon SageMaker AI 接收訓練過的模型。

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 所需許可的相關資訊，請參閱[搭配 Amazon SageMaker AI 使用 Amazon Redshift ML 所需的許可](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html)。
**注意**  
對遠端 SageMaker AI 模型進行的推論呼叫不會通過您的 VPC。

如需有關如何使用 CREATE MODEL 陳述式開始針對不同使用案例建立模型的資訊，請參閱 [CREATE MODEL](r_CREATE_MODEL.md)。

### 管理許可和擁有權
<a name="permissions-ownership"></a>

就像其他資料庫物件 (例如資料表或函數) 一樣，Amazon Redshift 會繫結建立和使用機器學習模型來存取控制機制。建立執行預測函數的模型有不同的許可。

下列範例使用兩個使用者群組 `retention_analyst_grp` (模型建立者) 和 `marketing_analyst_grp` (模型使用者) 來說明 Amazon Redshift 如何管理存取控制。保留分析師會建立機器學習模型，讓其他一組使用者可透過取得的許可使用這些模型。

超級使用者可以使用下列陳述式 GRANT (授予) USER 或 GROUP 許可，以建立機器學習模型。

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

如果使用者擁有 SCHEMA 的一般 CREATE 許可，則具有此許可的使用者或群組可以在叢集中的任何結構描述中建立模型。機器學習模型是結構描述階層的一部分，與資料表、檢視表、程序和使用者定義函數類似。

假設結構描述 `demo_ml` 已存在，請依照下列方式授予兩個使用者群組結構描述上的許可。

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

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

若要讓其他使用者使用您的機器學習推論功能，請授予 EXECUTE 權限。下列範例會使用 EXECUTE 權限，將使用模型的許可授予 marketing\$1analyst\$1grp GROUP。

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

搭配 CREATE MODEL 和 EXECUTE 使用 REVERSE 陳述式，可撤銷使用者或群組的這些許可。如需許可控制命令的相關資訊，請參閱 [GRANT](r_GRANT.md) 和 [REVOKE](r_REVOKE.md)。

## 使用模型可解釋性與 Amazon Redshift ML
<a name="clarify"></a>

透過 Amazon Redshift ML 中的模型可解釋性，您可以使用特徵重要性值，協助您了解訓練資料中的每個屬性如何影響預測結果。

模型可解釋性可以解釋模型進行的預測，以協助改善您的機器學習 (ML) 模型。模型可解釋性可幫助解釋這些模型如何使用特徵歸因方法進行預測。

Amazon Redshift ML 整合了模型可解釋性，為 Amazon Redshift ML 使用者提供模型解釋功能。如需模型可解釋性的相關資訊，請參閱《Amazon SageMaker AI 開發人員指南》**中的[什麼是機器學習預測的公平性和模型可解釋性？](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html)。

模型解釋性還可監控模型在生產環境中為特徵屬性漂移所做的推論。它還提供了一些工具來幫助您生成模型治理報告，您可以使用這些報告告知風險和合規團隊以及外部監管機構。

當您在使用 CREATE MODEL 陳述式時指定 AUTO ON 或 AUTO OFF 選項時，模型訓練任務完成後，SageMaker AI 會建立解釋輸出。您可以使用 EXPLAIIN\$1MODEL 函數來查詢 JSON 格式的解釋性報告。如需詳細資訊，請參閱[機器學習函數](ml-function.md)。

## Amazon Redshift ML 概率指標
<a name="probability_metrics"></a>

 在監督式學習問題中，類別標籤是使用輸入資料的預測結果。例如，如果您使用模型來預測客戶是否會重新訂閱串流服務，則可能的標籤是很可能和不太可能。Redshift ML 會提供概率指標的功能，可為每個標籤指派概率以指出其可能性。這可以幫助您根據預測的結果做出更明智的決策。在 Amazon Redshift ML 中，建立具有二進制分類或多類別分類問題類型的 AUTO ON 模型時，都可以使用概率指標。如果您省略 AUTO ON 參數，Redshift ML 會假設模型應具有 AUTO ON。

### 建立模型
<a name="probability_metrics_create_model"></a>

 建立模型時，Amazon Redshift 會自動偵測模型類型和問題類型。如果是分類問題，Redshift 會自動建立第二個推論函數，您可以使用該函數輸出相對於每個標籤的機率。第二個推論函數的名稱是您指定的推論函數名稱接著字串 `_probabilities`。例如，如果您將推論函數命名為 `customer_churn_predict`，則第二個推論函數的名稱為 `customer_churn_predict_probabilities`。然後，您可以查詢此函數以獲取每個標籤的概率。

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

### 獲取概率
<a name="probability_metrics_create_model_get_probability"></a>

 一旦概率函數準備就緒，執行命令會傳回一個 [SUPER 類型](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html)，其中包含傳回的概率陣列及其相關標籤。例如，結果 `"probabilities" : [0.7, 0.3], "labels" : ["False.", "True."]` 表示 False 標籤的概率為 0.7，而 True 標籤的概率為 0.3。

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

 概率和標籤陣列一律會按其概率降序排序。您可以撰寫查詢，只傳回具有最高概率的預測標籤，方法是將 SUPER 傳回概率函數結果解除巢狀結構。

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

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

為了使查詢更簡單，您可以將預測函數的結果儲存在資料表中。

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

您可以查詢含有結果的資料表，以僅傳回概率高於 0.7 的預測。

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

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

使用索引符號，你可以得到特定標籤的概率。下列範例會傳回所有 `True.` 標籤的概率。

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

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

 下列範例會傳回所有具有 `True`. 標籤且概率大於 0.7 的資料列，這表示客戶可能流失。

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

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

# Amazon Redshift ML 的教學課程
<a name="tutorials_for_amazon_redshift_ml"></a>

您可以透過 Amazon Redshift ML，使用 SQL 陳述式訓練機器學習模型，然後在 SQL 查詢中調用這些模型以進行預測。Amazon Redshift 中的機器學習會使用一個 SQL 命令來訓練模型。Amazon Redshift 會在 Amazon SageMaker AI 中自動啟動訓練任務，並產生一個模型。建立模型之後，您可以使用模型的預測函數在 Amazon Redshift 中執行預測。

請遵循這些教學課程中的步驟以瞭解 Amazon Redshift ML 特徵：
+ [教學課程：建置客戶流失模型](tutorial_customer_churn.md) - 在本教學課程中，您會使用 Amazon Redshift ML 透過 CREATE MODEL 命令建立客戶流失模型，並針對使用者案例執行預測查詢。然後，您可以使用 CREATE MODEL 命令所產生的 SQL 函數來實作查詢。
+ [教學課程：建置 K 平均值叢集模型](tutorial_k-means_clustering.md) - 在本教學課程中，您會使用 Amazon Redshift ML 來建立、訓練和部署以 [K 平均值演算法](url-sm-dev;k-means.html)為基礎的機器學習模型。
+ [教學課程：建置多類別分類模型](tutorial_multi-class_classification.md) - 在本教學課程中，您會使用 Amazon Redshift ML 建立可解決多類別分類問題的機器學習模型。多類別分類演算法將資料點分類為三個或多個類別之一。然後，您可以使用 CREATE MODEL 命令所產生的 SQL 函數來實作查詢。
+ [教學課程：建置 XGBoost 模型](tutorial_xgboost.md) - 在本教學課程中，您會使用來自 Amazon S3 的資料建立模型，並使用 Amazon Redshift ML 透過該模型執行預測查詢。XGBoost 演算法是梯度提升樹演算法的最佳化實作。
+ [教學課程：建置迴歸模型](tutorial_regression.md) - 在本教學中，您會使用 Amazon Redshift ML 建立機器學習迴歸模型，並在模型上執行預測查詢。迴歸模型允許您預測數值結果，例如房屋的價格，或有多少人將使用城市的自行車租賃服務。
+ [教學課程：使用線性學習程式建置迴歸模型](tutorial_linear_learner_regression.md) - 在本教學課程中，您會使用來自 Amazon S3 的資料建立線性學習程式模型，並使用 Amazon Redshift ML 透過該模型執行預測查詢。SageMaker AI 線性學習程式演算法可解決迴歸或多類別分類問題。
+ [教學課程：使用線性學習程式建置多類別分類模型](tutorial_linear_learner_multi-class_classification.md) - 在本教學課程中，您會使用來自 Amazon S3 的資料建立線性學習程式模型，然後使用 Amazon Redshift ML 透過該模型執行預測查詢。SageMaker AI 線性學習程式演算法可解決迴歸或分類問題。

# 教學課程：建置客戶流失模型
<a name="tutorial_customer_churn"></a>

在本教學課程中，您可以使用 Amazon Redshift ML 透過 CREATE MODEL 命令建立客戶流失模型，並針對使用者案例執行預測查詢。然後，您可以使用 CREATE MODEL 命令所產生的 SQL 函數來實作查詢。

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

此範例會使用歷史資訊來建構行動電信業者的客戶流失機器學習模型。首先，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 命令](https://s3.amazonaws.com/redshift-downloads/redshift-ml/tutorial-scripts/redshift-ml-tutorial.sql)、[客戶活動檔案](https://s3.amazonaws.com/redshift-downloads/redshift-ml/customer_activity/customer_activity.csv)和[鮑魚檔案](https://s3.amazonaws.com/redshift-downloads/redshift-ml/abalone_xg/abalone.csv)。
  + 使用 AWS CLI 適用於 Amazon S3 的 ，執行下列命令。您可以使用自己的目標路徑。

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

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

使用 [Amazon Redshift 查詢編輯器 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) 編輯和執行查詢，以及視覺化結果。

執行下列查詢會建立名為 `customer_activity` 的資料表，並從 Amazon S3 擷取範例資料集。

```
DROP TABLE IF EXISTS customer_activity;

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

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

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

流失率是我們在此模型中的目標輸入。模型的所有其他輸入都是有助於建立函數以預測流失的屬性。

下列範例會使用 CREATE MODEL 作業，並使用客戶年齡、郵遞區號、支出和案例等輸入，來提供預測客戶是否處於作用中狀態的模型。在下列範例中，請將 amzn-s3-demo-bucket 取代為您的 Amazon S3 儲存貯體。

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

上述範例中的 SELECT 查詢會建立訓練資料。TARGET 子句會指定 CREATE MODEL 操作用來學習如何預測的機器學習標籤資料欄。目標資料欄「流失率」會指出客戶是否仍然具有作用中的會員資格或已暫停會員資格。S3\$1BUCKET 欄位是您先前建立的 Amazon S3 儲存貯體名稱。Amazon S3 儲存貯體的用途是在 Amazon Redshift 和 Amazon SageMaker AI 之間共用訓練資料和成品。其餘的資料欄是用於預測的特徵。

如需 CREATE MODEL 命令的基本使用案例的語法和特徵摘要，請參閱[簡單 CREATE MODEL](https://docs.aws.amazon.com/redshift/latest/dg/r_create_model_use_cases.html#r_simple_create_model)。

### 新增伺服器端加密的許可 (選用)
<a name="tutorial_customer_churn_encryption"></a>

Amazon Redshift 預設使用 Amazon SageMaker AI Autopilot 進行訓練。特別是，Amazon Redshift 會將訓練資料安全地匯出到客戶指定的 Amazon S3 儲存貯體。如果您未指定`KMS_KEY_ID`，資料會預設為使用伺服器端加密 SSE-S3 進行加密。

當您使用具有 AWS KMS 受管金鑰 (SSE-MMS) 的伺服器端加密來加密輸入時，請新增下列許可：

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

如需 Amazon SageMaker AI 角色的詳細資訊，請參閱《Amazon SageMaker AI 開發人員指南》**中的 [Amazon SageMaker AI 角色](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`。預測函數的輸入引數會對應於特徵的類型，例如 varchar 會用於 `state`，而整數會用於 `account_length`。預測函數的輸出類型與 CREATE MODEL 陳述式的 TARGET 資料欄相同。

1. 您用了 2020-01-01 之前的資料訓練模型，因此現在您可以在測試集上使用預測功能。以下查詢顯示 2020-01-01 之後註冊的客戶是否會經歷流失的預測。

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

1. 下列範例針對不同的使用案例使用相同的預測函數。在此案例中，Amazon Redshift 會從不同州的客戶中 (記錄日期大於 2020-01-01)，預測流失者和非流失者的比例。

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

1. 下列範例會使用預測函數來預測某州中流失的客戶百分比。在此案例中，Amazon Redshift 會預測記錄日期大於 2020-01-01 的流失百分比。

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

## 相關主題
<a name="tutorial_customer_churn_related_topics"></a>

如需 Amazon Redshift ML 的相關資訊，請參閱下列文件：
+ [使用 Amazon RedshiftML 的成本](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 平均值叢集模型
<a name="tutorial_k-means_clustering"></a>

在本教學課程中，您會使用 Amazon Redshift ML 來建立、訓練和部署以 [K 平均值演算法](url-sm-dev;k-means.html)為基礎的機器學習模型。此演算法可解決您想在資料中探索分組的叢集問題。K 平均值有助於對尚未標記的資料進行分組。若要進一步了解 K 平均值叢集，請參閱《Amazon SageMaker AI 開發人員指南》中的 [K 平均值叢集的運作方式](https://docs.aws.amazon.com/sagemaker/latest/dg/algo-kmeans-tech-notes.html)。

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

在本教學課程中，您會在[全球事件、語言和音調資料庫 (Global Database of Events, Language, and Tone (GDELT))](https://aws.amazon.com/public-datasets/gdelt/) 資料集上使用 K 平均值，此資料集會監控世界各地的新聞，並每天每秒地儲存這些資料。K 平均值會將音調、動作者或位置相似的事件進行分組。資料會以多個檔案形式儲存在 Amazon Simple Storage Service 中 (儲存在兩個不同的資料夾中)。這些資料夾為歷史資料夾 (涵蓋 1979–2013 年) 及每日更新資料夾 (涵蓋 2013 年及以後的年份)。在此範例中，我們使用歷史格式，並帶入 1979 年的資料。

## 使用案例範例
<a name="tutorial_k-means_clustering_tasks"></a>

您可以使用 Amazon Redshift ML 解決其他叢集問題，例如對在串流服務上具有類似檢視習慣的客戶進行分組。您也可以使用 Redshift ML 來預測遞送服務的最佳託運中心數量。

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

## 先決條件
<a name="tutorial_k-means_clustering_prereqs"></a>

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

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

1. 使用 [Amazon Redshift 查詢編輯器 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) 來執行下列查詢。查詢會在公用結構描述中捨棄 `gdelt_data` 資料表 (如果資料表存在)，並在公用結構描述中建立相同名稱的資料表。

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

1. 下列查詢會將範例資料載入 `gdelt_data` 資料表中。

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

### 檢查訓練資料 (選擇性)
<a name="tutorial_k-means_clustering_examine"></a>

若要查看您的模型將在哪些資料上進行訓練，請使用下列查詢。

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

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

下列範例使用 CREATE MODEL 命令來建立可將資料分組為七個叢集的模型。K 值是資料點將分散在其中的叢集數目。模型會將您的資料點分類成叢集，其中資料點彼此更相似。透過將資料點分成群組，K 平均值演算法會反覆判斷最佳的叢集中心。然後演算法會將每個資料點指派給最近的叢集中心。最接近屬於同一群組的相同叢集中心的成員。群組的成員會盡可能地與相同群組中的其他成員相似，並盡可能地和其他群組的成員不同。K 值是主觀的，取決於測量資料點之間相似性的方法。如果叢集分佈不均，您可以變更 K 值以平滑化叢集大小。

在下列範例中，請將 amzn-s3-demo-bucket 取代為您的 Amazon S3 儲存貯體。

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

### 檢查模型訓練的狀態 (選擇性)
<a name="tutorial_k-means_clustering_check_status"></a>

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

若要檢查模型狀態，請使用下列 SHOW MODEL 操作並找到 `Model State` 是否為 `Ready`。

```
SHOW MODEL NEWS_DATA_CLUSTERS;
```

當模型準備就緒時，先前操作的輸出應會顯示 `Model State` 為 `Ready`。下列為 SHOW MODEL 操作的輸出範例。

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

## 步驟 3：執行模型的預測
<a name="tutorial_k-means_clustering_step_perform_predictions"></a>

### 識別叢集
<a name="tutorial_k-means_clustering_identify_clusters"></a>

您可以找到模型在資料中識別的離散群組 (也稱為叢集)。比起任何其他叢集中心，叢集是更接近其叢集中心的一組資料點。由於 K 值代表模型中的叢集數目，因此也代表叢集中心的數目。下面的查詢會透過顯示與每個 `globaleventid` 相關聯的叢集來識別叢集。

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

### 檢查資料的分佈
<a name="tutorial_k-means_clustering_check_distribution"></a>

您可以檢查叢集之間的資料分佈，以查看您選擇的 K 值是否會讓資料稍微均勻地分佈。使用下列查詢來判斷資料是否平均分佈在叢集中。

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

請注意，如果叢集分佈不均，您可以變更 K 值以平滑化叢集大小。

### 判斷叢集中心
<a name="tutorial_k-means_clustering_determine_centers"></a>

比起任何其他叢集中心，資料點會更接近其叢集中心。因此，尋找叢集中心可協助您定義叢集。

執行下列查詢，根據事件代碼的文章數目判斷叢集的中心。

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

### 顯示叢集中資料點的相關資訊
<a name="tutorial_k-means_clustering_data_points_info"></a>

使用以下查詢傳回指派給第五個叢集的點的資料。選定的文章必須有兩個動作者。

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

### 顯示具有相同族裔代碼的動作者的事件資料
<a name="tutorial_k-means_clustering_show_events_data"></a>

下列查詢會計算以正面語調撰寫有關事件的文章數目。該查詢也會要求兩個動作者具有相同的族裔代碼，並傳回每個事件分派給哪個叢集。

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

## 相關主題
<a name="tutorial_k-means_clustering_related_topics"></a>

如需 Amazon Redshift ML 的相關資訊，請參閱下列文件：
+ [使用 Amazon Redshift 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)

# 教學課程：建置多類別分類模型
<a name="tutorial_multi-class_classification"></a>

在本教學課程中，您會使用 Amazon Redshift ML 建立可解決多類別分類問題的機器學習模型。多類別分類演算法將資料點分類為三個或多個類別之一。然後，您可以使用 CREATE MODEL 命令所產生的 SQL 函數來實作查詢。

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

若要按照本教學課程進行操作，您可以使用公共資料集[電子商務銷售預測](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. 下列查詢會將[電子商務銷售預測資料集](https://www.kaggle.com/allunia/e-commerce-sales-forecast)中的範例資料複製到 `ecommerce_sales` 資料表中。

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

### 分割資料
<a name="tutorial_multi-class_classification_split_data"></a>

當您在 Amazon Redshift ML 中建立模型時，SageMaker AI 會自動將您的資料分割為訓練和測試集，如此 SageMaker AI 就能判斷模型的準確性。透過在此步驟手動分割資料，您將能夠透過配置額外預測集來驗證模型的準確性。

使用下列 SQL 陳述式將資料分割成三組，以進行訓練、驗證和預測。

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

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

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

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

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

在此步驟中，您可以使用 CREATE MODEL 陳述式，使用多類別分類來建立機器學習模型。

下列查詢會使用 CREATE MODEL 操作建立具有訓練集的多類別分類模型。將 amzn-s3-demo-bucket 取代為您的 Amazon S3 儲存貯體。

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

在此查詢中，您可以將問題類型指定為 `Multiclass_Classification`。您為模型預測的目標是 `nbr_months_active`。SageMaker AI 完成模型訓練後，會建立函式 `predict_customer_activity`，您將使用該函式在 Amazon Redshift 中進行預測。

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

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

使用下列查詢傳回模型的各種指標，包括模型狀態和準確度。

```
SHOW MODEL ecommerce_customer_activity;
```

當模型準備就緒時，先前操作的輸出應會顯示 `Model State` 為 `Ready`。下列為 SHOW MODEL 操作的輸出範例。

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

## 步驟 3：執行模型的預測
<a name="tutorial_multi-class_classification_step_perform_predictions"></a>

以下查詢會顯示哪些客戶符合您客戶忠誠度計劃的資格。如果模型預測客戶至少有 7 個月的活躍時間，則模型會為忠誠度計劃選取該客戶。

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

### 針對驗證資料執行預測查詢 (選擇性)
<a name="tutorial_multi-class_classification_run_validation_prediction"></a>

針對驗證資料執行下列預測查詢，以查看模型的準確度層級。

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

### 預測有多少客戶錯失加入機會 (選擇性)
<a name="tutorial_multi-class_classification_run_missed_entries"></a>

下列查詢會比較預測只會在 5 或 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 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)

# 教學課程：建置 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)。

Amazon Redshift ML `CREATE MODEL` 操作與 `AUTO OFF` 選項目前支援 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) 來執行下列查詢。

下列查詢會建立兩個資料表、從 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` 指標用於測量模型準確度，可測量到小數點後六位。值為 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 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)

# 教學課程：建置迴歸模型
<a name="tutorial_regression"></a>

在本教學中，您會使用 Amazon Redshift ML 建立機器學習迴歸模型，並在模型上執行預測查詢。迴歸模型允許您預測數值結果，例如房屋的價格，或有多少人將使用城市的自行車租賃服務。您可以在 Amazon Redshift 中使用 CREATE MODEL 命令搭配訓練資料。然後，Amazon Redshift ML 會編譯模型，將經過訓練的模型匯入 Redshift，並準備 SQL 預測函數。您可以在 Amazon Redshift 中的 SQL 查詢中使用預測函數。

在本教學課程中，您將使用 Amazon Redshift ML 建置迴歸模型，以預測在一天中的任何特定時間使用多倫多市自行車共享服務的人數。模型的輸入包括假日和天氣條件。您將使用迴歸模型，因為您想要此問題的數值結果。

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

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

您可以使用 Amazon Redshift ML 解決其他迴歸問題，例如預測客戶的終身價值。您也可以使用 Redshift ML 來預測最有利的價格和產生的產品收入。

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

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

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

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

使用 [Amazon Redshift 查詢編輯器 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) 來執行下列查詢。

1. 您必須建立三個資料表，才能將三個公開資料集載入 Amazon Redshift。資料集是[多倫多自行車乘客資料](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` 的新檢視簡化資料表。

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

1. 下面的查詢會建立一個資料表，該資料表會將 `ridership_view` 和 `weather_view` 中的所有相關輸入屬性結合到 `trip_data` 資料表中。

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

### 檢視範例資料 (選擇性)
<a name="tutorial_regression_view_data"></a>

下列查詢會顯示資料表中的項目。您可以執行此操作，以確保資料表已正確製作。

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

下列為上一個操作的輸出範例。

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

### 顯示屬性之間的關聯 (選擇性)
<a name="tutorial_regression_show_correlation"></a>

確定相關性有助於測量屬性之間的關聯強度。關聯層級可協助您判斷哪些因素會影響您的目標輸出。在此教學課程中，目標輸出為 `trip_count`。

下列查詢會建立或取代 `sp_correlation` 程序。您可以使用名為 `sp_correlation` 的預存程序來顯示 Amazon Redshift 中資料表內屬性之間的關聯性。

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

下面的查詢顯示目標列、`trip_count` 和我們的資料集中的其他數字屬性之間的相關性。

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

SELECT
    *
FROM
    tmp_corr_table;
```

下列範例顯示上一個 `sp_correlation` 操作的輸出。

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

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

1. 下列查詢會將您的資料分割為訓練集和驗證集，並指定 80% 的資料集用於訓練，而 20% 的資料集用於驗證。訓練集是 ML 模型的輸入，用於識別模型的最佳演算法。建立模型之後，您可以使用驗證集來驗證模型的準確度。

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

1. 下列查詢會建立迴歸模型，以預測任何輸入日期和時間的 `trip_count` 值。在下列範例中，請將 amzn-s3-demo-bucket 取代為您的 S3 儲存貯體。

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

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

1. 使用下列查詢來輸出模型的各個層面，並在輸出中尋找均方誤差指標。均方誤差是迴歸問題的典型準確指標。

   ```
   show model predict_rental_count;
   ```

1. 針對驗證資料執行下列預測查詢，以比較預測的行程計數與實際的行程計數。

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

1. 下列查詢會根據驗證資料計算均方誤差和均方根誤差。您可以使用均方誤差和均方根誤差來測量預測數值目標與實際數值答案之間的距離。一個好的模型在這兩個指標中的分數都很低。下列查詢會傳回這兩個指標的值。

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

1. 下列查詢會針對 2017-01-01 的每個行程時間計算行程計數中的百分比誤差。查詢會將行程時間從百分比誤差最低的時間排序到百分比誤差最高的時間。

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

## 相關主題
<a name="tutorial_regression_related_topics"></a>

如需 Amazon Redshift ML 的相關資訊，請參閱下列文件：
+ [使用 Amazon Redshift 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)

# 教學課程：使用線性學習程式建置迴歸模型
<a name="tutorial_linear_learner_regression"></a>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

```
SHOW MODEL model_abalone_ring_prediction;
```

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

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

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

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

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

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

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

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

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

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

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

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

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

## 相關主題
<a name="tutorial_linear_learner_regression_related_topics"></a>

如需 Amazon Redshift ML 的相關資訊，請參閱下列文件：
+ [使用 Amazon Redshift ML 的成本](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)
+ [CREATE MODEL 操作](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_MODEL.html)
+ [EXPLAIN\$1MODEL 函數](https://docs.aws.amazon.com/redshift/latest/dg/r_explain_model_function.html)

如需機器學習的相關資訊，請參閱下列文件：
+ [機器學習概述](https://docs.aws.amazon.com/redshift/latest/dg/machine_learning_overview.html)
+ [適用於新手和專家的機器學習](https://docs.aws.amazon.com/redshift/latest/dg/novice_expert.html)
+ [什麼是機器學習預測的公平性和模型解釋性？](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html)

# 教學課程：使用線性學習程式建置多類別分類模型
<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 預測函數。使用 CREATE MODEL 操作，將訓練資料指定為資料表或 SELECT 陳述式。

線性學習程式模型可最佳化連續目標或離散目標。連續目標用於迴歸，而離散變數用於分類。某些方法會僅針對連續目標提供解決方案，例如迴歸方法。與單純的超參數最佳化技術 (例如 Naive Bayes 技術) 相比，線性學習程式演算法的速度更快。單純的最佳化技術會假定每個輸入變數都是獨立的。線性學習程式演算法可同時訓練許多模型，並選取最佳化程度最高的模型。一個類似的算法是 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 機器學習儲存庫的 [Covertype 資料集](https://archive.ics.uci.edu/ml/datasets/covertype)上使用 CREATE MODEL 命令。然後，您可以使用命令建立的預測函數來判斷荒野區域中的覆蓋類型。森林覆蓋類型通常是一個樹種。Redshift ML 將用於建立模型的輸入包括土壤類型、與道路的距離以及荒野區域指定。如需資料集的相關資訊，請參閱 UCI 機器學習儲存庫中的 [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. 透過手動分割資料，您將能夠透過配置額外測試集來驗證模型的準確性。下面的查詢會將資料分成三組。`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` 中最常見的覆蓋類型。此資料集包括四個荒野區域和七種覆蓋類型。一個荒野區域可以有多種覆蓋類型。

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

   先前操作的輸出看起來應與下列範例類似。該輸出意味著該模型預測大部分覆蓋是覆蓋類型 1，並且有一些覆蓋類型 2 和 7。

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

1. 下列查詢會顯示單一荒野區域中最常見的覆蓋類型。查詢會顯示該覆蓋類型的數量和覆蓋類型的荒野區域。

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

   先前操作的輸出看起來應與下列範例類似。

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

## 相關主題
<a name="tutorial_linear_learner_multi-class_classification_related_topics"></a>

如需 Amazon Redshift ML 的相關資訊，請參閱下列文件：
+ [使用 Amazon Redshift 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)

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

本節示範如何建立 IAM 角色，以搭配 Amazon Redshift ML 與 Amazon Bedrock 整合使用。

將下列政策新增至您搭配 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` 命令與 Amazon Bedrock 之間有整合一致的介面，適用於支援訊息的所有基礎模型 (FM)。這是使用 `CREATE EXTERNAL MODEL` 命令或明確指定 `UNIFIED` 為請求類型時的預設選項。如需詳細資訊，請參閱 *Amazon Bedrock API 文件*中的 [Converse API 文件](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)。

如果 FM 不支援訊息，則您必須將 `request_type` 設定設為 `RAW`，如下列範例所示。當您將 `request_type` 設定為 `RAW` 時，您必須在根據選取的 FM 使用推論函式時，建構傳送至 Amazon Bedrock 的請求。執行下列範例之前，請務必在 Amazon Bedrock 中啟用 Titan Text G1 - Express 模型的存取權。

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

如果您需要輸入請求 (例如字符總數) 的詳細資訊，您可以在建立模型時請求 `RESPONSE_TYPE` 為 `super`。

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

`CREATE EXTERNAL MODEL` 命令的 `PROMPT` 參數是靜態提示。如果您的應用程式需要動態提示，則您必須在使用推論函式時指定提示。如需詳細資訊，請參閱[Amazon Redshift ML 與 Amazon Bedrock 整合的提示工程](#machine-learning-br-prompt)。

如需有關 `CREATE EXTERNAL MODEL` 陳述式及其參數和設定的詳細資訊，請參閱 [CREATE EXTERNAL MODEL](r_create_external_model.md)。

## 針對 Amazon Redshift ML 與 Amazon Bedrock 整合使用外部模型
<a name="machine-learning-br-use"></a>

本節說明如何調用外部模型來產生文字，以回應提供的提示。若要調用外部模型，請使用您透過 `CREATE EXTERNAL MODEL` 建立的推論函式。

**Topics**
+ [使用 `UNIFIED` 請求類型模型進行推論](#machine-learning-br-use-unified)
+ [使用 `RAW` 請求類型模型進行推論](#machine-learning-br-use-raw)
+ [推論函式作為僅限領導函式](#machine-learning-br-use-leader)
+ [推論函式使用須知](#machine-learning-br-use-usage)

### 使用 `UNIFIED` 請求類型模型進行推論
<a name="machine-learning-br-use-unified"></a>

請求類型為 `UNIFIED` 之模型的推論函式包有下列三個參數，這些參數會依序傳遞至函式：
+ **輸入文字** (必要)：此參數指定 Amazon Redshift 傳遞至 Amazon Bedrock 的輸入文字。
+ **推論組態**和**其他模型請求欄位** (選用)：Amazon Redshift 會將這些參數傳遞至 Converse 模型 API 的對應參數。

下列程式碼範例示範如何使用 `UNIFIED` 類型推論函式：

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

### 使用 `RAW` 請求類型模型進行推論
<a name="machine-learning-br-use-raw"></a>

請求類型為 `RAW` 之模型的推論函式只有一個資料類型為 `SUPER` 的參數。此參數的語法取決於使用的 Amazon Bedrock 模型。

下列程式碼範例示範如何使用 `RAW` 類型推論函式：

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

### 推論函式作為僅限領導函式
<a name="machine-learning-br-use-leader"></a>

當使用推論函式的查詢未參考任何資料表時，Amazon Bedrock 模型的推論函式可以作為僅限領導節點函式執行。如果您想要快速向 LLM 提出問題，這種方式會很有幫助。

下列程式碼範例示範如何使用僅限領導推論函式：

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

### 推論函式使用須知
<a name="machine-learning-br-use-usage"></a>

使用推論函式搭配 Amazon Redshift ML 與 Amazon Bedrock 整合時，請注意下列事項：
+ 所有 Amazon Bedrock 模型的參數名稱均區分大小寫。如果您的參數與模型所需的參數不符，Amazon Bedrock 可能會將其忽略而不顯示任何通知。
+ 推論查詢的輸送量受限於 Amazon Bedrock 在不同區域中所提供不同模型的執行時期配額。如需詳細資訊，請參閱《Amazon Bedrock 使用者指南》**中的 [Amazon Bedrock 的配額](https://docs.aws.amazon.com/bedrock/latest/userguide/quotas.html)。
+ 如果您需要有保證且一致的輸送量，請考慮從 Amazon Bedrock 為所需模型取得佈建輸送量。如需詳細資訊，請參閱《Amazon Bedrock 使用者指南》**中的[在 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 帳戶中的 **Service Quotas** 下查看配額。檢查套用的帳戶層級配額至少與您正在使用的模型之 **InvokeModel** 請求 AWS 的預設配額值相同。

## Amazon Redshift ML 與 Amazon Bedrock 整合的提示工程
<a name="machine-learning-br-prompt"></a>

本節說明如何搭配外部模型使用靜態提示。

若要在外部模型中使用靜態字首和字尾提示，請使用 `CREATE EXTERNAL MODEL` 陳述式的 `PROMPT` 和 `SUFFIX` 參數提供提示。這些提示會新增至每個使用外部模型的查詢。

下列範例示範如何將字首和字尾提示新增至外部模型：

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

若要使用動態提示，您可以在使用推論函式時，藉由在函式輸入中串連提示的方式來提供。下列範例示範如何搭配推論函式使用動態提示：

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