教程:在 Azure 机器学习中上传、访问和浏览数据

适用于:Python SDK azure-ai-ml v2(当前版本)

本教程介绍如何执行下列操作:

  • 将数据上传到云存储空间
  • 创建 Azure 机器学习数据资产
  • 访问笔记本中的数据以进行交互式开发
  • 创建新版本的数据资产

机器学习项目的开始阶段通常涉及到探索性数据分析 (EDA)、数据预处理(清理、特征工程)以及生成机器学习模型原型来验证假设。 此原型制作项目阶段具有高度的交互性。 它适合在 IDE 或 Jupyter 笔记本中使用 Python 交互式控制台进行开发。 本教程介绍了这些想法。

先决条件

  1. 若要使用 Azure 机器学习,你首先需要一个工作区。 如果没有工作区,请完成创建开始使用所需的资源以创建工作区并详细了解如何使用它。

  2. 登录到工作室,选择工作区(如果尚未打开)。

  3. 在工作区中打开或创建一个笔记本:

    • 如果要将代码复制/粘贴到单元格中,请创建新的笔记本
    • 或者从工作室的“示例”部分打开 tutorials/get-started-notebooks/explore-data.ipynb。 然后选择“克隆”,将笔记本添加到你的“文件”。 (了解在何处找到“示例”。)

设置内核

  1. 在打开的笔记本上方的顶部栏中,创建一个计算实例(如果还没有计算实例)。

    Screenshot shows how to create a compute instance.

  2. 如果计算实例已停止,请选择“启动计算”,并等待它运行。

    Screenshot shows how to start compute if it is stopped.

  3. 确保右上角的内核为 Python 3.10 - SDK v2。 如果不是,请使用下拉列表选择此内核。

    Screenshot shows how to set the kernel.

  4. 如果看到一个横幅,提示你需要进行身份验证,请选择“身份验证”。

重要

本教程的其余部分包含教程笔记本的单元格。 将其复制/粘贴到新笔记本中,或者立即切换到该笔记本(如果已克隆该笔记本)。

下载本教程中使用的数据

对于数据引入,Azure 数据资源管理器处理这些格式的原始数据。 本教程使用此 CSV 格式的信用卡客户数据示例。 我们可以看到 Azure 机器学习资源中的步骤继续执行。 在该资源中,我们将直接在此笔记本所在的文件夹下创建一个本地文件夹,并使用建议的名称“data”。

注意

本教程依赖于 Azure 机器学习资源文件夹位置中放置的数据。 对于本教程,“local”表示该 Azure 机器学习资源中的文件夹位置。

  1. 选择三点下方的“打开终端”,如此图所示:

    Screenshot shows open terminal tool in notebook toolbar.

  2. 终端窗口将在新选项卡中打开。

  3. 请确保cd此笔记本所在的同一文件夹。 例如,如果笔记本位于名为 get-started-notebooks 的文件夹中:

    cd get-started-notebooks    #  modify this to the path where your notebook is located
    
  4. 在终端窗口中输入以下命令,将数据复制到计算实例:

    mkdir data
    cd data                     # the sub-folder where you'll store the data
    wget https://azuremlexamples.blob.core.chinacloudapi.cn/datasets/credit_card/default_of_credit_card_clients.csv
    
  5. 现在可以关闭终端窗口。

详细了解 UCI 机器学习存储库中的此数据。

创建工作区的句柄

在深入了解代码之前,需要一种方法来引用工作区。 你将为工作区句柄创建 ml_client。 然后,你将使用 ml_client 来管理资源和作业。

在下一个单元格中,输入你的订阅 ID、资源组名称和工作区名称。 若要查找这些值:

  1. 在右上方的 Azure 机器学习工作室工具栏中,选择你的工作区名称。
  2. 将工作区、资源组和订阅 ID 的值复制到代码中。
  3. 需要复制一个值,关闭区域并粘贴,然后返回下一个值。
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
from azure.ai.ml.entities import Data
from azure.ai.ml.constants import AssetTypes

# authenticate
credential = DefaultAzureCredential()

# Get a handle to the workspace
ml_client = MLClient(
    credential=credential,
    subscription_id="<SUBSCRIPTION_ID>",
    resource_group_name="<RESOURCE_GROUP>",
    workspace_name="<AML_WORKSPACE_NAME>",
)

注意

创建 MLClient 不会连接到工作区。 客户端初始化是迟缓的,它将等待它首次需要调用(这将在下一个代码单元格中发生)。

将数据上传到云存储空间

Azure 机器学习使用统一资源标识符 (URI),它们指向云中的存储位置。 使用 URI 可以轻松访问笔记本和作业中的数据。 数据 URI 格式类似于在 Web 浏览器中用于访问网页的 Web URL。 例如:

  • 从公共 https 服务器访问数据:https://<account_name>.blob.core.chinacloudapi.cn/<container_name>/<folder>/<file>
  • 从 Azure Data Lake Gen 2 访问数据:abfss://<file_system>@<account_name>.dfs.core.chinacloudapi.cn/<folder>/<file>

Azure 机器学习数据资产类似于 Web 浏览器书签(收藏夹)。 可以创建数据资产,然后使用易记名称访问该资产,而无需记住指向最常用数据的冗长存储路径 (URI)。

通过创建数据资产,还可以创建对数据源位置的引用及其元数据的副本。 由于数据保留在其现有位置中,因此不会产生额外的存储成本,也不会损害数据源的完整性。 可以从 Azure 机器学习数据存储、Azure 存储、公共 URL 和本地文件创建数据资产。

提示

对于较小的数据上传,Azure 机器学习数据资产创建适用于从本地计算机资源到云存储空间的数据上传。 此方法可避免使用额外的工具或实用工具。 但是,较大的数据上传可能需要专用工具或实用工具(例如 azcopy)。 azcopy 命令行工具可将数据移向和移出 Azure 存储。 在此处详细了解 azcopy。

下一个笔记本单元格会创建数据资产。 此代码示例将原始数据文件上传到指定的云存储资源。

每次创建数据资产时,都需要为其创建唯一版本。 如果版本已存在,则会收到错误。 在此代码中,我们将对数据第一次读取使用“initial”。 如果该版本已存在,我们将跳过再次创建它。

还可以省略 version 参数,版本号会为你生成,从 1 开始,然后递增。

在本教程中,我们使用名称“initial”作为第一个版本。 创建生产机器学习管道教程也将使用此版本的数据,因此在这里,我们使用你将在该教程中再次看到的值。

from azure.ai.ml.entities import Data
from azure.ai.ml.constants import AssetTypes

# update the 'my_path' variable to match the location of where you downloaded the data on your
# local filesystem

my_path = "./data/default_of_credit_card_clients.csv"
# set the version number of the data asset
v1 = "initial"

my_data = Data(
    name="credit-card",
    version=v1,
    description="Credit card data",
    path=my_path,
    type=AssetTypes.URI_FILE,
)

## create data asset if it doesn't already exist:
try:
    data_asset = ml_client.data.get(name="credit-card", version=v1)
    print(
        f"Data asset already exists. Name: {my_data.name}, version: {my_data.version}"
    )
except:
    ml_client.data.create_or_update(my_data)
    print(f"Data asset created. Name: {my_data.name}, version: {my_data.version}")

可以通过选择左侧的“数据”来查看上传的数据。 你将看到数据已上传且数据资产已创建:

Screenshot shows the data in studio.

此数据命名为 credit-card,在“数据资产”选项卡中,可以在“名称”列中看到它。 此数据上传到工作区的默认数据存储 workspaceblobstore,显示在“数据源”列中。

Azure 机器学习数据存储是对 Azure 上现有存储帐户的引用。 数据存储具有以下优势:

  1. 一种通用且易用的 API,可以与不同的存储类型(Blob/文件/Azure Data Lake Storage)和身份验证方法进行交互。
  2. 一种在团队协作时更轻松地发现有用的数据存储的方式。
  3. 在你的脚本中,隐藏基于凭据的数据访问连接信息的方法(服务主体/SAS/密钥)。

访问笔记本中的数据

Pandas 直接支持 URI - 此示例演示如何从 Azure 机器学习数据存储读取 CSV 文件:

import pandas as pd

df = pd.read_csv("azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<filename>.csv")

但是,如前所述,可能很难记住这些 URI。 此外,必须手动将 pd.read_csv 命令中的所有 <substring> 值替换为资源的实际值。

需要为经常访问的数据创建数据资产。 下面是在 Pandas 中访问 CSV 文件的更简单的方法:

重要

在笔记本单元格中,执行以下代码以在 Jupyter 内核中安装 azureml-fsspec Python 库:

%pip install -U azureml-fsspec
import pandas as pd

# get a handle of the data asset and print the URI
data_asset = ml_client.data.get(name="credit-card", version=v1)
print(f"Data asset URI: {data_asset.path}")

# read into pandas - note that you will see 2 headers in your data frame - that is ok, for now

df = pd.read_csv(data_asset.path)
df.head()

阅读在交互式开发期间从 Azure 云存储访问数据,详细了解笔记本中的数据访问。

创建新版本的数据资产

你可能已注意到,数据需要稍微清理一下,使其适合训练机器学习模型。 它具有:

  • 两个标头
  • 客户端 ID 列;我们不会在机器学习中使用此功能
  • 响应变量名称中的空格

此外,与 CSV 格式相比,Parquet 文件格式成为存储此数据的更好方法。 Parquet 可提供压缩,并维护架构。 因此,若要清理数据并将其存储在 Parquet 中,请使用:

# read in data again, this time using the 2nd row as the header
df = pd.read_csv(data_asset.path, header=1)
# rename column
df.rename(columns={"default payment next month": "default"}, inplace=True)
# remove ID column
df.drop("ID", axis=1, inplace=True)

# write file to filesystem
df.to_parquet("./data/cleaned-credit-card.parquet")

此表显示了在前面的步骤中下载的原始 default_of_credit_card_clients.csv .CSV 文件中的数据结构。 上传的数据包含 23 个解释变量和 1 个响应变量,如下所示:

列名 变量类型 说明
X1 解释型 给予的信贷金额(新台币):它包括个人消费信贷和他们的家庭(附加)信贷。
X2 解释型 性别(1 = 男性;2 = 女性)。
X3 解释型 教育(1 = 研究生;2 = 本科;3 = 高中;4 = 其他)。
X4 解释型 婚姻状况(1 = 已婚;2 = 单身;3 = 其他)。
X5 解释型 年龄(年)。
X6-X11 解释型 过去付款的历史记录。 我们跟踪了过去的每月付款记录(从 2005 年 4 月到 9 月)。 -1 = 按期付款;1 = 付款延迟一个月;2 = 付款延迟两个月; 。 8 = 付款延迟 8 个月;9 = 付款延迟 9 个月及以上。
X12-17 解释型 2005 年 4 月到 9 月账单金额流水(新台币)。
X18-23 解释型 2005 年 4 月到 9 月的先前付款金额(新台币)。
Y 响应 默认付款(是 = 1,否 = 0)

接下来,创建数据资产的新版本(数据会自动上传到云存储空间)。 对于此版本,我们将添加一个时间值,以便每次运行此代码时,都会创建不同的版本号。

from azure.ai.ml.entities import Data
from azure.ai.ml.constants import AssetTypes
import time

# Next, create a new *version* of the data asset (the data is automatically uploaded to cloud storage):
v2 = "cleaned" + time.strftime("%Y.%m.%d.%H%M%S", time.gmtime())
my_path = "./data/cleaned-credit-card.parquet"

# Define the data asset, and use tags to make it clear the asset can be used in training

my_data = Data(
    name="credit-card",
    version=v2,
    description="Default of credit card clients data.",
    tags={"training_data": "true", "format": "parquet"},
    path=my_path,
    type=AssetTypes.URI_FILE,
)

## create the data asset

my_data = ml_client.data.create_or_update(my_data)

print(f"Data asset created. Name: {my_data.name}, version: {my_data.version}")

清理的 parquet 文件是最新版本的数据源。 此代码先显示 CSV 版本结果集,然后显示 Parquet 版本:

import pandas as pd

# get a handle of the data asset and print the URI
data_asset_v1 = ml_client.data.get(name="credit-card", version=v1)
data_asset_v2 = ml_client.data.get(name="credit-card", version=v2)

# print the v1 data
print(f"V1 Data asset URI: {data_asset_v1.path}")
v1df = pd.read_csv(data_asset_v1.path)
print(v1df.head(5))

# print the v2 data
print(
    "_____________________________________________________________________________________________________________\n"
)
print(f"V2 Data asset URI: {data_asset_v2.path}")
v2df = pd.read_parquet(data_asset_v2.path)
print(v2df.head(5))

清理资源

如果打算继续学习其他教程,请跳到后续步骤

停止计算实例

如果不打算现在使用它,请停止计算实例:

  1. 在工作室的左侧导航区域中,选择“计算”。
  2. 在顶部选项卡中,选择“计算实例”
  3. 在列表中选择该计算实例。
  4. 在顶部工具栏中,选择“停止”。

删除所有资源

重要

已创建的资源可用作其他 Azure 机器学习教程和操作方法文章的先决条件。

如果你不打算使用已创建的任何资源,请删除它们,以免产生任何费用:

  1. 在 Azure 门户中,选择最左侧的“资源组” 。

  2. 从列表中选择你创建的资源组。

  3. 选择“删除资源组”

    Screenshot of the selections to delete a resource group in the Azure portal.

  4. 输入资源组名称。 然后选择“删除”。

后续步骤

有关数据资产的详细信息,请参阅创建数据资产

阅读创建数据存储以详细了解数据存储.

继续学习教程,了解如何开发训练脚本。