建立 Azure Machine Learning 資料集
在本文中,您將了解如何建立 Azure Machine Learning 資料集來存取資料,供透過 Azure Machine Learning Python SDK 執行本機或遠端實驗使用。 如需資料集如何融入 Azure Machine Learning 整體資料存取工作流程的詳細資訊,請參閱安全地存取資料一文。
當您建立資料集,您可建立資料來源位置的參考,以及其中繼資料的複本。 因為資料留在現有位置,所以不會產生額外的儲存成本,也不損及資料來源的完整性。 此外,資料集會緩慢地評估,這有助於改善工作流程效能速度。 您可以從資料存放區、公用 URL 和 Azure 開放資料集建立資料集。 如需低程式碼體驗的相關資訊,請參閱使用 Azure Machine Learning 工作室建立 Azure Machine Learning 資料集。
Azure Machine Learning 資料集可讓您:
在儲存體中保留資料的單一複本,供資料集參考
在模型定型期間順暢地存取資料,而不需要擔心連接字串或資料路徑。 如需資料集定型的詳細資訊,請參閱深入了解如何使用資料集定型
與其他使用者共用資料並共同作業
重要
本文中標示為「預覽」的項目,目前處於公開預覽狀態。 此預覽版本會在沒有服務等級協定的情況下提供,不建議用於實際執行工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款。
必要條件
若要建立和使用資料集,您需要:
Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。 試用免費或付費版本的 Azure Machine Learning
已安裝適用於 Python 的 Azure Machine Learning SDK,其中包含 azureml-datasets 封裝
建立 Azure Machine Learning 計算執行個體,此為完整設定和受控的開發環境,其中已安裝整合式筆記本和 SDK
OR
使用您自己的 Jupyter 筆記本,並自行安裝 SDK
注意
某些資料集類別對 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。 涉及估算器、AutoML、hyperDrive 和管線的 Azure Machine Learning 定型工作流程可以使用這兩種類型。
FileDataset
FileDataset 參考資料存放區或公用 URL 中的單一或多個檔案。 如果資料已清理而隨時可用於定型實驗,則您可以將檔案當作 FileDataset 物件下載或裝載至計算目標。
建議您針對機器學習工作流程使用 FileDatasets,因為來源檔案可以是任何格式。 這可達成更廣泛的機器學習案例,包括深度學習。
使用 Python SDK 或 Azure Machine Learning 工作室建立 FileDataset。
TabularDataset
TabularDataset 可剖析所提供的檔案或檔案清單,以表格式格式呈現資料。 然後,您可將資料具體化為 pandas 或 Spark DataFrame,以在停留於筆記本時處理熟悉的資料準備和定型程式庫。 您可以從 .csv、.tsv、.parquet、.jsonl 檔案,以及從 SQL 查詢結果建立 TabularDataset
物件。
使用 TabularDataset 可讓您從資料中的資料行,或從儲存路徑模式資料的位置指定時間戳記,以啟用時間序列特徵。 這樣指定可讓您輕鬆又有效率依時間篩選。 如需範例,請參閱 NOAA 氣象資料的表格式時間序列相關 API 示範。
使用 Python SDK 或 Azure Machine Learning 工作室建立 TabularDataset。
注意
透過 Azure Machine Learning 工作室產生的自動化 ML 工作流程目前僅支援 TabularDataset。
此外,不支援針對從 SQL 查詢結果產生的 TabularDatasets、T-SQL (例如'WITH' 子查詢) 或重複的資料行名稱。 複雜的 T-SQL 查詢可能會導致效能問題。 資料集中的重復資料行名稱可能導致模棱兩可的問題。
在虛擬網路中存取資料集
如果工作區位於虛擬網路中,您必須將資料集設定為略過驗證。 如需如何在虛擬網路中使用資料存放區和資料集的詳細資訊,請參閱保護工作區和相關聯的資源。
從資料存放區建立資料集
若要讓 Azure Machine Learning 可存取資料,您必須從 Web URL 或 Azure Machine Learning 資料存放區中的路徑建立資料集。
提示
您可以使用以身分識別為基礎的資料存取,直接從儲存體 URL 建立資料集。 如需詳細資訊,請參閱使用身分識別型資料存取連線至儲存體。
使用 Python SDK 從資料存放區建立資料集:
對於已註冊的 Azure Machine Learning 資料存放區的基礎儲存體服務,請確認您具備
contributor
或owner
存取權。 在 Azure 入口網站中檢查儲存體帳戶權限。參考資料存放區中的路徑來建立資料集。 您可以從多個資料存放區中的多個路徑建立資料集。 用於建立資料的檔案數目或資料大小沒有硬性限制。
注意
針對每個資料路徑,將會傳送幾個要求到儲存體服務,以檢查是否指向檔案或資料夾。 此額外負荷可能導致效能降低或失敗。 如果資料集參考的一個資料夾裡面有 1000 個檔案,則視為參考一個資料路徑。 如需最佳效能,建議您建立的資料集在資料存放區中參考不超過 100 個路徑。
建立 FileDataset
在 from_files()
類別上使用 FileDatasetFactory
方法,以載入任何格式的檔案及建立未註冊的 FileDataset。
如果儲存體位於虛擬網路或防火牆後方,請在 from_files()
方法中設定 validate=False
參數。 這樣可略過初始驗證檢查,並確保您可以從這些安全檔案建立資料集。 如需詳細資訊,請參閱在虛擬網路中使用資料存放區和資料集。
from azureml.core import Workspace, Datastore, Dataset
# create a FileDataset recursively pointing to files in 'animals' folder and its subfolder
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
參數,以建立名為 weather_ds
的新 TabularDataset:
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 實驗提交的定型指令碼中取用資料集的詳細資訊,請參閱使用資料集定型。
篩選資料集 (預覽)
篩選功能取決於您擁有的資料集類型。
針對 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 中,每個資料列對應至檔案的路徑,因此依資料行值篩選沒有用。 不過,您可以依中繼資料 filter() 資料列,例如 CreationTime、Size 等。下列範例根據指定的運算式傳回未註冊的資料集:
# 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。 針對這些資料集,您可依中繼資料及 label
和 image_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 建立資料集
您可以在 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)
下一步
- 了解如何使用資料集定型
- 透過自動化機器學習來使用 TabularDataset 定型
- 如需更多資料集定型範例,請參閱範例筆記本