Azure Machine LearningデータセットのMLTableについて学ぶ

Azure Machine Learning上では複数のデータセット形式が用意されています。

mltable形式は表形式でデータを使用することができます。学習・推論を行う際にこの形式を使用することになることがありますが、プログラム上から表形式でデータ登録・更新を行う場合には特殊な設定を行う必要があります。

本記事ではAzure Machine Learning上でCSVデータをmltable形式で登録する方法を示します。

概要

Azure Machine LearningでAutoMLを使用して学習するようなケースがあったとき、手動でデータを登録して学習を実行して……という風に作業を行っている方が多いのではないでしょうか。

AutoMLで指定できるデータセットは以下の2種類に限られます。

  • Azure ML v2 API テーブル(mltable)
  • Azure ML v1 API 表形式

表形式で登録することによって、各列の型(int, boolean, datetimeなど)を機械学習が解釈することができるようになります。

しかしこの登録を画面上から手動以外で行うためには、元となるCSVに加えて別途ファイルを用意する必要があります。

本記事を理解することで、プログラム上からCSVファイルを参照して、プログラムからmltable形式でAzure Machine Learningワークスペースにデータセットとして登録することができるようになります。

関連記事

以前の記事でデータセット種別について解説しているので、こちらもご参照ください。

MLTableファイルについてざっくり解説していますが、本記事ではMLTableファイルの詳しい記載方法まで踏み込んで解説します。

blog.jbs.co.jp

データセットを登録する方法

前提

プログラム上からmltable形式でデータセットを登録するためには、以下のような構造でファイルを用意する必要があります。

.
├── sample.csv
└── MLTable

MLTableはディレクトリではなく、拡張子なしのファイルです。

MLTableにCSVの構造情報を記述したうえで、この2つのファイルを同じディレクトリに配置することで、Pythonから表形式(mltable)でデータを登録することができるようになります。

MLTableファイルについて

YAMLと同じ書式で定義された拡張子なしのファイルを用意します。
詳細は以下のDocsを参照してください。
learn.microsoft.com

サンプルを示します。
以下はsample.csvをmltable形式で読み込むために必要なMLTableファイルの例です。

MLTable

paths:
  - file: sample.csv
transformations:
  - read_delimited:
      delimiter: ','
      encoding: 'ascii'
      empty_as_string: false

MLTableファイル解説

区切り文字

データ列がどのような文字で区切られているかを定義します。

delimiter: ','の場合は「,」で列が区切られていることを示します。

Kaggleで提供されているTitanic号のデータを例にします。

train.csvをメモ帳で開くと、以下のようなカンマで区切られている構造になっていることが分かります。このようなCSVファイルの区切り文字を都度確認して、ここに定義する必要があります。

www.kaggle.com

CSVファイルの文字コード

文字コードが正しくない場合、学習時に次のようなエラーが発生する可能性があります。

Encountered user error while fetching data from Dataset. Error: UserErrorException:
    Message: Failed to load mltable because of: 
Error Code: ScriptExecution.StreamAccess.Validation
Validation Error Code: InvalidEncoding
Validation Target: TextFile

これを防ぐため、MLTableファイルでは文字コードを指定します。

encoding: 'ascii'のようにASCIIやUTF-8などを任意に定義します。特に日本語の場合はUTF-8を指定しない場合に上記エラーが発生する可能性があります。

以下Docsにmltable形式で使用できるエンコードの一覧が記載されていますので、参考にしてください。

learn.microsoft.com

空白行への対応

empty_as_string: falseでは空のフィールド値の扱いを指定します。

既定値 (False) では空のフィールド値が null として読み取られ、True にすると空のフィールド値が空の文字列として読み取られます。

String型以外の場合、数値や日時データはこの設定によらずnullになります。

その他設定

使用する列を制限する

CSV上には列として存在するものの学習には使用したくない列がある場合は、MLTableファイルで制限をかけることができます。

以下keep_columnsもしくはdrop_columnsで列の使用可否を定義します。

MLTable

paths:
  - file: sample.csv
transformations:
  - read_delimited:
      delimiter: ','
      encoding: 'ascii'
      empty_as_string: false
  - keep_columns: [col1, col2, col3, col4, col5, col6, col7]
    # or you can drop_columns...
    # - drop_columns: [col1, col2, col3, col4, col5, col6, col7]
データ型を任意に設定する

MLTableファイルの定義を使って型を任意に決めることができます。

convert_column_typesの項目を使用します。

MLTable

paths:
  - file: sample.csv
transformations:
  - read_delimited:
      delimiter: ','
      encoding: 'ascii'
      empty_as_string: false
  - convert_column_types:
      - columns: col1
        column_type: int
      - columns: col2
        column_type:
          datetime:
              formats:
                  - "%d/%m/%Y"
      - columns: [col3, col4, col5] 
        column_type:
          boolean:
              mismatch_as: error
              true_values: ["yes", "true", "1"]
              false_values: ["no", "false", "0"]

上記の例ではcol1をint型、col2をDatetime型、col3~5をBoolean型として定義しています。

このような型決定が必要なケースが出てきた場合は、上記のようにcolumn_typeで指定してください。

AutoMLの場合、任意の型定義を使用するとエラーが発生するケースがあります。

以下のクラスを使用することで型設定を自動で行わせることができるため、必要に応じて使い分けてください。

from azure.ai.ml.automl import regression
from azure.ai.ml.entities._job.automl.tabular import TabularFeaturizationSettings

(中略)

    regression_node = regression(
        primary_metric="r2_score",
        target_column_name=target_column,
        enable_model_explainability=True,
        training_data=preprocess_node.outputs.preprocessed_train_data,
        validation_data=preprocess_node.outputs.preprocessed_validation_data,
        test_data=preprocess_node.outputs.preprocessed_test_data,
        featurization=TabularFeaturizationSettings(mode="Auto"),
        outputs={"best_model": Output(type="mlflow_model")},
    )

TabularFeaturizationSettings(mode="off")の場合は、変数型を全て自分で定義する必要があります。

SDKv2を使用して表形式データを登録する

Pythonプログラムからv2のテーブル形式でデータを登録します。

上記で紹介したタイタニック号のtrain.csvを配置して、MLTableを用意します。

paths:
  - file: train.csv
transformations:
  - read_delimited:
      delimiter: ','
      encoding: 'ascii'
      empty_as_string: false

以下のフォルダパスになるように配置します。

SDKv2を使用してデータセットの登録を実行します。

まずは対象のワークスペースを指定します。

from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

# enter details of your AML workspace
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace = "<AML_WORKSPACE_NAME>"

# get a handle to the workspace
ml_client = MLClient(
    DefaultAzureCredential(), subscription_id, resource_group, workspace
)

配置したCSVファイルとMLTableファイルをv2のmltable形式で読み込みます。

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

my_data = Data(
    path="./dataset",
    type=AssetTypes.MLTABLE,
    description="TitanicData",
    name="titanic-mltable-example",
)

指定したワークスペースにデータを登録します。

my_mltable = ml_client.data.create_or_update(my_data)

ワークスペースのデータセットで「titanic-mltable-example」の名前でデータが登録されていることが確認できます。

ml_client.data.create_or_update()を複数回実行すると、同名でバージョンが上がって中身が置き換えられます。

詳細を表示すると表の情報が一覧で表示されます。

変数の型を認識しているため、プロファイルからデータの分布などを確認することができます。

uri_fileやuri_folder形式で登録した場合は以下のような表示になります。

右側に表として表示してくれていますが、左側にファイルの詳細情報などがある通りファイルとして認識しています。この状態では変数の型などを認識していないため、表形式読み込みが必要な機能で使用することができません。

まとめ

本記事ではAzure Machine Learningの表形式データセットについて解説しました。

CSVファイルと同じディレクトリにMLTableファイルを配置することで、Python上から表形式としてデータを登録することができるようになります。

本記事が参考になれば幸いです。

執筆担当者プロフィール
西野 佑基

西野 佑基(日本ビジネスシステムズ株式会社)

機械学習系ソリューション開発、業務Webアプリ開発、開発環境自動化などを担当。

担当記事一覧