对数据科学家来说,R 语言无异于一个利器,能够十分不便直观地解决大量与数据分析无关的挑战。这样一个神器与 SageMaker 的机器学习能力相结合又能产生多大的威力?目前,曾经有不少 AWS 客户开始将风行的开源统计计算与图形软件 R 全面引入大数据分析与数据迷信畛域。
Amazon SageMaker 是一项全托管服务,可帮忙用户疾速实现机器学习(ML)模型的构建、训练与部署。Amazon SageMaker 打消了机器学习流程中各个步骤带来的沉重累赘,显著升高了高质量模型的开发门槛。2019 年 8 月,Amazon SageMaker 发表在所有区域都预装 R 内核。这项性能开箱即用,且事后装置有 reticulate 库,负责为 Amazon SageMaker Python SDK 提供 R 接口,帮忙用户间接从 R 脚本中调用 Python 模块。
在本文中,咱们将理解如何在 Amazon SageMaker notebook 实例上应用 R 实现机器学习模型的训练、部署与预测后果检索。此模型将依据鲍鱼贝壳上的圈纹数量预测鲍鱼的年龄。大家能够应用 reticulate 工具包实现 R 与 Python 对象之间的翻译,Amazon SageMaker 则提供无服务器环境,用于机器学习模型的大规模训练与部署。
要实现本篇文章,大家须要对 R 领有根本理解,并相熟以下 tidyverse 软件包:dplyr、readr、stringr 以及 ggplot2。
创立一个带有 R 内核的 Amazon SageMaker notebook实例
要创立一个预装 R 内核的 Amazon SageMaker notebook 实例,须要实现以下操作步骤:
- 创立一个 Notebook 实例。
咱们能够依据须要抉择实例类型与存储大小创立一个 Notebook 实例。此外,请留神抉择身份与拜访治理(Identity and Access Management,简称 IAM)角色,保障可能运行 Amazon SageMaker 并领有对我的项目中应用的 Amazon Simple Storage Service(Amazon S3)存储桶的拜访权限。另外,大家也能够抉择 VPC、子网以及 Git 库(如果需要的话)。对于更多详细信息,请参阅创立 IAM 角色。
- 在确认 Notebook 的以后状态为 InService 后,抉择 Open Jupyter。
- 在 Jupyter 环境中,通过 New 下拉菜单抉择 R。
Amazon SageMaker 中的 R 内核应用 IRKernel 软件包,并蕴含 140 多个规范工具包。对于为 Amazon SageMaker Jupyter notebook 实例创立自定义 R 环境的更多信息,请参阅为 Amazon SageMaker 创立长久自定义 R 环境。
在创立新 Notebook 时,大家应该会在 Notebook 环境的右上角看到 R 徽标,徽标下方则为 R 内核。这表明 Amazon SageMaker 曾经胜利为以后 Notebook 启动 R 内核。
在 Amazon SageMaker上通过 R 实现端到端机器学习
本文中的示例 Notebook 可通过 Using R with Amazon SageMaker GitHub repo 获取。
接下来加载 reticulate 库并导入 sagemaker Python 模块。详见以下代码:
library(reticulate)
sagemaker <- import('sagemaker')
在模块加载实现后,应用 R 中的 $ 代替 Python 中的.。
创立并拜访数据存储
Session 类负责通过 Amazon SageMaker 对以下 boto3 资源进行操作:
- S3
- SageMaker
- SageMakerRuntime
在本用例中,咱们为 Amazon SageMaker 创立一个默认 S3 存储桶。应用 default_bucket 函数创立一个名为 sagemaker-_<aws-region-name>_-_<aws account number>_
的 S3 存储桶,详见以下代码:
session <- sagemaker$Session()
bucket <- session$default_bucket()
指定 IAM 角色的 ARN,以容许 Amazon SageMaker 拜访该 S3 存储桶。大家能够抉择创立 Notebook 时应用过的同一 IAM 角色,详见以下代码:
role_arn <- sagemaker$get_execution_role()
下载并解决数据集
咱们的模型应用来自 UCI 机器学习库的 Abalone 数据集。下载相干数据并开始探索性数据分析。应用 tidyverse 软件包读取数据、绘制数据并将其转换为实用于 Amazon SageMaker 的 ML 格局,详见以下代码。
library(readr)
data_file <- 'http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
abalone <- read_csv(file = data_file, col_names = FALSE)
names(abalone) <- c('sex', 'length', 'diameter', 'height', 'whole_weight', 'shucked_weight', 'viscera_weight', 'shell_weight', 'rings')
head(abalone)
下表为输入后果。
输入后果中的 sex 属于一种因子数据类型,但其目前属于字符数据类型(F 为雌性、M 为雄性、I 为幼体)。将变量 sex 转换为一个因子数据类型,并应用以下代码查看数据集的统计摘要:
abalone$sex <- as.factor(abalone$sex)
summary(abalone)
以下截屏为上述代码片段的输入后果,此代码片段提供了 abalone 数据框的统计摘要。
摘要中显示,height 的最小值为 0。大家能够应用以下代码与库绘制不同性别值的 rings(即文章结尾提到的贝壳圈数)与 height 之间的关系,从而直观理解哪些鲍鱼的 height 值为 0。
library(ggplot2)
options(repr.plot.width = 5, repr.plot.height = 4)
ggplot(abalone, aes(x = height, y = rings, color = sex)) + geom_point() + geom_jitter()
下图为数据绘出的图。
图中显示出多个异样值:2 个 height 为 0 的幼体鲍鱼,以及数个 height 远超平均水平的雌性与雄性鲍鱼。要过滤掉这 2 个 height 为 0 的幼体鲍鱼,请应用以下代码:
library(dplyr)
abalone <- abalone %>%
filter(height != 0)
为模型训练筹备数据集
本模型须要 3 个数据集:训练数据集、测试数据集以及验证数据集。大家须要实现以下操作步骤:
l 将变量 sex 转换为虚构变量(Dummy Variable)),而后将指标 rings 挪动至第一列:
abalone <- abalone %>%
mutate(female = as.integer(ifelse(sex == 'F', 1, 0)),
male = as.integer(ifelse(sex == 'M', 1, 0)),
infant = as.integer(ifelse(sex == 'I', 1, 0))) %>%
select(-sex)
abalone <- abalone %>%
select(rings:infant, length:shell_weight)
head(abalone)
Amazon SageMaker 算法要求指标位于数据集的第一列。下表是输入后果。
l 全副数据样本中,有 70% 被用于进行 ML 算法训练,其余 30% 则被进一步拆分成两个局部,一部分用于测试、一部分用于验证:
abalone_train <- abalone %>%
sample_frac(size = 0.7)
abalone <- anti_join(abalone, abalone_train)
abalone_test <- abalone %>%
sample_frac(size = 0.5)
abalone_valid <- anti_join(abalone, abalone_test)
当初,咱们能够将训练与验证数据上传至 Amazon S3,从而进行模型训练。请留神,对于 CSV 文件训练时,XGBoost 算法会假设指标变量位于第一列中,且 CSV 没有列名称。对于 CSV 文件推理时,该算法则假设 CSV 输出中不存在列名称。以下代码不会将列名称保留在 CSV 文件中。
- 以.csv 格局将训练与验证数据集写入至本地文件系统当中:
write_csv(abalone_train, 'abalone_train.csv', col_names = FALSE)
write_csv(abalone_valid, 'abalone_valid.csv', col_names = FALSE)
- 将 2 套数据集上传至 S3 存储桶中的 data“目录”内:
s3_train <- session$upload_data(path = 'abalone_train.csv',
bucket = bucket,
key_prefix = 'data')
s3_valid <- session$upload_data(path = 'abalone_valid.csv',
bucket = bucket,
key_prefix = 'data')
- 为 Amazon SageMaker 算法定义 Amazon S3 输出类型:
s3_train_input <- sagemaker$s3_input(s3_data = s3_train, content_type = 'csv')
s3_valid_input <- sagemaker$s3_input(s3_data = s3_valid, content_type = 'csv')
训练模型
Amazon SageMaker 应用容器 Docker 来进行训练。要训练 XGBoost 模型,请实现以下操作步骤:
- 在所用区域的 Amazon Elastic Container Registry (Amazon ECR)当中指定训练容器,详见以下代码:
registry <- sagemaker$amazon$amazon_estimator$registry(session$boto_region_name, algorithm='xgboost')
container <- paste(registry, '/xgboost:latest', sep='')
container
'811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest'
- 定义一个 Amazon SageMaker Estimator,它能够训练容器化的任意算法。在创立 Estimator 时,请应用以下参数:
- image_name – 在训练中应用的容器镜像
- role – Amazon SageMaker 服务角色
- train_instance_count – 在训练中应用的 EC2 实例数量
- train_instance_type – 在训练中应用的 EC2 实例类型
- train_volume_size – 在训练过程中用于存储输出数据的 Amazon Elastic Block Store (Amazon EBS)存储卷的容量大小(单位为 GB)
- train_max_run – 训练超时(单位为秒)
- input_mode – 算法反对的输出模式
- output_path – 用于保留训练后果(包含模型工件与输入文件)的 Amazon S3 地位
- output_kms_key – 用于加密训练输入后果的 AWS Key Management Service (AWS KMS)密钥
- base_job_name – 训练作业的名称前缀
- sagemaker_session – 负责管理与 Amazon SageMaker API 间交互的 Session 对象
s3_output <- paste0('s3://', bucket, '/output')
estimator <- sagemaker$estimator$Estimator(image_name = container,
role = role_arn,
train_instance_count = 1L,
train_instance_type = 'ml.m5.large',
train_volume_size = 30L,
train_max_run = 3600L,
input_mode = 'File',
output_path = s3_output,
output_kms_key = NULL,
base_job_name = NULL,
sagemaker_session = NULL)
Python 中的 None 相当于 R 中的 NULL。
- 指定 XGBoost 超参数并进行模型拟合
- 将训练轮数设置为 100,这也是在 Amazon SageMaker 之外应用 XGBoost 库时的默认值。
- 依据以后工夫戳指定输出数据与作业名称。
estimator$set_hyperparameters(num_round = 100L)
job_name <- paste('sagemaker-train-xgboost', format(Sys.time(), '%H-%M-%S'), sep = '-')
input_data <- list('train' = s3_train_input,
'validation' = s3_valid_input)
estimator$fit(inputs = input_data,
job_name = job_name)
在训练实现之后,Amazon SageMaker 会将模型的二进制文件(gzip 压缩文件)复制至指定的 Amazon S3 输入地位。应用以下代码以获取残缺的 Amazon S3 门路:
estimator$model_data
部署模型
Amazon SageMaker 为用户提供一个预测入口(Endpoint),咱们能够应用 HTTPS 申请通过平安、简略 API 调用以实现模型部署。要将训练实现的模型部署在 ml.t2.medium 实例上,请输出以下代码:
model_endpoint <- estimator$deploy(initial_instance_count = 1L,
instance_type = 'ml.t2.medium')
应用模型进行预测
当初,大家能够应用测试数据进行预测。请实现以下操作步骤:
- 通过为预测入口(Endpoint)指定 text/csv 与 csv_serializer,将以逗号分隔的文本传递为 JSON 格局,具体参见以下代码:
model_endpoint$content_type <- 'text/csv'
model_endpoint$serializer <- sagemaker$predictor$csv_serializer
- 删除指标列,并将前 500 个行数据转换为没有列名称的矩阵:
abalone_test <- abalone_test[-1]
num_predict_rows <- 500
test_sample <- as.matrix(abalone_test[1:num_predict_rows,])
dimnames(test_sample)[[2]] <- NULL
本文只应用 500 行数据,以防止超出预测入口(Endpoint)下限。
- 预测并将其转换成以逗号分隔的字符串:
library(stringr)
predictions <- model_endpoint$predict(test_sample)
predictions <- str_split(predictions, pattern = ',', simplify = TRUE)
predictions <- as.numeric(predictions)
- 将预测出的圈数与测试数据集的列绑定:
把预测值转换成整数
- abalone_test <- cbind(predicted_rings = as.integer(predictions),
- abalone_test[1:num_predict_rows,])
- head(abalone_test)
下表所示为代码的输入后果,其将 predicted_rings 增加至 abalone_test 表当中。请留神,理论代码输入可能与此不同,因为步骤 2 中“为模型训练筹备数据集”阶段内的数据集训练 / 验证 / 测试拆分属于随机拆分,所以拆分后果很可能与本示例有所区别。
![image](/img/bVcLpwT
删除预测入口(Endpoint)
在模型应用实现之后,请删除预测入口(Endpoint)以防止产生不必要的部署老本。具体参见以下代码:
session$delete_endpoint(model_endpoint$endpoint)
总结
本文疏导大家实现了一个端到端机器学习我的项目,全面涵盖数据收集、数据处理、模型训练、将模型部署为端点、应用所部署模型进行推理等各个步骤。对于为 Amazon SageMaker Jupyter notebook 实例创立自定义 R 环境的更多信息,请参阅为 Amazon SageMaker 创立长久自定义 R 环境。对于 Amazon SageMaker 上的 R notebook 示例,请参阅 Amazon SageMaker 示例 GitHub repo。
大家也能够参考开发者指南上的《Amazon SageMaker R 用户指南》以理解对于通过 R 应用 Amazon SageMaker 各项性能的详细信息。