Azure Machine Learning Python クライアント ライブラリを使って Python のデータ セットにアクセスする

Microsoft Azure Machine Learning Python クライアント ライブラリのプレビューは、ローカルの Python 環境から Azure Machine Learning データセットへの安全なアクセスを確立し、ワークスペースにおけるデータセットを作成して管理できるようにします。

このトピックでは次の方法について説明します。

  • Machine Learning Python クライアント ライブラリをインストールする
  • ローカルの Python 環境から Azure Machine Learning データセットへのアクセス認証を取得するなど、データ セットにアクセスしてアップロードする
  • 実験から中間データセットにアクセスする
  • Python クライアント ライブラリを使用してデータ セットを列挙、メタデータにアクセス、データ セットのコンテンツを読み込み、新しいデータ セットを作成して既存のデータ セットを更新する

前提条件

Python クライアント ライブラリは、次の環境でテストされています。

  • Windows、Mac、Linux
  • Python 2.7 および 3.6 以上

次のパッケージに依存します。

  • requests
  • python-dateutil
  • pandas

AnacondaCanopy などの Python ディストリビューションを使用し、Python、IPython、また上述の 3 つのパッケージをインストールすることを推奨します。 IPython は厳密には必要ありませんが、データをインタラクティブに操作して視覚化する優れた環境になります。

Azure Machine Learning Python クライアント ライブラリをインストールする方法

このトピックで説明されているタスクを完了するには、Azure Machine Learning Python クライアント ライブラリをインストールします。 このライブラリは、Python Package Index から入手できます。 ご利用の Python 環境にインストールするには、ローカルの Python 環境から次のコマンドを実行します。

pip install azureml

代わりに、GitHub からソースをダウンロードしてインストールすることもできます。

python setup.py install

コンピューターに git をインストールしていれば、git リポジトリから直接 pip を使ってインストールできます。

pip install git+https://github.com/Azure/Azure-MachineLearning-ClientLibrary-Python.git

を使ってデータ セットにアクセスする

Python クライアント ライブラリを使うと、実行している実験から既存のデータ セットへプログラムでアクセスできるようになります。

Azure Machine Learning Studio (クラシック) Web インターフェイスから、ローカル コンピューターでデータ セットを pandas DataFrame オブジェクトとしてダウンロードして逆シリアル化するために必要なすべての情報を含むコード スニペットを生成できます。

データ アクセスのためのセキュリティ

Python クライアント ライブラリで使用するために Azure Machine Learning Studio (クラシック) で提供されるコード スニペットには、ユーザーのワークスペース ID や認証トークンが含まれます。 これらを使用すればワークスペースにフル アクセスできますので、パスワードなどで保護する必要があります。

セキュリティ上の理由から、ワークスペースの [所有者] として設定された役割を持つユーザーのみコード スニペットの機能を使うことができます。 役割は Azure Machine Learning Studio (クラシック) で [設定] の下の [ユーザー] ページに表示されます。

Azure Machine Learning Studio の [ユーザー] ページの設定のスクリーンショット。

役割が [所有者] に設定されていない場合は、所有者として再度招待をリクエストするか、ワークスペースの所有者にコード スニペットを提供するよう依頼する必要があります。

認証トークンを取得するには、次のいずれかの方法を選択します。

  • 所有者からトークンをリクエストします。 所有者は Azure Machine Learning Studio (クラシック) のワークスペースの [設定] ページから自分の認証トークンを確認できます。 左側のウィンドウから [設定] を選択し、 [認証トークン] をクリックしてプライマリとセカンダリのトークンを確認します。 プライマリとセカンダリの認証トークンのどちらもコード スニペットで使用できますが、所有者はセカンダリの認証トークンのみ共有することをお勧めします。

    認証トークン

  • 所有者のロールに昇格するように依頼します。ワークスペースの現在の所有者がまずワークスペースからあなたを削除してから、所有者として再び招待する必要があります。

開発者がワークスペース ID と認証トークンを取得したら、ロールに関係なく、コード スニペットを使用してワークスペースにアクセスできるようになります。

認証トークンは、[設定] ページの [認証トークン] で管理されます。 認証トークンを再度生成することは可能ですが、以前のトークンへのアクセスは無効になります。

ローカル Python アプリケーションからデータ セットにアクセスする

  1. Machine Learning Studio (クラシック) で、左側のナビゲーション バーの [データセット] をクリックします。

  2. アクセスするデータ セットを選択します。 [マイ データ セット] リストか [サンプル] リストからどのデータ セットでも選択できます。

  3. 下のツールバーから、 [データ アクセス コードの生成] をクリックします。 データが Python クライアント ライブラリと互換性のない形式の場合、このボタンは無効になります。

    データセットのスクリーンショット。データ アクセス コードを生成します。

  4. 表示されるウィンドウからコード スニペットを選択し、クリップボードにコピーします。

    [データ アクセス コードの生成] ボタン

  5. ローカル Python アプリケーションのノートブックにコードを貼り付けます。

    ノートブックにコードを貼り付ける

Machine Learning 実験から中間データセットにアクセスする

Machine Learning Studio (クラシック) で実験が実行されると、モジュールの出力ノードから中間データセットにアクセスできます。 中間データセットは、モデル ツールが実行されているときに中間手順で作成され使用されるデータです。

中間データセットは、データの形式が Python クライアント ライブラリと互換性がある限りアクセスできます。

次の形式がサポートされます (これらの形式の定数は azureml.DataTypeIds クラスです)。

  • PlainText
  • GenericCSV
  • GenericTSV
  • GenericCSVNoHeader
  • GenericTSVNoHeader

モジュールの出力ノードの上にカーソルを置くと、形式を確認できます。 ヒントにノード名とともに表示されます。

[分割] モジュールなど一部のモジュールでは、Python クライアント ライブラリでサポートされない Dataset 名の形式で出力されます。

データセット形式

[CSV に変換] などの変換モジュールを使用して、サポートされる形式で出力を取得する必要があります。

GenericCSV 形式

次の手順は、実験を作成、実行して中間データ セットにアクセスする例を示します。

  1. 新しい実験を作成する

  2. [米国国勢調査局提供の、成人収入に関する二項分類データセット] モジュールを挿入します。

  3. [分割] モジュールを挿入して、その入力値をデータセット モジュール出力に接続します。

  4. [CSV に変換] モジュールを挿入して、その入力値を [分割] モジュール出力の 1 つに接続します。

  5. 実験を保存し、実行して、ジョブが完了するまで待ちます。

  6. [CSV に変換] モジュールで出力ノードをクリックします。

  7. コンテキスト メニューが表示されたら、 [データ アクセス コードの生成] を選択します。

    コンテキスト メニュー

  8. 表示されたウィンドウからコード スニペットを選択し、クリップボードにコピーします。

    コンテキスト メニューからアクセス コードを生成する

  9. ノートブックにコードを貼り付けます。

    ノートブックにコードを貼り付ける

  10. Matplotlib を使用してデータを視覚化できます。 これは、age 列のヒストグラムで表示されます。

    ヒストグラム

Machine Learning Python クライアント ライブラリを使用してデータ セットのアクセス、読み込み、作成、管理をする

ワークスペース

ワークスペースは、Python クライアント ライブラリのエントリ ポイントです。 Workspace クラスに自分のワークスペース ID と認証トークンを指定し、インスタンスを作成します。

ws = Workspace(workspace_id='4c29e1adeba2e5a7cbeb0e4f4adfb4df',
               authorization_token='f4f3ade2c6aefdb1afb043cd8bcf3daf')

データセットを列挙する

特定のワークスペースですべてのデータセットを列挙するには:

for ds in ws.datasets:
    print(ds.name)

ユーザーが作成したデータセットのみを列挙するには:

for ds in ws.user_datasets:
    print(ds.name)

サンプルのデータセットのみを列挙するには:

for ds in ws.example_datasets:
    print(ds.name)

名前でデータセットにアクセスするには (大文字小文字は区別されます):

ds = ws.datasets['my dataset name']

または、インデックスでアクセスするには:

ds = ws.datasets[0]

メタデータ

データセットには、コンテンツに加え、メタデータがあります (中間データセットはこのルールの例外であり、メタデータはありません)。

作成時にユーザーが割り当てるメタデータの値の一部には次のものがあります。

  • print(ds.name)
  • print(ds.description)
  • print(ds.family_id)
  • print(ds.data_type_id)

Azure ML によって割り当てられるその他の値には次のものがあります。

  • print(ds.id)
  • print(ds.created_date)
  • print(ds.size)

使用できるメタデータの詳細については、 SourceDataset クラスをご覧ください。

コンテンツを読み込む

Machine Learning Studio (クラシック) で提供されるコード スニペットにより、データセットが自動的にダウンロードされ、pandas DataFrame オブジェクトに逆シリアル化されます。 これは次の to_dataframe メソッドで実行されます。

frame = ds.to_dataframe()

生データをダウンロードして自分で逆シリアル化を実行する場合は、上記のようにします。 現時点では、Python クライアント ライブラリで逆シリアル化できない「ARFF」などの形式に対する唯一の方法になります。

テキストとして内容を読み込むには:

text_data = ds.read_as_text()

バイナリとして内容を読み込むには:

binary_data = ds.read_as_binary()

内容にストリームを開くこともできます。

with ds.open() as file:
    binary_data_chunk = file.read(1000)

新しいデータセットを作成する

Python クライアント ライブラリでは、Python プログラムからデータセットをアップロードできます。 これらのデータセットは、その後、ご利用のワークスペースで使用できます。

pandas DataFrame にデータがある場合は、次のコードを使用します。

from azureml import DataTypeIds

dataset = ws.datasets.add_from_dataframe(
    dataframe=frame,
    data_type_id=DataTypeIds.GenericCSV,
    name='my new dataset',
    description='my description'
)

ご利用のデータが既にシリアル化されている場合、次を使用できます。

from azureml import DataTypeIds

dataset = ws.datasets.add_from_raw_data(
    raw_data=raw_data,
    data_type_id=DataTypeIds.GenericCSV,
    name='my new dataset',
    description='my description'
)

Python クライアント ライブラリは、pandas DataFrame を次の形式にシリアル化できます (azureml.DataTypeIds クラスの定数)。

  • PlainText
  • GenericCSV
  • GenericTSV
  • GenericCSVNoHeader
  • GenericTSVNoHeader

既存のデータセットを更新する

既存のデータセットに一致する名前で新しいデータセットを更新しようとすると、競合エラーが発生します。

既存のデータセットを更新するには、まず既存のデータセットへの参照を取得する必要があります。

dataset = ws.datasets['existing dataset']

print(dataset.data_type_id) # 'GenericCSV'
print(dataset.name)         # 'existing dataset'
print(dataset.description)  # 'data up to jan 2015'

その後、 update_from_dataframe を使用してをシリアル化し、Azure のデータセットの内容を置き換えます。

dataset = ws.datasets['existing dataset']

dataset.update_from_dataframe(frame2)

print(dataset.data_type_id) # 'GenericCSV'
print(dataset.name)         # 'existing dataset'
print(dataset.description)  # 'data up to jan 2015'

データを別の形式にシリアル化する場合は、省略可能な data_type_id パラメーターの値を指定します。

from azureml import DataTypeIds

dataset = ws.datasets['existing dataset']

dataset.update_from_dataframe(
    dataframe=frame2,
    data_type_id=DataTypeIds.GenericTSV,
)

print(dataset.data_type_id) # 'GenericTSV'
print(dataset.name)         # 'existing dataset'
print(dataset.description)  # 'data up to jan 2015'

description パラメーターの値を指定して、新しい説明をオプションで設定できます。

dataset = ws.datasets['existing dataset']

dataset.update_from_dataframe(
    dataframe=frame2,
    description='data up to feb 2015',
)

print(dataset.data_type_id) # 'GenericCSV'
print(dataset.name)         # 'existing dataset'
print(dataset.description)  # 'data up to feb 2015'

name パラメーターの値を指定して、新しい名前をオプションで設定できます。 その後は、新しい名前のみでデータセットを取得することになります。 次のコードを使用すると、データ、名前、説明を更新できます。

dataset = ws.datasets['existing dataset']

dataset.update_from_dataframe(
    dataframe=frame2,
    name='existing dataset v2',
    description='data up to feb 2015',
)

print(dataset.data_type_id)                    # 'GenericCSV'
print(dataset.name)                            # 'existing dataset v2'
print(dataset.description)                     # 'data up to feb 2015'

print(ws.datasets['existing dataset v2'].name) # 'existing dataset v2'
print(ws.datasets['existing dataset'].name)    # IndexError

data_type_idnamedescription のパラメーターはすべて省略可能で、前の値に対する既定値になります。 dataframe パラメーターは常に必要です。

ご利用のデータが既にシリアル化されている場合、update_from_dataframe の代わりに update_from_raw_data を使用します。 dataframe の代わりに raw_data を渡すだけで、同様に動作します。