执行 R 脚本
重要
对机器学习工作室(经典)的支持将于 2024 年 8 月 31 日结束。 建议在该日期之前转换到 Azure 机器学习。
从 2021 年 12 月 1 日开始,你将无法创建新的机器学习工作室(经典)资源。 在 2024 年 8 月 31 日之前,可继续使用现有的机器学习工作室(经典)资源。
ML 工作室(经典)文档即将停用,将来可能不会更新。
从 机器学习 Studio (经典) 试验执行 R 脚本
类别: R 语言模块
模块概述
本文介绍如何在 机器学习 Studio 中使用执行 R 脚本模块 (经典) ,在试验中调用和运行 R 代码。
通过将 R 代码添加到此模块,可以执行工作室 (经典) 中不可用的各种自定义任务。 例如:
- 创建自定义数据转换
- 使用自己的指标来评估预测
- 使用未在 Studio 中作为独立模块实现的算法生成模型 (经典)
Studio (经典) 支持的 R 版本
Studio (经典) 支持 CRAN 提供的典型 R 分发,以及 Microsoft R Open (MRO) ,其中包括所有基本 R 包以及 Revo 包。
可以指定要在试验中使用的 R 版本。 但是,不能将任何其他版本的 R 安装到工作区中。
建议在选择 R 分发之前确定所需的包。某些包与 CRAN R 和 Microsoft R Open 不兼容。
注意
目前, “创建 R 模型” 模块仅限于特定版本的 R。因此,如果在试验中使用自定义 R 模型,则同一实验中的任何 执行 R 脚本 模块也必须使用相同的 R 版本。 在以下文章中找到受支持的 R 版本,机器学习 Studio 支持的 R 包 (经典) 。
支持的 R 包
机器学习中的 R 环境已安装 500 多个 R 包。 当然,并非所有默认都已加载,但可以轻松地将其作为 R 代码的一部分加载。
若要获取所有当前包的列表,请将以下代码添加到 执行 R 脚本 模块并运行该模块。
data.set <- data.frame(installed.packages())
maml.mapOutputPort("data.set")
本主题列出了机器学习支持的包及其与 CRAN R 和 Microsoft R Open 的兼容性,请参阅 机器学习 Studio 支持的 R 包 (经典) 。
安装新的 R 包
使用 “执行 R 脚本 ”模块将新的 R 包安装到工作区中。 必须以压缩格式上传包。 将试验加载到 Azure 运行时环境中时,包会解压缩,并将其添加到试验工作区中的 R 环境中。 有关详细信息,请参阅 如何安装新的 R 包
试验未运行时,未在工作区 中持久保存 已解压缩的包。 因此,计划使用的任何其他 R 包都必须在工作区或 Azure 存储中以压缩格式提供。
无法跨 执行 R 脚本 模块的单独实例共享包,因为每个模块可能在运行时加载到不同的容器中。 但是,可以通过将 R 对象公开为数据集,在模块之间共享 R 对象。 有关详细信息,请参阅 在模块之间传递 R 对象。
示例试验
Azure AI 库中有许多自定义 R 脚本示例:
学生性能:使用自定义 R 脚本将多个模型的评估结果合并到单个数据集中。 此示例还使用“执行 R 脚本”模块中的 R 代码计算 16 个时间相关列。
乳腺癌:使用 “执行 R 脚本 ”模块中的自定义代码来复制正示例并合并指标。
如何配置“执行 R 脚本”
若要配置“执行 R 脚本”模块,你需提供一组可选输入和要在工作区中运行的 R 代码。
如果将其准备在压缩的存档文件中以附件附加到 脚本捆绑包 输入,则还可以添加包含其他 R 代码的文件。
若要安装任何其他包,请将其包含在压缩的存档文件中。
将 “执行 R 脚本 ”模块添加到试验。 可以在 R 语言模块组中的 机器学习 Studio (经典) 中找到此模块。
连接脚本所需的任何输入。 输入可以包括数据、你以压缩文件格式添加到工作区的 R 包和其他 R 代码。
Dataset1:第一个输入是附加主数据集的位置, (可选) 。 输入数据集的格式必须为 CSV、TSV 或 ARFF 文件,或者可以连接机器学习数据集。
Dataset2:第二个输入 (可选) 支持添加第二个数据集。 此数据集还必须格式化为 CSV、TSV 或 ARFF 文件,也可以连接机器学习数据集。
脚本捆绑包:第三个输入(可选)采用.ZIP格式的文件。 压缩的文件可以包含多个文件和多个文件类型。 例如,压缩存档可能包含脚本文件中的 R 代码、脚本要使用的 R 对象、本身包含在.ZIP格式的 R 包,或其中一种受支持格式的数据集。
在 R 脚本文本框中键入 R 脚本 。 这是使用输入节点上数据集的最简单方法。
为了帮助你入门, R 脚本 文本框预填充了以下示例代码,你可以编辑或替换这些代码。
# Map 1-based optional input ports to variables dataset1 <- maml.mapInputPort(1) # class: data.frame dataset2 <- maml.mapInputPort(2) # class: data.frame # Contents of optional Zip port are in ./src/ # source("src/yourfile.R"); # load("src/yourData.rdata"); # Sample operation colnames(dataset2) <- c(dataset1['nombre_columna'])$nombre_columna; data.set = dataset2; # You'll see this output in the R Device port. # It'll have your stdout, stderr and PNG graphics device(s). # Select data.frame to be sent to the output Dataset port maml.mapOutputPort("data.set");
有关如何使用输入和写入输出的详细信息,请参阅本主题中的 R 代码示例 。
注意
在外部工具中正常运行的 R 代码可能需要进行少量更改才能在 Azure ML 试验中运行。 例如,以 CSV 格式提供的输入数据应显式转换为数据集,然后才能在代码中使用。 R 语言中使用的数据和列类型在某些方面也不同于机器学习中使用的数据和列类型。 有关详细信息,请参阅技术说明部分。
执行 R 脚本模块在 R 环境的沙盒中运行,不建议在此模块中设置 HTTP/SQL 连接。随机种子:键入要在 R 环境中用作随机种子值的值。 此参数相当于在 R 代码中调用
set.seed(value)
。R 版本:选择要在工作区中加载的 R 版本。
CRAN R 3.1.0:综合 R 存档网络网站是 开放源代码 R 语言的存储库。 有关详细信息,请参阅 CRAN 网站。
Microsoft R Open 3.2.2:MRO 是 Microsoft Corporation 提供的 R 的增强分发。 它是一个开放源代码平台,基于开放源代码 R 引擎,与使用相同版本的 R 的所有 R 包、脚本和应用程序完全兼容。但是,MRO 通过使用高性能的多线程数学库,与标准 R 分布相比提高了性能。 有关详细信息,请参阅 Microsoft R Open。
不能将任何其他版本的 R 安装到工作区中。
机器学习支持多个版本的 R,但在任何试验中只能使用一个版本。
运行试验,或选择 “执行 R 脚本 ”模块,然后单击“ 运行”处于选中状态。
结果
该模块可以返回多个输出。
- 若要恢复数据集,R 代码应返回单个 R data.frame。
- 可以在 R 图形设备中显示图像,该设备显示在 机器学习 Studio (经典) 日志区域中。
- 若要保留图像,可以将图像写入文件,或将它们序列化为表格格式。
- 可以将对象保存到工作区。
- 来自 R 的标准消息和错误将返回到模块的日志中。
(1 个) 结果数据集
此输出包含模块中 R 代码生成的数据帧。
只能输出一个数据帧。 其他表格对象必须使用 R 函数转换为数据帧。 模块 R 代码的数据帧输出将自动转换为内部 数据表 格式。
若要验证返回的对象是否与 Studio (经典) 兼容,请使用
is.data.frame
它必须返回 True。若要返回其他 R 对象,请尝试将对象序列化为字节数组,或使用函数将所需数据返回为
data.frame
。
(2) R 设备
R 设备支持控制台输出 (标准输出和标准错误) 并使用 R 解释器显示 PNG 图形。
若要查看发送到 R 控制台的消息 (标准输出和标准错误) ,请在模块运行完成后右键单击该模块,选择 R 设备,然后选择 “可视化”。
若要查看 R 设备端口上生成的图形,请在模块运行完成后右键单击该模块,选择 “R 设备”,然后选择“ 可视化”。
例如,下图只由几行 R 代码生成。
可以在 Azure AI 库中找到此和相关示例。
- 若要保存 执行 R 脚本 模块生成的映像,请右键单击该映像并保存本地副本。 或者,可以使用调用其中一个 R 图形设备函数将映像文件写入与试验关联的 Azure Blob 存储帐户,如 此示例中所述。
示例 R 脚本和 R 提示
你可以通过多种方法使用自定义 R 脚本扩展试验。 本部分提供一些常见任务的示例代码。
添加 R 脚本作为输入
“执行 R 脚本”模块支持使用任意 R 脚本文件作为输入,前提是它们已提前准备好,并作为 ZIP 文件的一部分上传到工作区。
若要将包含 R 代码的 ZIP 文件上传到工作区,请依次单击“新建”、“数据集”,然后选择“从本地文件”和“Zip 文件”选项。
将压缩包上传到 Studio (经典) 后,请验证压缩文件是否在 “已保存的数据集 ”列表中可用,然后将数据集连接到 脚本捆绑包 输入端口。
如果压缩文件包含尚未安装在 机器学习 Studio (经典) 中的任何 R 包,则必须在“执行 R 脚本”模块中将 R 包安装为自定义代码的一部分。 在试验运行时,ZIP 文件中包含的所有文件都可用。
如果脚本包文件中已包含目录结构,则会保留结构。 但是,必须更改代码,将目录 src 追加到路径。
生成图像、模型和其他对象
如果需要生成图像或任何其他任意 R 对象,则可以将其序列化为字节数组,然后作为 data.frame 进行序列化,如以下示例所示:
as.data.frame(as.integer(serialize(g,con=NULL)));
Graph库中的数据帧https://igraph.org/r/不支持作为数据帧进行序列化。 请改用 get.data.frame
包中的 igraph
函数将边缘和顶点信息放入数据帧中。
vertices <- get.data.frame(g, what="vertices")
然后,可以将图形对象作为 data.frame 返回,可以从 “执行 R 脚本 ”模块获取该对象。
edges <- get.data.frame(g, what="edges")
从输入读取并写入到输出
以下示例演示如何使用输入和输出端口。 它将输入数据读取为表,并将表的副本追加到自身,从而有效地将表的大小翻倍。 然后,会将结果发送到输出端口。
# Map existing dataset to first input port
dataset1 <- maml.mapInputPort(1) # class: data.frame
# Concatenate dataset1 to dataset 1
newdataset = rbind(dataset1, dataset1)
# Send the combined dataset to the output port
maml.mapOutputPort("newdataset");
读取 ZIP 文件作为输入
此示例演示如何以压缩格式将数据集添加到 机器学习 Studio (经典) ,然后将数据用作执行 R 脚本模块的输入。
- 以 CSV 格式创建数据文件,并将其命名为“mydatafile.csv”。
- 创建.ZIP文件并将 CSV 文件添加到存档。
- Upload压缩文件到机器学习工作区,如下所示:解压缩压缩数据集。
- 将结果数据集连接到“执行 R 脚本”模块的“ScriptBundle”输入 。 换句话说,不要解压缩它!
- 使用以下代码从压缩文件读取 CSV 数据。 根据需要指定数据文件中使用的编码,以避免以后出错。
mydataset=read.csv("src/newdata.csv",encoding="UTF-8");
nrow(mydataset);
ncol(mydataset);
# Map new dataset to the first output port
maml.mapOutputPort("mydataset");
注意
传递给 执行 R 脚本 模块的所有数据将转换为 data.frame
用于 R 代码的格式。 这适用于与DataTable format
机器学习使用的兼容的任何数据,包括 CSV 文件、ARFF 文件等。
复制行
此示例演示如何按 20 因子复制数据集中的正样本,以平衡样本。
dataset <- maml.mapInputPort(1)
data.set <- dataset[dataset[,1]==-1,]
pos <- dataset[dataset[,1]==1,]
for (i in 1:20) data.set <- rbind(data.set,pos)
row.names(data.set) <- NULL
maml.mapOutputPort("data.set")
基于 Arules 包调用自定义学习器
可以通过将新 R 包作为.ZIP文件上载到机器学习工作区,如下所示。 以下代码演示如何使用上传的包。
假设已将
arules
和arulesViz
包添加到工作区。将上传的.ZIP文件连接到执行 R 脚本模块的第三个输入端口。
在 R 脚本文本框中,使用以下命令调用 R 语言包
Arules
提供的早期关联规则算法,并在市场篮分析任务中应用学习者。
library("arules")
library("arulesViz")
dataset <- read.transactions(file="src/SalesReport.csv", rm.duplicates= TRUE, format="single",sep=",",cols =c(1,2))
#dataset <- sapply(dataset,as.factor)
basket <- apriori(dataset,parameter = list(sup = 0.5, conf = 0.9,target="rules"));
inspect(basket)
# if this is not NULL i.e. if there are rules
plot(basket)
调用自定义 Naïve Bayes 学习器
此示例演示如何调用工作室中不包含的 R 库 (经典) 。
Upload一个压缩文件,其中包含工作区的
e1071
库。将上传的.ZIP文件连接到执行 R 脚本模块的第三个输入端口。
在 R 脚本 文本框中,使用以下代码实现 Naïve Bayes 学习器。
library(e1071) features <- get.feature.columns(dataset) labels <- get.label.column(dataset) train.data <- data.frame(features, labels) feature.names <- get.feature.column.names(dataset) names(train.data) <- c(feature.names, "Class") model <- naiveBayes(Class ~ ., train.data)
调用自定义 Naïve Bayes 记分器
如果库创建了 e1071
现有模型,则可以调用库提供的 e1071
自定义评分器。
但是,若要在 执行 R 脚本 模块的单独实例中执行评分,还必须提供包含 e1071
库的压缩文件作为评分模块的输入,并加载库。 这是因为每个模块在容器中独立运行。
library(e1071)
features <- get.feature.columns(dataset)
scores <- predict(model, features)
单个试验中包含的所有 R 模块都必须使用相同的 R 运行时版本。 不能混合使用 R 版本,例如在一个模块中使用 CRANR,另一个模块中使用 Microsoft R Open。
编写图形文件
尽管 Studio (经典) 支持使用 R 设备输出端口显示 PNG 文件,但你可能希望将结果生成为 blob 中的 PDF 文件,Azure 存储用于报告。
此示例演示如何使用 “执行 R 脚本 ”生成图表作为 PDF 文件。
将 执行 R 脚本 添加到试验。
创建作为 R 脚本的一部分的基本 PDF 文件,并从 “执行 R 脚本 ”模块返回 PDF 文件的 Base64 编码字符串。
d <- maml.mapInputPort(1) d$dteday <- as.numeric(d$dteday) pdf() plot(d) dev.off() library(caTools) b64ePDF <- function(filename) { maxFileSizeInBytes <- 5 * 1024 * 1024 # 5 MB return(base64encode(readBin(filename, "raw", n = maxFileSizeInBytes))) } d2 <- data.frame(pdf = b64ePDF("Rplots.pdf")) maml.mapOutputPort("d2");
将此输出传递给 导出数据 模块,并将二进制值保存到 Azure Blob 存储。
在“执行 R 脚本”模块之间传递 R 对象
可以使用内部序列化机制在“执行 R 脚本”模块的实例之间传递 R 对象。 此示例假定你想要在两个 Execute R Script 模块之间移动命名的 A
R 对象。
将第一个 执行 R 脚本 模块添加到试验中,并在 R 脚本 文本框中键入以下代码,以在模块的输出数据表中创建序列化对象
A
作为列:serialized <- as.integer(serialize(A,NULL)) data.set <- data.frame(serialized,stringsAsFactors=FALSE) maml.mapOutputPort("data.set")
需要显式转换为整数类型,因为序列化函数输出 R
Raw
格式的数据,机器学习不支持这些数据。添加“执行 R 脚本”模块的第二个实例,并将其连接到以前模块的输出端口。
在“R 脚本”文本框中键入以下代码,从输入数据表中提取对象
A
。dataset <- maml.mapInputPort(1) A <- unserialize(as.raw(dataset$serialized))
安装新 R 包
可以在 机器学习 中添加默认情况下未安装的 R 包。 添加新包需要执行以下步骤:
- 获取包的Windows二进制文件(采用压缩格式)。
- 将所需包和任何依赖项压缩到具有.ZIP扩展名的新压缩存档文件中。
- 将压缩文件作为数据集Upload到工作区。
- 将新数据集连接到“执行 R 脚本”模块。
- 在模块中使用 R 脚本安装包。
以下过程将一个新包及其依赖项一起添加。
下载要导入到机器学习的包的压缩文件。 请务必获取压缩文件的Windows版本。
注意
如果已提取要在工作区中使用的 R 包,则必须重新压缩包,或者在将 R 包上传到 Studio (经典) 时提供原始 ZIP 文件。
检查是否有任何依赖项,并且包是否需要 Azure ML Studio 中尚不存在的其他包 (经典) ,请以压缩格式下载它们并将其添加到存档文件中。
右键单击要上传的包的压缩文件及其依赖项,单击“ 发送到”,然后选择压缩 (压缩) 文件夹。
提示
压缩文件夹应至少包含一个包含目标包的压缩文件,以及包含所需包的其他 zip 文件。
Upload包含所有包 (的单个 ZIP 文件,以及工作室 (经典) 工作区) 的任何可选 R 代码文件或数据文件。
这样做就像上传数据集一样:单击“ 新建”,单击“ 数据集”,然后选择“ 从本地文件 ”和 “Zip 文件 ”选项。
打开 “保存的数据集 ”列表,单击“ 我的数据集”,并验证压缩文件是否可用。
将其拖动到实验中,右键单击数据集,然后选择“ 可视化 ”以查看压缩文件夹中包含的文件。 在 “内容 ”列表中看到的文件名是安装包时必须引用的名称。
例如,假设你上传了一个名为的文件,其中包含三个名为
NewRPackage.zip
001.zip
R002.zip
包,以及003.zip
。 在 “数据集” 列表中,数据集的名称将为NewRPackage.zip
包含内容001.zip
,002.zip
以及003.zip
。将数据集 ()
NewRPackage.zip
脚本捆绑包输入端口连接。此时,外部压缩文件夹将提取到路径
src
中的工作区沙盒中。 现在可以使用以下包:src\001.zip
src\002.zip
src\003.zip
若要安装 R 包,请从其 zip 文件中提取每个包,然后加载包含的库。
例如,假设该文件
src\001.zip
包含自定义 R 包code001
,你将运行以下脚本:# install R package contained in src\001.zip install.packages("src/001.zip", lib = ".", repos = NULL, verbose = TRUE) library(code001, lib.loc=".", verbose=TRUE)
对任何必需的包重复安装过程。
# install R package contained in src\002.zip install.packages("src/002.zip", lib = ".", repos = NULL, verbose = TRUE) library(code002, lib.loc=".", verbose=TRUE) # install R package contained in src\003.zip install.packages("src/003.zip", lib = ".", repos = NULL, verbose = TRUE) library(code003, lib.loc=".", verbose=TRUE)
注意
如果已安装多个包之间存在任何依赖项,请务必先安装所需的包,否则可能会出错。
所有 R 包的安装都必须作为试验的一部分执行,以确保在执行试验时发送到 Azure 作业队列的工作区中包含所有必需的包。
试验运行或关闭会话后,工作区中的包不会持久保存。 但是,在重新运行试验时,可以快速提取和使用已上传为压缩文件的任何包。
技术说明
优化工作室中的 R 性能 (经典)
当前默认内存为 14 GB。 如果你尝试通过使用“执行 R 脚本”模块来处理非常大的数据帧,则可能会遇到内存不足错误消息。
若要增加 R 脚本所使用的内存量,可以在脚本开头使用以下类似行:
memory.limit(56000)
用户指定的 R 代码由 64 位 R 解释器运行,该解释器使用具有 56 GB RAM 的 A8 虚拟机在 Azure 中运行。 若要提高 R 代码的速度,可以使用预安装 编译器 包中提供的实时编译器。
在 R 和 Studio 之间转换数据类型 (经典)
下表显示了 R 中的数据类型如何与 机器学习 中的数据类型相对应:
R 类型 | Studio (经典) 类型 |
---|---|
Integer | Integer |
Double | Double |
Complex | Complex 仅部分模块支持此类型。 |
逻辑 | 布尔 |
字符 | String |
原始 | 不支持 |
Difftime | TimeSpan |
factor | 分类 |
data.frame | dataset |
R 中的 lists
数据类型列无法进行转换,因为此类列中的元素的类型和大小可能不同。 例如,如果在 执行 R 脚本 模块中使用了以下有效的 R 代码,则失败:
data.set <- data.frame(r=I(list(list(1,2,3),list(4,5))))
maml.mapOutputPort("data.set")
转换日期/时间值
机器学习 Studio (经典) 使用与 R 不同的日期/时间类型。如果要分析的数据包含日期和时间数据,则应在将现有 R 代码移植到 Studio (经典) 时注意以下转换要求:
从 机器学习 Studio (经典) 转换为 R
DateTime 列被转换成 POSIXct 向量。 但是,生成的向量的每个单个元素都是自 1970-01-01T00:00:00:00 以来的秒数。
在这种转换中没有时区调整。
从 R 转换为 Studio (经典)
POSIXct 向量被转换成 UTC 时区中的 DateTime 列。
例如,2011-03-27 01:30:00 PDT 将被转换成 2011-03-27T08:30:00Z,其中,Z 表示时间采用 UTC 格式。
提示
使用“执行 R 脚本”模块内的时间时,必须显式指定时间戳。 在“执行 R 脚本”模块中托管的 R 解释程序无权访问本地时区定义。
网络
出于安全原因,“执行 R 脚本”模块中 R 代码的所有进出网络均被 Azure 阻止。 此外,在极少数例外情况下,从“执行 R 脚本”到本地端口的访问也会被阻止。
并行执行
目前,不支持使用多个线程的并行执行。
预期输入
名称 | 类型 | 说明 |
---|---|---|
Dataset1 | 数据表 | 输入数据集 1 |
Dataset2 | 数据表 | 输入数据集 2 |
脚本捆绑包 | Zip | R 源集 |
模块参数
名称 | 范围 | 类型 | 默认 | 说明 |
---|---|---|---|---|
R 脚本 | Any | StreamReader | 指定指向 R 脚本源的 StreamReader 。 |
|
随机种子 | >=0 | Integer | 定义在 R 环境中使用的随机种子值。 等效于 \"set.seed(value)\" 。此参数是可选的。 |
Outputs
名称 | 类型 | 说明 |
---|---|---|
结果数据集 | 数据表 | 输出数据集 |
R 设备 | 数据表 | 来自 R 解释程序的控制台输出和 PNG 图形设备 |