Amazon Redshift ML 入门 - Amazon Redshift

Amazon Redshift ML 入门

Amazon Redshift ML 使 SQL 用户可以轻松地使用熟悉的 SQL 命令创建、训练和部署机器学习模型。通过使用 Amazon Redshift ML,您可以使用 Redshift 集群中的数据来通过 Amazon SageMaker 训练模型。随后,模型将会本地化,并可在 Amazon Redshift 数据库中进行预测。Amazon Redshift ML 目前支持机器学习算法:XGBoost(AUTO ON 和 OFF)和多层感知(AUTO ON)、K-Means(AUTO OFF)以及线性学习器。

为 Amazon Redshift ML 配置集群和管理设置

在使用 Amazon Redshift ML 之前,请完成集群设置并配置使用 Amazon Redshift ML 的权限。

用于使用 Amazon Redshift ML 的集群设置

在使用 Amazon Redshift ML 之前,请先完成以下先决条件。

作为 Amazon Redshift 管理员,请执行以下一次性设置以使用 Amazon Redshift 预配置的集群。有关将 Amazon Redshift ML 与 Amazon Redshift Serverless 结合使用的信息,请参阅《Amazon Redshift Serverless 入门》

为 Amazon Redshift ML 执行一次性集群设置:

  1. 使用AWS Management Console或 AWS Command Line Interface(AWS CLI)创建 Amazon Redshift 集群。确保在创建集群时附上 AWS Identity and Access Management(IAM)策略。有关将 Amazon Redshift ML 与 Amazon SageMaker 结合使用所需的权限的更多信息,请参阅使用 Amazon Redshift 机器学习(ML)所需的权限

  2. 通过下列方式之一创建使用 Amazon Redshift ML 所需的 IAM 角色:

    • 要将 SageMaker 与 Amazon Redshift ML 结合使用,请使用 AmazonS3FullAccessAmazonSageMakerFullAccess 策略创建一个 IAM 角色。如果您计划还要创建预测模型,请将 AmazonForecastFullAccess 策略也附加到您的角色。

    • 要将 Amazon Bedrock 与 Amazon Redshift ML 结合使用,请使用 AmazonS3FullAccessAmazonBedrockFullAccess 策略创建一个 IAM 角色。

    • 我们建议您通过 Amazon Redshift 控制台创建一个 IAM 角色,该角色拥有 AmazonRedshiftAllCommandsFullAccess 策略,具备运行 SQL 命令(例如 CREATE MODEL)的权限。Amazon Redshift 使用基于 API 的无缝机制以编程方式在您的 AWS 账户 中代表您创建 IAM 角色。Amazon Redshift 会自动将现有的 AWS 托管式策略附加到该 IAM 角色。这种方法表示您可以停留在 Amazon Redshift 控制台中,无需切换到 IAM 控制台进行角色创建。有关更多信息,请参阅为 Amazon Redshift 创建默认 IAM 角色

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

      如果您的集群启用了增强型 Amazon VPC 路由,则可以使用通过 Amazon Redshift 控制台创建的 IAM 角色。此 IAM 角色附加 AmazonRedshiftAllCommandsFullAccess 策略并向策略添加以下权限。这些额外权限允许 Amazon Redshift 在您的账户中创建和删除弹性网络接口(ENI),并将其附加到 Amazon EC2 或 Amazon ECS 上运行的编译任务。这样做使您的 Simple Storage Service(Amazon S3)桶中的对象只能通过互联网访问被阻止的 Virtual Private Cloud(VPC)进行访问。

      { "Effect": "Allow", "Action": [ "ec2:DescribeVpcEndpoints", "ec2:DescribeDhcpOptions", "ec2:DescribeVpcs", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterfacePermission", "ec2:DeleteNetworkInterface", "ec2:CreateNetworkInterfacePermission", "ec2:CreateNetworkInterface", "ec2:ModifyNetworkInterfaceAttribute" ], "Resource": "*" }

      要使用 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-idyour-roleamzn-s3-demo-bucket 的值是您作为 CREATE MODEL 命令的一部分指定的值。

      (可选)如果您在使用 Amazon Redshift ML 时指定了一个 AWS KMS 键,请使用示例策略的 AWS KMS 键部分。your-kms-key 值是作为 CREATE MODEL 命令一部分使用的密钥。

      { "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::<your-account-id>: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" ] } // Optional section needed if you use AWS KMS keys. ,{ "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt", "kms:GenerateDataKey*" ], "Resource": [ "arn:aws:kms:<your-region>:<your-account-id>:key/<your-kms-key>" ] } ] }
  3. 要允许 Amazon Redshift 和 SageMaker 担任角色以与其他服务交互,请将以下信任策略添加到 IAM 角色。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "redshift.amazonaws.com", "sagemaker.amazonaws.com", "forecast.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
  4. (可选)创建 Simple Storage Service(Amazon S3)桶和 AWS KMS 密钥。供 Amazon Redshift 用来存储发送到 Amazon SageMaker 的训练数据以及从 Amazon SageMaker 接收训练模型。

  5. (可选)创建 IAM 角色和 Simple Storage Service(Amazon S3)桶的不同组合,以控制对不同用户组的访问。

  6. (可选)当您在 Redshift 集群上启用 VPC 路由时,请为您的 Redshift 集群所在的 VPC 创建 Simple Storage Service(Amazon S3)端点和 SageMaker 端点。这样做使得流量可以在 CREATE MODEL 期间通过您的 VPC 在服务之间运行。有关 VPC 路由的更多信息,请参阅 Amazon Redshift 中的增强型 VPC 路由

    有关为超参数优化任务指定私有 VPC 所需的权限的更多信息,请参阅将 Amazon Redshift ML 与 Amazon SageMaker 结合使用所需的权限

有关如何使用 CREATE MODEL 语句开始为不同的使用案例创建模型的信息,请参阅CREATE MODEL

管理权限和所有权

正如其它数据库对象(例如表或函数)一样,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_analyst_grp GROUP 使用该模型的权限。

GRANT EXECUTE ON MODEL demo_ml.customer_churn_auto_model TO GROUP marketing_analyst_grp;

将 REVOKE 语句与 CREATE MODEL 和 EXECUTE 一起使用,取消用户或组的这些权限。有关权限控制命令的更多信息,请参阅GRANTREVOKE

将模型可解释性与 Amazon Redshift ML 结合使用

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

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

Amazon Redshift ML 融入了模型可解释性,为 Amazon Redshift ML 用户提供模型解释功能。有关模型可解释性的更多信息,请参阅《Amazon SageMaker 开发人员指南》中的什么是机器学习预测的公平性和模型可解释性?

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

当您在使用 CREATE MODEL 语句时指定 AUTO ON 或 AUTO OFF 选项时,在模型训练任务完成后,SageMaker 将创建解释输出。您可以使用 EXPLAIN_MODEL 函数查询 JSON 格式的可解释性报告。有关更多信息,请参阅 机器学习函数。

Amazon Redshift ML 概率指标

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

创建模型

创建模型时,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'

获取概率

概率函数准备就绪后,运行该命令会返回一个 SUPER 类型,其中包含返回概率的数组及其关联标签。例如,结果 "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