在 机器学习 Studio 中执行 Python 机器学习脚本(经典版)

适用于:适用于。机器学习 Studio(经典版)Azure 机器学习 不适用。

重要

对机器学习工作室(经典)的支持将于 2024 年 8 月 31 日结束。 建议在该日期之前转换到 Azure 机器学习

从 2021 年 12 月 1 日开始,你将无法创建新的机器学习工作室(经典)资源。 在 2024 年 8 月 31 日之前,可继续使用现有的机器学习工作室(经典)资源。

ML 工作室(经典)文档即将停用,将来可能不会更新。

Python 是许多数据科学家工具箱中的一个有价值的工具。 它用于典型机器学习工作流的每个阶段,包括数据探索、特征提取、模型训练和验证以及部署。

本文介绍如何通过“执行 Python 脚本”模块在机器学习工作室(经典版)试验和 Web 服务中使用 Python 代码。

使用执行 Python 脚本模块

Studio 中 Python 的主要接口(经典版)是通过 执行 Python 脚本 模块。 它最多接受三个输入并生成最多两个输出,类似于 执行 R 脚本 模块。 Python 代码通过一 azureml_main个名为特殊命名的入口点函数输入到参数框中。

执行 Python 脚本模块

模块参数框中的示例 python 代码

输入参数

Python 模块的输入公开为 Pandas 数据帧。 该 azureml_main 函数最多接受两个可选的 Pandas 数据帧作为参数。

可以定位输入端口和函数参数之间的映射:

  • 第一个连接的输入端口映射到函数的第一个参数。
  • 第二个输入(如果已连接)映射到函数的第二个参数。
  • 第三个输入用于 导入其他 Python 模块

下面显示了有关输入端口如何映射到函数参数的 azureml_main 更详细的语义。

输入端口配置和生成的 Python 签名表

输出返回值

azureml_main 函数必须返回打包在 Python 序列 中的单个 Pandas 数据帧,例如元组、列表或 NumPy 数组。 此序列的第一个元素将返回到模块的第一个输出端口。 模块的第二个输出端口用于 可视化效果 ,不需要返回值。 此方案如下所示。

将输入端口映射到参数并将值返回到输出端口

输入和输出数据类型的转换

工作室数据集与 Panda DataFrame 不同。 因此,工作室(经典)中的输入数据集将转换为 Pandas 数据帧,输出数据帧将转换回 Studio(经典)数据集。 在此转换过程中,还将执行以下翻译:

Python 数据类型 工作室翻译过程
字符串和数字 按原样翻译
Pandas “NA” 已转换为“缺失值”
索引向量 支持*
非字符串列名称 调用 str 列名
复制列名 添加数字后缀:(1)、(2)、(3)等。

*Python 函数中的所有输入数据帧始终具有 64 位的数字索引,范围从 0 到行数减去 1 的值。

导入现有的 Python 脚本模块

用于执行 Python 的后端基于 Anaconda,这是一种广泛使用的科学 Python 分发。 它附带了近 200 个在以数据为中心的工作负载中使用的最常见 Python 包。 工作室(经典版)目前不支持使用 Pip 或 Conda 等包管理系统来安装和管理外部库。 如果发现需要合并其他库,请使用以下方案作为指南。

常见的用例是将现有 Python 脚本合并到工作室(经典)试验中。 执行 Python 脚本模块接受包含第三个输入端口上的 Python 模块的 zip 文件。 在运行时执行框架会解压缩该文件,内容将添加到 Python 解释器的库路径。 然后,azureml_main 入口点函数可直接导入这些模块。

例如,请考虑包含简单“Hello, World”函数的文件 Hello.py。

Hello.py 文件中的用户定义函数

接下来,我们创建包含 Hello.py 的 Hello.zip 文件:

包含用户定义的 Python 代码的 Zip 文件

将 zip 文件作为数据集上传到工作室(经典)。 然后创建并运行一个试验,该试验使用 Hello.zip 文件中的 Python 代码,方法是将其附加到执行 Python 脚本模块的第三个输入端口,如下图所示。

将Hello.zip作为执行 Python 脚本模块的输入的示例试验

上传为 zip 文件的用户定义 Python 代码

模块输出显示,zip 文件未打包,并且函数 print_hello 已运行。

显示用户定义的函数的模块输出

访问Azure 存储 Blob

可以使用以下步骤访问存储在Azure Blob 存储帐户中的数据:

  1. 在本地下载适用于 Python 的 Azure Blob 存储 包。
  2. 将 zip 文件作为数据集上传到工作室(经典)工作区。
  3. 使用 创建 BlobService 对象 protocol='http'
from azure.storage.blob import BlockBlobService

# Create the BlockBlockService that is used to call the Blob service for the storage account
block_blob_service = BlockBlobService(account_name='account_name', account_key='account_key', protocol='http')
  1. 在“存储配置”设置选项卡中禁用所需的安全传输

禁用Azure 门户中所需的安全传输

实现 Python 脚本

任何在评分实验中使用的执行 Python 脚本模块在发布为 Web 服务时都将受到调用。 例如,下图显示了一个评分实验,其中包含用于计算单个 Python 表达式的代码。

Web 服务的工作室工作区

Python Pandas 表达式

从此试验创建的 Web 服务将执行以下操作:

  1. 将 Python 表达式作为输入(作为字符串)
  2. 将 Python 表达式发送到 Python 解释器
  3. 返回包含表达式和计算结果的表。

使用可视化效果

使用 MatplotLib 创建的绘图可由执行 Python 脚本返回。 但是,绘图不会在使用 R 时自动重定向到图像。因此,用户必须将任何绘图显式保存到 PNG 文件。

若要从 MatplotLib 生成图像,必须执行以下步骤:

  1. 将后端从默认的基于 Qt 的呈现器切换到“AGG”。
  2. 创建新的图形对象。
  3. 获取轴并生成其中的所有绘图。
  4. 将该图保存到 PNG 文件。

下图演示了此过程,这些图像使用 Pandas 中的scatter_matrix函数创建散点图矩阵。

将 MatplotLib 图形保存到图像的代码

单击“执行 Python 脚本”模块上的可视化以查看图表

使用 Python 代码可视化示例试验的绘图

通过将多个数字保存到不同的图像中,可以返回多个数据。 工作室(经典)运行时会选取所有图像,并连接它们进行可视化。

高级示例

Studio(经典)中安装的 Anaconda 环境包含常见包,例如 NumPy、SciPy 和 Scikits-Learn。 这些包可以有效地用于机器学习管道中的数据处理。

例如,以下试验和脚本演示了如何使用 Scikits-Learn 中的合奏学习器计算数据集的特征重要性分数。 分数可用于在馈送到另一个模型之前执行监督功能选择。

下面演示如何使用 Python 函数计算重要性评分,并根据评分为特征排序:

按分数对特征进行排名的函数

以下实验则在机器学习工作室(经典版)的“Pima Indian Diabetes”数据集中计算并返回功能的重要性得分:

使用 Python 对 Pima 印度糖尿病数据集中的特征进行排名的试验

执行 Python 脚本模块输出的可视化效果

限制

执行 Python 脚本模块当前具有以下限制:

沙盒执行

Python 运行时当前已沙盒化,不允许以持久性方式访问网络或本地文件系统。 所有本地保存的文件都将隔离,并在模块完成后删除。 Python 代码无法访问运行它的计算机上的大部分目录,当前目录及其子目录除外。

缺乏复杂的开发和调试支持

Python 模块当前不支持诸如 intellisense 和调试等 IDE 功能。 此外,如果模块在运行时失败,则整个 Python 堆栈跟踪可用。 但必须在模块的输出日志中查看跟踪。 我们目前建议在诸如 IPython 的环境中开发和调试 Python 脚本,然后将代码导入模块。

单个数据帧输出

Python 入口点仅允许将单个数据帧返回为输出。 目前无法将任意 Python 对象(如训练的模型)直接返回工作室(经典)运行时。 就像具有相同限制的执行 R 脚本一样,在许多情况下可将对象转换为字节数组,并在数据帧中返回字节数组。

无法自定义 Python 安装

当前添加自定义 Python 模块的唯一方法是如前所述的使用 zip 文件机制。 虽然这对于小型模块来说可行,但对于大型模块(尤其是具有本机 DLL 的模块)或大量模块来说,这很麻烦。

后续步骤

有关详细信息,请参阅 Python 开发人员中心