Azure Machine Learning データセットを作成する

適用対象:Python SDK azureml v1

この記事では、Azure Machine Learning Python SDK を使用して、Azure Machine Learning データセットを作成し、ローカルまたはリモートの実験のデータにアクセスする方法について説明します。 Azure Machine Learning のデータ アクセス ワークフロー全体にデータ セットがいかに適合しているかについては詳しくは、データへの安全なアクセスに関する記事をご覧ください。

データセットを作成する場合、データ ソースの場所への参照とそのメタデータのコピーを作成します。 データは既存の場所に残るため、追加のストレージ コストは発生せず、データ ソースの整合性が損なわれることはありません。 さらに、データセットは遅延評価されるので、ワークフローのパフォーマンス向上に役立ちます。 データセットは、データストア、パブリック URL、Azure Open Dataset から作成できます。 ローコード エクスペリエンスについては、Azure Machine Learning スタジオを使用した Azure Machine Learning データセットの作成に関するページを参照してください。

Azure Machine Learning データセットを使用すると、次のことを実行できます。

  • データセットから参照されるデータの 1 つのコピーをストレージに保存する

  • 接続文字列やデータ パスを気にすることなく、モデルのトレーニング中にデータにシームレスにアクセスする。 データセットのトレーニングの詳細については、データセットを使用してトレーニングする方法の詳細に関するページを参照してください

  • 他のユーザーとデータを共有し、共同作業を行う

重要

この記事で "プレビュー" と付記されている項目は、現在、パブリック プレビュー段階です。 プレビュー バージョンはサービス レベル アグリーメントなしで提供されています。運用環境のワークロードに使用することはお勧めできません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

前提条件

データセットを作成して操作するには、以下が必要です。

Note

一部の Dataset クラスは、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 の 2 つの種類があります。 推定器、AutoML、hyperDrive、パイプラインが含まれる Azure Machine Learning のトレーニング ワークフローでは、どちらの種類も使用できます。

FileDataset

FileDataset は、データストアまたはパブリック URL 内の 1 つまたは複数のファイルを参照します。 データがクレンジング済みで、トレーニング実験で使用できる状態になっている場合は、ファイルを FileDataset オブジェクトとしてコンピューティングにダウンロードまたはマウントできます。

ソース ファイルはどのような形式でもよいため、機械学習のワークフローには FileDatasets を使用することをお勧めします。 これにより、ディープ ラーニングなどの幅広い機械学習シナリオに対応します。

FileDataset を作成するには、Python SDK または Azure Machine Learning Studio を使用します。

TabularDataset

TabularDataset は、指定されたファイルまたはファイルのリストを解析して、データを表形式で表します。 そのため、データを Pandas または Spark DataFrame に具体化して、ノートブックにとどまったままで、使い慣れたデータ準備とトレーニングのライブラリを使用することができます。 TabularDataset オブジェクトは、.csv、.tsv、.parquet.json lines の各ファイル、および SQL クエリ結果から作成できます。

TabularDataset を使用すると、データの列から、またはパス パターン データが格納されている場所からタイム スタンプを指定して、時系列特性を有効にすることができます。 この指定により、時間による簡単かつ効率的なフィルター処理が有効になります。 例については、「NOAA 気象データを使用した表形式の時系列関連の API のデモ」をご覧ください。

TabularDataset は、Python SDK または Azure Machine Learning Studio を使用して作成します。

注意

現在、Azure Machine Learning スタジオを使用して生成された Automated ML ワークフローでは、TabularDataset のみがサポートされています。

また、SQL クエリ結果から生成される TabularDataset の場合、T-SQL ('WITH' サブクエリなど) または重複する列名はサポートされていません。 複雑な T-SQL クエリでは、パフォーマンスの問題が発生する可能性があります。 データセット内の列名が重複すると、あいまいさの問題が発生する可能性があります。

仮想ネットワーク内のデータセットにアクセスする

ワークスペースが仮想ネットワーク内にある場合は、検証をスキップするようにデータセットを構成する必要があります。 仮想ネットワークでデータストアとデータセットを使用する方法の詳細については、ワークスペースと関連付けられているリソースをセキュリティで保護する方法に関するページをご覧ください。

データストアからデータセットを作成する

データを Azure Machine Learning からアクセスできるようにするには、Web URL または Azure Machine Learning データストアのパスからデータセットを作成する必要があります。

ヒント

ID ベースのデータ アクセスを使用して、ストレージ URL からデータセットを直接作成できます。 詳細については、ID ベースのデータ アクセスを使用したストレージへの接続に関するページを参照してください。

Python SDK を使用してデータストアからデータセットを作成するには、次の手順を実行します。

  1. 登録されている Azure Machine Learning データストアの基になるストレージ サービスに対して contributor または owner のアクセス権があることを確認します。 Azure portal でストレージ アカウントのアクセス許可を確認します

  2. データストア内のパスを参照してデータセットを作成します。 複数のデータストア内の複数のパスからデータセットを作成できます。 データセットの作成元として使用できるファイルの数やデータ サイズには、厳密な制限はありません。

Note

データ パスごとに、いくつかの要求がストレージ サービスに送信され、ファイルまたはフォルダーを指しているかどうかが確認されます。 このオーバーヘッドによって、パフォーマンスが低下したり、エラーが発生したりする可能性があります。 1000 個のファイルを含む 1 つのフォルダーを参照するデータセットは、1 つのデータ パスを参照していると見なされます。 最適なパフォーマンスを得るために、データストア内の 100 未満のパスを参照するデータセットを作成することをお勧めします。

FileDataset を作成する

任意の形式のファイルを読み込み、登録されていない FileDataset を作成するには、FileDatasetFactory クラスの from_files() メソッドを使用します。

ストレージが仮想ネットワークまたはファイアウォールの内側にある場合は、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() を使用して 1 つのメソッドで 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 を作成する

.csv 形式または .tsv 形式のファイルを読み取り、登録されていない TabularDataset を作成するには、TabularDatasetFactory クラスの from_delimited_files() メソッドを使用します。 .parquet 形式のファイルを読み込むには、from_parquet_files() メソッドを使用します。 複数のファイルから読み取る場合、結果は 1 つの表形式に集計されます。

サポートされているファイル形式については、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 Survived Pclass 名前 Sex Age SibSp Parch Ticket Fare Cabin 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... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 S

ワークスペースの実験間でデータセットを再利用および共有するには、データセットを登録します。

データをラングリングする

データセットを作成して登録したら、モデルのトレーニングの前に、ノートブックにそのデータセットを読み込んで、データ ラングリングと探索を行うことができます。 データ ラングリングや探索を行う必要がない場合があります。 その場合、ML 実験の送信用にトレーニング スクリプトでデータセットを使用する方法の詳細については、データセットを使用したトレーニングに関するページを参照してください。

データセットのフィルター処理 (プレビュー)

フィルター処理機能は、使用しているデータセットの種類によって異なります。

重要

filter() プレビュー メソッドを使用したデータセットのフィルター処理は、試験段階のプレビュー機能であり、いつでも変更される可能性があります。

TabularDatasets の場合は、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))

FileDatasets では、各行がファイルのパスに対応しているため、列の値によるフィルター処理は役に立ちません。 ただし、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' によって、値 'Accounts' を持つ文字列の列 'Department' と、値 2019-01-01 を持つ datetime 列 'PartitionDate' が作成されます。

データに既存のパーティションが既に存在し、その形式を保持する場合は、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()

partition_by() メソッドを使用して、TabularDatasets の新しいパーティション構造を作成することもできます。


 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']

データの探索

データをラングリングしたら、データセットを登録し、それをノートブックに読み込んで、モデルのトレーニングの前にデータ探索を行うことができます。

FileDatasets の場合は、データセットをマウントまたはダウンロードして、データ探索に通常使用する 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()

TabularDatasets の場合は、to_pandas_dataframe() メソッドを使用して、データフレーム内のデータを表示します。

# preview the first 3 rows of titanic_ds
titanic_ds.take(3).to_pandas_dataframe()
(インデックス) PassengerId Survived Pclass 名前 Sex Age SibSp Parch Ticket Fare Cabin 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... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina female 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() を使用して、インメモリのスパークや pandas データフレームから 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)

次のステップ