

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# Machine Learning
<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_cn/redshift/latest/dg/images/machine_learning_overview.png)


常见工作流程如下：

1. Amazon Redshift 将训练数据导出到 Simple Storage Service（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 进行训练。因此，训练模型会产生相关的成本。这是 Amazon SageMaker AI 在您的 AWS 账单中的单独行项目。您还需要为 Simple Storage Service（Amazon S3）中用于存储训练数据的存储支付费用。使用可在 Redshift 集群上编译和运行的 CREATE MODEL 创建的模型进行推断不会产生费用。使用 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-Means 集群算法来解决无监督学习问题。此算法可解决需要在数据中发现分组的集群问题。K-Means 算法尝试在数据中寻找离散分组。根据未分类数据的相似与不同之处进行分组和分区。通过分组，K-Means 算法以迭代方式确定最佳质心，并将每个成员分配给最近的质心。离同一质心最近的成员属于同一组。一个组的成员尽可能与同一组中的其它成员相似，并与其它组的成员尽可能不同。例如，K-Means 集群算法可用于对受疫情影响的城市进行分类，或根据消费品的受欢迎程度对城市进行分类。

使用 K-Means 算法时，您可以指定输入 `k`，该值指定要在数据中寻找的集群数量。此算法的输出是一组 k 个质心。每个数据点属于离其最近的 k 个集群之一。每个集群通过其质心进行描述。质心可以视为集群的多维平均值。K-Means 算法对距离进行比较，以了解集群之间的差异。距离越大通常表示集群之间的差异越大。

预处理数据对 K-Means 很重要，因为它可以确保模型的特征保持在相同的尺度上并生成可靠的结果。Amazon Redshift 支持一些用于 CREATE MODEL 语句的 K-Means 预处理器，例如 StandardScaler、MinMax 和 NumericPassthrough。如果您不想对 K-Means 应用任何预处理，请明确选择 NumericPassthrough 作为转换器。有关 K-Means 参数的更多信息，请参阅[带有 K-MANES 参数的 CREATE MODEL](r_create_model_use_cases.md#r_k-means-create-model-parameters)。

为了帮助您了解如何使用 K-Means 集群执行无监督训练，您可以观看以下视频。

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


## Amazon Redshift 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 开发人员指南》**中的 [What is Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html)。
+ *Amazon SageMaker AI Autopilot* 是一个功能集，可根据您的数据自动训练和调整用于分类或回归的最佳机器学习模型。您可以保持完全的控制和可见性。Amazon SageMaker AI Autopilot 支持以表格格式输入数据。Amazon SageMaker AI Autopilot 提供自动数据清理和预处理、线性回归的自动算法选择、二元分类和多分类器功能。它还支持自动超参数优化 (HPO)、分布式训练、自动实例和集群大小选择。有关 Amazon SageMaker AI Autopilot 的信息，请参阅《Amazon SageMaker AI 开发人员指南》**中的 [Automate model development with 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 等领先人工智能公司的高性能基础模型（FM）以及构建生成式人工智能应用程序所需的各种功能。

# 面向新手和专家的机器学习
<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 仍然会发现剩余功能的最佳预处理器和最佳超参数。有关如何约束训练管道的一个或多个方面的更多信息，请参阅[根据用户指导创建模型](r_create_model_use_cases.md#r_user_guidance_create_model)。
+ 作为*机器学习专家*，您可以完全控制训练和超参数调整。然后，CREATE MODEL 语句不会尝试发现最佳预处理器、算法和超参数，因为您做出了所有选择。有关如何将 CREATE MODEL 语句与 AUTO OFF 结合使用的更多信息，请参阅[带有 AUTO OFF 的 CREATE XGBoost 模型](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 用户，您可以选择以下任何选项来训练和部署模型：
+ 问题类型，请参阅[根据用户指导创建模型](r_create_model_use_cases.md#r_user_guidance_create_model)。
+ 目标，请参阅[根据用户指导创建模型](r_create_model_use_cases.md#r_user_guidance_create_model)或者[带有 AUTO OFF 的 CREATE XGBoost 模型](r_create_model_use_cases.md#r_auto_off_create_model)。
+ 模型类型，请参阅[带有 AUTO OFF 的 CREATE XGBoost 模型](r_create_model_use_cases.md#r_auto_off_create_model)。
+ 预处理器，请参阅[根据用户指导创建模型](r_create_model_use_cases.md#r_user_guidance_create_model)。
+ 超参数，请参阅[带有 AUTO OFF 的 CREATE XGBoost 模型](r_create_model_use_cases.md#r_auto_off_create_model)。
+ 自带模型 (BYOM)，请参阅[自带模型 (BYOM) – 本地推理](r_create_model_use_cases.md#r_byom_create_model)。

# 使用 Amazon Redshift ML 的成本
<a name="cost"></a>

借助 Amazon Redshift，您可以利用机器学习功能从数据中获得见解，而无需大量的数据工程或机器学习专业知识。以下各节将介绍使用 Amazon Redshift ML 的相关成本，有助于您在利用这一强大的机器学习集成的同时规划和优化支出。

## 将 Amazon Redshift ML 与 SageMaker AI 结合使用的成本
<a name="cost_sm"></a>

Amazon Redshift ML for SageMaker AI 使用您现有的集群资源进行预测，因此您可以避免额外的 Amazon Redshift 费用。创建或使用模型不会产生额外的 Amazon Redshift 费用。预测在 Amazon 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（即训练数据集中的“列数”记录），然后使用这些随机选择的元组执行训练。随机采样可确保减少的训练数据集不会有任何偏差。因此，通过设置 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 会减少 CREATE MODEL 中的 SELECT 查询结果中的行数，Amazon Redshift 会导出该结果并发送到 SageMaker AI 来训练模型。在 AUTO ON 和 AUTO OFF 下，减少 MAX\$1CELLS 均可减小用于训练模型的数据集的大小。这种方法有助于降低训练模型的成本和时间。要查看有关特定训练作业的训练和计费时间的信息，请在 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-Means（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（AWS CLI）创建 Amazon Redshift 集群。确保在创建集群时附上 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 角色，该角色拥有 `AmazonRedshiftAllCommandsFullAccess` 策略，具备运行 SQL 命令（例如 CREATE MODEL）的权限。Amazon Redshift 使用基于 API 的无缝机制以编程方式在您的 AWS 账户 中代表您创建 IAM 角色。Amazon Redshift 会自动将现有的 AWS 托管式策略附加到该 IAM 角色。这种方法表示您可以停留在 Amazon Redshift 控制台中，无需切换到 IAM 控制台进行角色创建。有关更多信息，请参阅[为 Amazon Redshift 创建默认 IAM 角色](https://docs.aws.amazon.com/redshift/latest/mgmt/default-iam-role.html)。

     创建 IAM 角色作为集群的默认角色时，将 `redshift` 添加为资源名称的一部分，或使用 RedShift 特定标签来标记这些资源。

     要使用 Amazon Bedrock 基础模型，请添加以下部分：

     ```
     // Required section if you use Bedrock models.
     {
        "Effect": "Allow",
        "Action": "bedrock:InvokeModel",
        "Resource": [
            "arn:aws:bedrock:<region>::foundation-model/*"
        ]
     }
     ```
   + 如果您要使用更具限制性的策略创建 IAM 角色，您可以使用以下策略。您还可以修改此策略以满足您的需求。

     Amazon S3 桶 `redshift-downloads/redshift-ml/` 是存储用于其他步骤和示例的示例数据的位置。如果您不需要从 Simple Storage Service（Amazon S3）加载数据，您可以将其删除。或者，将其替换为您用于将数据加载到 Amazon Redshift 的其他 Simple Storage Service（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. （可选）创建 Simple Storage Service（Amazon S3）桶和 AWS KMS 密钥。这些信息供 Amazon Redshift 用来存储发送到 Amazon SageMaker AI 的训练数据以及从 Amazon SageMaker AI 接收训练模型。

1. （可选）创建 IAM 角色和 Simple Storage Service（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 Redshift ML 与 Amazon SageMaker AI 结合使用所需的权限](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html)。
**注意**  
对远程 SageMaker AI 模型发出的推理调用不经由您的 VPC。

有关如何使用 CREATE MODEL 语句开始为不同的使用案例创建模型的信息，请参阅[CREATE MODEL](r_CREATE_MODEL.md)。

### 管理权限和所有权
<a name="permissions-ownership"></a>

正如其它数据库对象（例如表或函数）一样，Amazon Redshift 将创建和使用 ML 模型绑定到访问控制机制。这些是创建运行预测函数的模型所需的单独权限。

以下示例使用两个用户组：`retention_analyst_grp`（模型创建者）和 `marketing_analyst_grp`（模型用户）来说明 Amazon Redshift 如何管理访问控制。保留分析师创建机器学习模型，其它用户可以通过获得的权限使用这些模型。

超级用户可以使用以下语句授予 USER 或 GROUP 创建机器学习模型的权限。

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

具有此权限的用户或组可以在集群中的任何架构中创建模型，前提是用户对 SCHEMA 具有通常的 CREATE 权限。机器学习模型是架构层次结构的一部分，方式类似于表、视图、过程和用户定义的函数。

假设架构 `demo_ml` 已存在，请按如下方式授予两个用户组对架构的权限。

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

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

要让其它用户使用机器学习推理函数，请授予 EXECUTE 权限。以下示例使用 EXECUTE 权限授予 marketing\$1analyst\$1grp GROUP 使用该模型的权限。

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

将 REVOKE 语句与 CREATE MODEL 和 EXECUTE 一起使用，取消用户或组的这些权限。有关权限控制命令的更多信息，请参阅[GRANT](r_GRANT.md)和[REVOKE](r_REVOKE.md)。

## 将模型可解释性与 Amazon Redshift ML 结合使用
<a name="clarify"></a>

借助 Amazon Redshift ML 中的模型可解释性，您可以使用功能重要性值来帮助了解训练数据中的每个属性对预测结果的贡献。

模型可解释性解释您的模型所做的预测，以此帮助改善您的机器学习（ML）模型。模型可解释性有助于解释这些模型如何使用功能归因方法进行预测。

Amazon Redshift ML 融入了模型可解释性，为 Amazon Redshift ML 用户提供模型解释功能。有关模型可解释性的更多信息，请参阅《Amazon SageMaker AI 开发人员指南》**中的 [What Is Fairness and Model Explainability for Machine Learning Predictions?](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html)。

模型可解释性还监控模型在生产过程中针对功能归因偏移所做的推断。它还提供了一些工具来帮助您生成模型监管报告，供您用来告知风险和合规团队以及外部监管机构。

如果您在使用 CREATE MODEL 语句时指定了 AUTO ON 或 AUTO OFF 选项，则在模型训练作业完成后，SageMaker AI 将创建解释输出。您可以使用 EXPLAIN\$1MODEL 函数查询 JSON 格式的可解释性报告。有关更多信息，请参阅 [机器学习函数。](ml-function.md)。

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

 在有监督学习问题中，分类标签是使用输入数据进行预测的结果。例如，如果您使用模型来预测客户是否会重新订阅流式服务，那么可能的标签是“可能”和“不太可能”。Redshift ML 提供了概率指标的功能，该功能为每个标签分配一个概率以指明其可能性。这可以帮助您根据预测结果作出更明智的决策。在 Amazon Redshift ML 中，使用二进制分类或多分类器问题类型创建 AUTO ON 模型时提供了概率指标。如果您省略 AUTO ON 参数，Redshift ML 会假定模型应具有 AUTO ON。

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

 创建模型时，Amazon Redshift 会自动检测模型类型和问题类型。如果是分类问题，Redshift 会自动创建第二个推理函数，您可以使用该函数输出与每个标签相关的概率。第二个推理函数的名称是您指定的推理函数名称，后面再加上字符串 `_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 用于 Simple Storage Service（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-KMS) 对您的输入进行加密，则添加以下权限：

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

有关 Amazon SageMaker AI 角色的更多信息，请参阅《Amazon SageMaker AI 开发人员指南》**中的 [Amazon SageMaker AI roles](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html)。

### 检查模型训练的状态（可选）
<a name="tutorial_customer_churn_check_status"></a>

您可以使用 SHOW MODEL 命令来了解模型何时准备就绪。

使用以下操作检查模型的状态。

```
SHOW MODEL customer_churn_auto_model;
```

以下是上一个操作的输出示例。

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

模型训练完成后，`model_state` 变量变为 `Model is Ready`，预测函数变为可用。

## 步骤 3：使用模型执行预测
<a name="tutorial_customer_churn_step_perform_predictions"></a>

您可以使用 SQL 语句来查看预测模型所做的预测。在此示例中，由 CREATE MODEL 操作创建的预测函数名为 `ml_fn_customer_churn_auto`。预测函数的输入参数对应于功能的类型，如 varchar 对应于 `state`，而 integer 对应于 `account_length`。预测函数的输出类型与 CREATE MODEL 语句的 TARGET 列相同。

1. 您根据 2020 年 1 月 1 日之前的数据对模型进行了训练，因此，现在您可以对测试集使用预测函数。以下查询显示了 2020 年 1 月 1 日之后注册的客户是否会经历流失的预测。

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

1. 以下示例将相同的预测函数用于不同的使用案例。在此案例中，Amazon Redshift 预测记录日期晚于 2020 年 1 月 1 日的各州客户的流失者和非流失者的比例。

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

1. 以下示例将预测函数用于预测某州客户流失百分比的使用案例。在此案例中，Amazon Redshift 预测记录日期晚于 2020 年 1 月 1 日的流失百分比。

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

## 相关主题
<a name="tutorial_customer_churn_related_topics"></a>

有关 Amazon Redshift ML 的更多信息，请参阅以下文档：
+ [使用 Amazon Redshift ML 的成本](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)
+ [CREATE MODEL 命令](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_MODEL.html)
+ [EXPLAIN\$1MODEL 函数](https://docs.aws.amazon.com/redshift/latest/dg/r_explain_model_function.html)

有关机器学习的更多信息，请参阅以下文档：
+ [机器学习概览](https://docs.aws.amazon.com/redshift/latest/dg/machine_learning_overview.html)
+ [面向新手和专家的机器学习](https://docs.aws.amazon.com/redshift/latest/dg/novice_expert.html)
+ [机器学习预测的公平性和模型可解释性是什么？](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html)

# 教程：构建 K 均值聚类模型
<a name="tutorial_k-means_clustering"></a>

在本教程中，您使用 Amazon Redshift ML 基于 [K 均值算法](url-sm-dev;k-means.html)，创建、训练和部署一个机器学习模型。此算法可解决需要在数据中发现分组的集群问题。K 均值有助于对尚未标注的数据进行分组。要了解有关 K 均值聚类的更多信息，请参阅《Amazon SageMaker AI 开发人员指南》中的 [How K-means Clustering Works](https://docs.aws.amazon.com/sagemaker/latest/dg/algo-kmeans-tech-notes.html)。

您将使用 CREATE MODEL 操作从 Amazon Redshift 集群创建 K 均值模型。您可以使用 CREATE MODEL 命令导出训练数据、训练模型、导入模型以及准备 Amazon Redshift 预测函数。使用 CREATE MODEL 操作将训练数据指定为表或 SELECT 语句。

在本教程中，您将对[全球事件、语言和语调数据库（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>

以下查询显示哪些客户有资格加入您的客户忠诚度计划。如果模型预测客户将活跃至少七个月，则模型将选择该客户加入忠诚度计划。

```
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 algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html)。

带有 `AUTO OFF` 选项的 Amazon Redshift ML `CREATE MODEL` 操作当前支持将 XGBoost 作为 `MODEL_TYPE`。根据您的使用案例，您可以在 `CREATE MODEL` 命令中提供相关信息，例如目标和超参数。

在本教程中，您将使用[钞票验证数据集](https://archive.ics.uci.edu/ml/datasets/banknote+authentication)，这是一个二进制分类问题，用于预测给定的钞票是真钞还是假钞。

## 使用案例示例
<a name="tutorial_xgboost_tasks"></a>

您可以使用 Amazon Redshift ML 解决其他二进制分类问题，例如预测接受治疗者是健康的还是患有疾病。您还可以预测电子邮件是否为垃圾邮件。

**任务**：
+ 先决条件
+ 步骤 1：将数据从 Amazon S3 加载到 Amazon Redshift
+ 步骤 2：创建机器学习模型
+ 步骤 3：使用模型执行预测

## 先决条件
<a name="tutorial_xgboost_prereqs"></a>

要完成此教程，必须完成 Amazon Redshift ML 的[管理设置](https://docs.aws.amazon.com/redshift/latest/dg/admin-setup.html)。

## 步骤 1：将数据从 Amazon S3 加载到 Amazon Redshift
<a name="tutorial_xgboost_step_load"></a>

使用 [Amazon Redshift 查询器 v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) 运行以下查询。

以下查询创建两个表，从 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 年 1 月 1 日每次行程时间的行程计数误差百分比。该查询对行程时间进行排序，采用的顺序为从误差百分比最低的时间到误差百分比最高的时间。

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

## 相关主题
<a name="tutorial_regression_related_topics"></a>

有关 Amazon Redshift ML 的更多信息，请参阅以下文档：
+ [使用 Amazon Redshift 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 开发人员指南》中的 [Problem types for the machine learning paradigms](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 开发人员指南》中的 [Linear Learner Algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)。

您可以使用 CREATE MODEL 命令导出训练数据、训练模型、导入模型以及准备 Amazon Redshift 预测函数。使用 CREATE MODEL 操作将训练数据指定为表或 SELECT 语句。

线性学习器模型可以优化连续目标或离散目标。连续目标用于回归，而离散变量用于分类。一些方法仅为连续目标提供解决方案，例如回归方法。线性学习器算法提供了比朴素超参数优化技术（如朴素贝叶斯技术）更快的速度。朴素优化技术假定每个输入变量都是独立的。要使用线性学习器算法，必须提供表示输入维度的列和表示观察值的行。有关线性学习器算法的更多信息，请参阅《Amazon SageMaker AI 开发人员指南》中的 [Linear Learner Algorithm](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. 使用以下查询对预测函数运行 EXPLAIN\$1MODEL 操作。该操作将返回模型可解释性报告。有关 EXPLAIN\$1MODEL 操作的更多信息，请参阅《Amazon Redshift 数据库开发人员指南》中的 [EXPLAIN\$1MODEL 函数](https://docs.aws.amazon.com/redshift/latest/dg/r_explain_model_function.html)。

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

   以下信息是之前的 EXPLAIN\$1MODEL 操作生成的模型可解释性报告的示例。每个输入的值都是 Shapley 值。Shapley 值表示每个输入对模型预测的影响，值较高的输入对预测的影响更大。在此示例中，值较高的输入对预测鲍鱼年龄的影响更大。

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

1. 使用以下查询计算模型对尚未成熟的鲍鱼进行正确预测的百分比。未成熟的鲍鱼有 10 个或更少的环，正确的预测精确到实际环数的一个环内。

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

## 相关主题
<a name="tutorial_linear_learner_regression_related_topics"></a>

有关 Amazon Redshift ML 的更多信息，请参阅以下文档：
+ [使用 Amazon Redshift 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 开发人员指南》中的 [Problem types for the machine learning paradigms](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 开发人员指南》中的 [Linear Learner Algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)。

您可以使用 CREATE MODEL 命令导出训练数据、训练模型、导入模型以及准备 Amazon Redshift 预测函数。使用 CREATE MODEL 操作将训练数据指定为表或 SELECT 语句。

线性学习器模型可以优化连续目标或离散目标。连续目标用于回归，而离散变量用于分类。一些方法仅为连续目标提供解决方案，例如回归方法。线性学习器算法提供了比朴素超参数优化技术（如朴素贝叶斯技术）更快的速度。朴素优化技术假定每个输入变量都是独立的。线性学习器算法并行训练许多模型，并选择最优化的模型。一种类似的算法是 XGBoost，它将来自一组更简单和更弱模型的估计值结合起来进行预测。要了解有关 XGBoost 的更多信息，请参阅《Amazon SageMaker AI 开发人员指南》中的 [XGBoost algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html)。

要使用线性学习器算法，必须提供表示输入维度的列和表示观察值的行。有关线性学习器算法的更多信息，请参阅《Amazon SageMaker AI 开发人员指南》中的 [Linear Learner Algorithm](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html)。

在本教程中，您将构建一个线性学习器模型，用于预测给定区域的覆盖类型。对 UCI 机器学习存储库中的[覆盖类型数据集](https://archive.ics.uci.edu/ml/datasets/covertype)使用 CREATE MODEL 命令。然后，您可以使用由该命令创建的预测函数来确定荒野区域的覆盖类型。森林覆盖类型通常是一种树木。Redshift ML 将用于创建模型的输入包括土壤类型、到道路的距离和荒野区域指定范围。有关数据集的更多信息，请参阅 UCI 机器学习存储库中的[覆盖类型数据集](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 的[覆盖类型数据集](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 数据仓库中的数据来构建生成式人工智能应用，如文本生成、情绪分析或翻译。

**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:');
```

对于所有支持消息的基础模型（FM），`CREATE EXTERNAL MODEL` 命令与 Amazon Bedrock 具有统一一致的接口。在使用 `CREATE EXTERNAL MODEL` 命令或将请求类型明确指定为 `UNIFIED` 时，这是默认选项。有关更多信息，请参阅 *Amazon Bedrock API 文档*中的 [Converse API 文档](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)。

如果 FM 不支持消息，则您必须将 `request_type` 设置为 `RAW`，如下例所示。如果将 `request_type` 设置为 `RAW`，则在使用基于所选 FM 的推理函数时，必须构造发送到 Amazon Bedrock 的请求。运行以下示例之前，请确保在 Amazon Bedrock 中启用对 Titan Text G1 – Express 模型的访问权限。

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

如果您需要有关输入请求的更多信息（例如词元总数），可以在创建模型时请求将 `super` 设置为 `RESPONSE_TYPE`。

```
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 账户的**服务配额**下检查配额。检查所应用的账户级配额是否至少与针对您正在使用的模型的 **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
```