建立 Azure Machine Learning 資料集

適用於:Python SDK azureml v1

在本文中,您將了解如何建立 Azure Machine Learning 資料集來存取資料,供透過 Azure Machine Learning Python SDK 執行本機或遠端實驗使用。 若要了解資料集安插在 Azure Machine Learning 整體資料存取工作流程中的何處,請參閱安全存取資料一文。

藉由建立資料集,您可以建立資料來源位置的參考,以及其中繼資料的複本。 因為資料留在現有位置,所以不會產生額外的儲存成本,也不損及資料來源的完整性。 此外也會延遲評估資料集,有助於提升工作流程效能速度。 您可以從資料存放區、公用 URL 和 Azure 開放資料集建立資料集。

如需低程式碼體驗,請使用 Azure Machine Learning 工作室建立 Azure Machine Learning 資料集

Azure Machine Learning 資料集可讓您:

  • 在儲存體中保留資料的單一複本,供資料集參考。

  • 在模型定型期間順暢地存取資料,而不需要擔心連接字串或資料路徑。 深入了解如何使用資料集進行定型

  • 與其他使用者共用資料並共同作業。

重要

本文中標示為「預覽」的項目目前處於公開預覽狀態。 此預覽版本會在沒有服務等級協定的情況下提供,不建議用於實際執行工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款

必要條件

若要建立和使用資料集,您需要:

注意

某些資料集類別對 azureml-dataprep 封裝 (只相容於 64 位元 Python) 具有相依性。 如果您在 Linux 進行開發,則這些類別依賴 .NET Core 2.1,而且只在特定的發行版本上才支援。 有關支援的發行版本,如需詳細資訊,請參閱在 Linux 上安裝 .NET 一文中的 .NET Core 2.1 專欄。

重要

雖然封裝可在舊版的 Linux 發行版本上運作,但不建議您使用沒有主要支援的發行版本。 沒有主要支援的發行版本不會收到最新的更新,可能有安全性弱點。 建議您使用相容的最新支援發行版本。

計算大小指導

建立資料集時,請檢閱計算處理能力和記憶體中的資料大小。 儲存體中的資料大小與資料框架中的資料大小不同。 例如,CSV 檔案中的資料在資料框架中可能擴大至 10 倍,因此 1 GB 的 CSV 檔案在資料框架中可能變成 10 GB。

如果資料已壓縮,則可能進一步擴大;以 Parquet 壓縮格式儲存的 20 GB 相對稀疏資料在記憶體中可能擴大至 ~800 GB。 由於 Parquet 檔案以單欄式格式儲存資料,如果您只需要一半的資料行,則只需要在記憶體中載入 ~400 GB。

深入了解在 Azure Machine Learning 中最佳化資料處理

資料集類型

有兩種資料集類型,視使用者在定型中如何取用而定:FileDataset 和 TabularDataset。 這兩種類型都可用在 Azure Machine Learning 定型工作流程中,包括估算器、AutoML、hyperDrive 和管線。

FileDataset

FileDataset 參考資料存放區或公用 URL 中的單一或多個檔案。 如果資料已清理而隨時可用於定型實驗,則您可以將檔案當作 FileDataset 物件下載或裝載至計算目標。

建議在機器學習工作流程中使用 FileDataset,因為來源檔案可以是任何格式,能夠支援更廣泛的機器學習情節,包括深度學習。

使用 Python SDKAzure Machine Learning 工作室建立 FileDataset。

TabularDataset

TabularDataset 剖析提供的檔案或檔案清單,以表格式格式呈現資料。 這可讓您將資料具體化為 Pandas 或 Spark 資料框架,以使用熟悉的資料準備和定型程式庫,而不需要離開筆記本。 您可以從 .csv、.tsv、.parquet.jsonl 檔案SQL 查詢結果建立 TabularDataset 物件。

使用 TabularDataset 可讓您從資料中的資料行,或從儲存路徑模式資料的任何位置指定時間戳記,以啟用時間序列特徵。 這樣指定可讓您輕鬆又有效率依時間篩選。 如需範例,請參閱 NOAA 氣象資料的表格式時間序列相關 API 示範

使用 Python SDKAzure Machine Learning 工作室建立 TabularDataset。

注意

透過 Azure Machine Learning 工作室產生的自動化 ML 工作流程目前僅支援 TabularDataset。

注意

不支援針對從 SQL 查詢結果產生的 TabularDatasets、T-SQL (例如'WITH' 子查詢) 或重複的資料行名稱。 T-SQL 之類的複雜查詢可能導致效能問題。 資料集中的重復資料行名稱可能導致模棱兩可的問題。

在虛擬網路中存取資料集

如果工作區位於虛擬網路中,您必須將資料集設定為略過驗證。 如需如何在虛擬網路中使用資料存放區和資料集的詳細資訊,請參閱保護工作區和相關聯的資源

從資料存放區建立資料集

若要讓 Azure Machine Learning 存取資料,必須從 Azure 資料存放區或公用 Web URL 中的路徑建立資料集。

提示

您可以使用以身分識別為基礎的資料存取,直接從儲存體 URL 建立資料集。 若要深入了解,請參閱使用以身分識別為基礎的資料存取來連線至儲存體

使用 Python SDK 從資料存放區建立資料集:

  1. 對於已註冊的 Azure Machine Learning 資料存放區的基礎儲存體服務,請確認您具備 contributorowner 存取權。 在 Azure 入口網站中檢查儲存體帳戶權限

  2. 參考資料存放區中的路徑來建立資料集。 您可以從多個資料存放區中的多個路徑建立資料集。 用於建立資料集的檔案數目或資料大小沒有硬性限制。

注意

針對每個資料路徑,將會傳送幾個要求到儲存體服務,以檢查是否指向檔案或資料夾。 此額外負荷可能導致效能降低或失敗。 如果資料集參考的一個資料夾裡面有 1000 個檔案,則視為參考一個資料路徑。 建議您建立的資料集在資料存放區中參考不超過 100 個路徑,以獲得最佳效能。

建立 FileDataset

from_files() 類別上使用 FileDatasetFactory 方法,以載入任何格式的檔案及建立未註冊的 FileDataset。

如果儲存體位於虛擬網路或防火牆後方,請在 from_files() 方法中設定 validate=False 參數。 這樣可略過初始驗證檢查,並確保您可以從這些安全檔案建立資料集。 深入了解如何在虛擬網路中使用資料存放區和資料集

from azureml.core import Workspace, Datastore, Dataset

# create a FileDataset pointing to files in 'animals' folder and its subfolders recursively
datastore_paths = [(datastore, 'animals')]
animal_ds = Dataset.File.from_files(path=datastore_paths)

# create a FileDataset from image and label files behind public web urls
web_paths = ['https://azureopendatastorage.blob.core.windows.net/mnist/train-images-idx3-ubyte.gz',
             'https://azureopendatastorage.blob.core.windows.net/mnist/train-labels-idx1-ubyte.gz']
mnist_ds = Dataset.File.from_files(path=web_paths)

如果您要從本機目錄上傳所有檔案,請使用 upload_directory() 在單一方法中建立 FileDataset。 此方法將資料上傳至基礎儲存體,因此會產生儲存體成本。

from azureml.core import Workspace, Datastore, Dataset
from azureml.data.datapath import DataPath

ws = Workspace.from_config()
datastore = Datastore.get(ws, '<name of your datastore>')
ds = Dataset.File.upload_directory(src_dir='<path to you data>',
           target=DataPath(datastore,  '<path on the datastore>'),
           show_progress=True)

若要在工作區中跨實驗重複使用並共用資料集,請註冊資料集

建立 TabularDataset

from_delimited_files() 類別上使用 TabularDatasetFactory 方法,以讀取 .csv 或 .tsv 格式的檔案及建立未註冊的 TabularDataset。 若要從 .parquet 格式讀取檔案,請使用 from_parquet_files() 方法。 如果您讀取多個檔案,則結果將彙總為一個表格式表示法。

如需支援的檔案格式及語法和設計模式 (例如多行支援) 的相關資訊,請參閱 TabularDatasetFactory 參考文件

如果儲存體位於虛擬網路或防火牆後方,請在 from_delimited_files() 方法中設定 validate=False 參數。 這樣可略過初始驗證檢查,並確保您可以從這些安全檔案建立資料集。 深入了解如何在虛擬網路中使用資料存放區和資料集

下列程式碼依名稱取得現有的工作區和所需的資料存放區。 然後將資料存放區和檔案位置傳遞至 path 參數,以建立新的 TabularDataset weather_ds

from azureml.core import Workspace, Datastore, Dataset

datastore_name = 'your datastore name'

# get existing workspace
workspace = Workspace.from_config()
    
# retrieve an existing datastore in the workspace by name
datastore = Datastore.get(workspace, datastore_name)

# create a TabularDataset from 3 file paths in datastore
datastore_paths = [(datastore, 'weather/2018/11.csv'),
                   (datastore, 'weather/2018/12.csv'),
                   (datastore, 'weather/2019/*.csv')]

weather_ds = Dataset.Tabular.from_delimited_files(path=datastore_paths)

設定資料結構描述

當您建立 TabularDataset 時,預設會自動推斷資料行資料類型。 如果推斷的類型不符合預期,您可以使用下列程式碼來指定資料行類型,以更新資料集結構描述。 參數 infer_column_type 僅適用於從分隔檔案建立的資料集。 深入了解支援的資料類型

from azureml.core import Dataset
from azureml.data.dataset_factory import DataType

# create a TabularDataset from a delimited file behind a public web url and convert column "Survived" to boolean
web_path ='https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_path, set_column_types={'Survived': DataType.to_bool()})

# preview the first 3 rows of titanic_ds
titanic_ds.take(3).to_pandas_dataframe()
(索引) PassengerId 存活的 Pclass 名稱 性別 年齡 SibSp Parch 票證 費用 船艙 Embarked
0 1 False 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 S
1 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Th... 女性 38.0 1 0 PC 17599 71.2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina 女性 26.0 0 0 STON/O2. 3101282 7.9250 S

若要在工作區中跨實驗重複使用並共用資料集,請註冊資料集

整頓資料

建立並註冊資料集之後,您可以將資料集載入筆記本,以利於模型定型之前的資料整頓和探索

如果您不需要進行任何資料整頓或探索,請參閱使用資料集定型,以了解如何在定型指令碼中取用資料集來提交 ML 實驗。

篩選資料集 (預覽)

篩選功能取決於您擁有的資料集類型。

重要

使用預覽方法 filter() 來篩選資料集是實驗性預覽功能,可能隨時變更。

針對 TabularDataset,您可以使用 keep_columns()drop_columns() 方法來保留或移除資料行。

若要在 TabularDataset 中依特定資料行值篩選出資料列,請使用 filter() 方法 (預覽)。

下列範例根據指定的運算式傳回未註冊的資料集。

# TabularDataset that only contains records where the age column value is greater than 15
tabular_dataset = tabular_dataset.filter(tabular_dataset['age'] > 15)

# TabularDataset that contains records where the name column value contains 'Bri' and the age column value is greater than 15
tabular_dataset = tabular_dataset.filter((tabular_dataset['name'].contains('Bri')) & (tabular_dataset['age'] > 15))

在 FileDataset 中,每個資料列對應至檔案的路徑,因此依資料行值篩選沒有用。 但是,您可以依 CreationTime、Size 等中繼資料來 filter() 資料列。

下列範例根據指定的運算式傳回未註冊的資料集。

# FileDataset that only contains files where Size is less than 100000
file_dataset = file_dataset.filter(file_dataset.file_metadata['Size'] < 100000)

# FileDataset that only contains files that were either created prior to Jan 1, 2020 or where 
file_dataset = file_dataset.filter((file_dataset.file_metadata['CreatedTime'] < datetime(2020,1,1)) | (file_dataset.file_metadata['CanSeek'] == False))

影像標記專案建立的標記資料集是特殊案例。 這些資料集是由影像檔組成的一種 TabularDataset。 針對這幾種資料集,您可以依中繼資料和資料行值 (例如 labelimage_details) 來 filter() 影像。

# Dataset that only contains records where the label column value is dog
labeled_dataset = labeled_dataset.filter(labeled_dataset['label'] == 'dog')

# Dataset that only contains records where the label and isCrowd columns are True and where the file size is larger than 100000
labeled_dataset = labeled_dataset.filter((labeled_dataset['label']['isCrowd'] == True) & (labeled_dataset.file_metadata['Size'] > 100000))

分割資料

您可以在建立 TabularDataset 或 FileDataset 時加入 partitions_format 參數,以分割資料集。

分割資料集時會根據指定的格式,將每個檔案路徑的分割資訊擷取至資料行中。 格式應該從第一個分割區索引鍵的位置開始,直到檔案路徑的結尾為止。

例如,假設路徑為 ../Accounts/2019/01/01/data.jsonl,其中依部門名稱和時間來分割;partition_format='/{Department}/{PartitionDate:yyyy/MM/dd}/data.jsonl' 建立字串資料行 'Department',值為 'Accounts',還建立日期時間資料行 'PartitionDate',值為 2019-01-01

如果資料已有現有的分割區,而您想要保留該格式,請在 from_files() 方法中加入 partitioned_format 參數來建立 FileDataset。

若要建立保留現有分割區的 TabularDataset,請在 from_parquet_files()from_delimited_files() 方法中加入 partitioned_format 參數。

下列範例,

  • 從分割的檔案建立 FileDataset。
  • 取得分割區索引鍵
  • 建立新的、已編製索引的 FileDataset

file_dataset = Dataset.File.from_files(data_paths, partition_format = '{userid}/*.wav')
ds.register(name='speech_dataset')

# access partition_keys
indexes = file_dataset.partition_keys # ['userid']

# get all partition key value pairs should return [{'userid': 'user1'}, {'userid': 'user2'}]
partitions = file_dataset.get_partition_key_values()


partitions = file_dataset.get_partition_key_values(['userid'])
# return [{'userid': 'user1'}, {'userid': 'user2'}]

# filter API, this will only download data from user1/ folder
new_file_dataset = file_dataset.filter(ds['userid'] == 'user1').download()

您也可以使用 partitions_by() 方法,為 TabularDataset 建立新的分割區結構。


 dataset = Dataset.get_by_name('test') # indexed by country, state, partition_date

# call partition_by locally
new_dataset = ds.partition_by(name="repartitioned_ds", partition_keys=['country'], target=DataPath(datastore, "repartition"))
partition_keys = new_dataset.partition_keys # ['country']

探索資料

資料整頓完畢之後,您可以註冊資料集,然後將資料集載入筆記本,以利於模型定型之前的資料探索。

針對 FileDataset,您可以裝載下載資料集,並套用您通常用於資料探索的 Python 程式庫。 深入了解裝載與下載

# download the dataset 
dataset.download(target_path='.', overwrite=False) 

# mount dataset to the temp directory at `mounted_path`

import tempfile
mounted_path = tempfile.mkdtemp()
mount_context = dataset.mount(mounted_path)

mount_context.start()

針對 TabularDataset,請使用 to_pandas_dataframe() 方法來檢視資料框架中的資料。

# preview the first 3 rows of titanic_ds
titanic_ds.take(3).to_pandas_dataframe()
(索引) PassengerId 存活的 Pclass 名稱 性別 年齡 SibSp Parch 票證 費用 船艙 Embarked
0 1 False 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 S
1 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Th... 女性 38.0 1 0 PC 17599 71.2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina 女性 26.0 0 0 STON/O2. 3101282 7.9250 S

從 Pandas 資料框架建立資料集

若要從記憶體內 Pandas 資料框架建立 TabularDataset,請使用 register_pandas_dataframe() 方法。 此方法向工作區註冊 TabularDataset,並將資料上傳至基礎儲存體,這會產生儲存體成本。

from azureml.core import Workspace, Datastore, Dataset
import pandas as pd

pandas_df = pd.read_csv('<path to your csv file>')
ws = Workspace.from_config()
datastore = Datastore.get(ws, '<name of your datastore>')
dataset = Dataset.Tabular.register_pandas_dataframe(pandas_df, datastore, "dataset_from_pandas_df", show_progress=True)

提示

使用公開預覽方法 register_spark_dataframe()register_dask_dataframe(),從記憶體內 Spark 資料框架或 Dask 資料框架建立和註冊 TabularDataset。 這些方法是實驗性預覽功能,可能隨時變更。

這些方法將資料上傳至基礎儲存體,因此會產生儲存體成本。

註冊資料集

若要完成建立流程,請向工作區註冊資料集。 使用 register() 方法向工作區註冊資料集,以便與其他人共用,並在工作區中跨實驗重複使用:

titanic_ds = titanic_ds.register(workspace=workspace,
                                 name='titanic_ds',
                                 description='titanic training data')

使用 Azure Resource Manager 建立資料集

https://github.com/Azure/azure-quickstart-templates/tree/master//quickstarts/microsoft.machinelearningservices 上有許多範本可用於建立資料集。

如需有關使用這些範本的資訊,請參閱使用 Azure Resource Manager 範本建立 Azure Machine Learning 的工作區

使用資料集定型

在機器學習實驗中使用資料集來定型 ML 模型。 深入了解如何使用資料集進行定型

資料集版本設定

您可以建立新的版本,以相同名稱註冊新的資料集。 資料集版本是將資料的狀態設為書籤的一種方式,可讓您套用特定版本的資料集,以供實驗或未來重新產生。 深入了解資料集版本

# create a TabularDataset from Titanic training data
web_paths = ['https://dprepdata.blob.core.windows.net/demo/Titanic.csv',
             'https://dprepdata.blob.core.windows.net/demo/Titanic2.csv']
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_paths)

# create a new version of titanic_ds
titanic_ds = titanic_ds.register(workspace = workspace,
                                 name = 'titanic_ds',
                                 description = 'new titanic training data',
                                 create_new_version = True)

下一步