Azure Machine Learning Studio を使ってモデルをスクラッチから構築してみよう


Azure Machine Learning Studio は、機械学習をこれからビジネスの現場に導入しようとする方々にとって使いやすくかつ強力な開発プラットフォームとなるだけでなく、既に機械学習システムの開発経験がある方にとっても、対話型ワークスペースによる操作で開発生産性を高めることができる優れたクラウドサービスです。

Azure Machine Learning Studio で機械学習を初めて体験された方々の中には、チュートリアルをとおして使ってみたものの、それぞれのモジュールのプロパティで何を指定しているのかもう少し深く理解して使いたい、という感想をお持ちのみなさんも多いことと思います。

 

ここでは簡単な機械学習データをもちいて、ニューラルネットワークを理解するための基礎とも言える2クラス分類モデルをスクラッチから構築し、Azure Machine Learning の操作を深く見てみましょう。また最後に、モデルを学習させた結果について、なぜ学習がうまくいったのかについても考えてみます。

 

学習データの準備

 

まずデータです。ここでは、カリフォルニア大学アーバイン校(UCI)で公開されているWine Data Setを用います。このデータは分類モデルのベンチマークのように用いられており、チュートリアルなどで取り上げられています。

https://archive.ics.uci.edu/ml/datasets/Wine


この Data Folder から Wine.Data をダウンロードします。データはフィールド名のないカンマ区切りで、最初の列にワインの種類(1, 2, 3)、続いてアルコール濃度、リンゴ酸、・・・と全部で 14 列のが 1 組となり、178 組のデータで構成されます。

178 組のデータには 3 種類のワインが混じっていますが、今回は基本的な 2 クラス分類アルゴリズムのひとつロジスティック回帰に慣れる意味で、2 種類のワインデータ 130 組に絞って使うことにします。またこのデータセットによる 2 クラス分類モデルでは、はじめの 2 つの組成(アルコール濃度、リンゴ酸量)で十分良い分類モデルの学習が可能であることが知られているので、フィーチャー(説明変数)としてこの 2 つを選択することにします。

 

ロジスティック回帰モデルでは、学習データが与えられたとき、モデルの計算結果が閾値より大きければ 1 を、そうでなければ 0 を返すように モデルのパラメーター(係数とか重みなどと表現する場合があります)を学習させます。

 

0_sigmoid

 

今回のワインデータセットに当てはめると、アルコール濃度とリンゴ酸量が与えられたとき、モデルが 0.5 より大きい計算結果を返せば 1(ワインの一方 )を、そうでなければ 0(ワインのもう一方)を返すよう学習させることに対応します。

 

ワークフローの構築

 

さて Azure Mahine Learing Studio ワークフローを構築してみましょう。

まず Machine Learning Studio の左下 +NEW マークから DATASET タブを選択し、ダウンロードしたデータを指定してアップロードします。このときデータセットのタイプとして「Generic CSV File With no header」を選択します。

 

1_folder

2_data


同じように +NEW から
EXPERIMENT タブを選択し、Blank Experiment をクリックします。

 

3_experiment


ブランクのキャンバスがあらわれるので、そこへ左側のパレットから
Saved Datasets > My Datasets タブを選択し、先ほどアップロードした wine.data をキャンバスへ配置(ドラッグ & ドロップ)します。


Data Input and Output > Import Data から直接 Web 上のデータセットをワークフローにインポートすることもできます。


また
Data Transformation > Manipulation タブから Apply SQL Transformation モジュールを配置し、wine.data の下と Apply SQL Transformation 上部をコネクタで結びます。

 

パレットのタブを展開しながら目的とするモジュールを探す方法の他に、モジュール名が分かっている場合は、パレット上部のサーチボックスにモジュール名を指定することで、目的とするモジュールを簡単に見つけることができます

 

4_sqlite


Apply SQL Transformation
モジュールを用いることで、SQLite クエリーステートメントを記述して、データセットから必要なデータだけを抽出することができます。

 

SQLite クエリーステートメントでは、データセットをテーブル名「 T1 」 で、その列名を「 COL1 」,「 COL2 」, …  などで参照することができます。

 

ここでは上述したように、2 種類のワイン種別を持つデータ( 1 列目が 1 または 2 のデータ)と、フィーチャーとしてアルコール濃度(2列目)とリンゴ酸量(3列目)を選択することにします。

 

select [COL1], [COL2], [COL3] from [T1] where [COL1] in (1,2);


続いてデータを
2 つにスプリットさせるために、Data Transformation > Sample and Split タブを展開して Split Data を配置します。このモジュールによってひとつのデータグループをモデルの学習に用い、残りをモデルの検証に用います。

 

5_split


ここでは
60%0.6)を学習用に指定しました。またスプリットするデータの選択に用いる Random seed を適当に 10 と設定しています。既定では 0 になっており、その場合は Split Data モジュールが実行時刻を基にした seed を生成するため、常に同じスプリット結果を得たい場合は 0 でない値を指定します。

 

次に Machine Learning > Train タブから Train Model を配置します。ここではデータセットの中でモデルが予測する列を指定します。

Launch column selector をクリックします。

 

6_train


ワイン種類は
1 列目にあるので COL1 と指定しています。

 

 6_column


さて
Train Model で学習させるモデルの選択では、Machine Learning > Initialize Model > Classification タブから Two-Class Logistic Regression を配置し、Train Model と結びます。

 

7_lr


ここで
Two-Class Logistic Regression モジュールのプロパティを見てみましょう。

 

  • Optimization tolerance
    • 最適なパラメーターを計算する操作を繰り返しおこなう際、パラメーター値の変動がこの数値よりも小さくなった時点で計算を打ち切る閾値を指定します。特に変更する必要はありません。
  • L1/L2 regularization weight
    • 過学習を是正するために目的関数に付加する「正規化項」の係数です。正規化項は言ってみれば学習に対する抵抗のような働きをします。一般的に L1 L2 かいずれかの正規化項を採用しますが、Azure Mahine Learning Two-Class Logistic Regression モジュールでは両方を用いる手法を取っています。
    • モデルが過学習(学習データでは良好な結果が出ているのに、それ以外のデータでは良好ではない結果になる現象)になった場合は大きい値を指定します。
    • 正規化項として L2 を用いる例をよく見かけるので、ここでは L2 だけを採用し、またフィーチャー数が 2 つしかないので過学習となり難いと考えて小さい値を指定しました。
  • Memory size for L-BFGS
    • 最適なパラメーターを計算するアルゴリズムに L-BFGS を用いており、このメモリサイズを指定します。
    • メモリサイズが小さいと学習にかかる時間が短縮されますが、学習の正確性が低下するといわれています。特に変更する必要はありません。
  • Random number seed
    • 計算を開始するための初期値を得るために用いられます。与えられた学習データに対して常に同じ結果を得るためにはゼロでない値を指定しますが、初期値の選択は Azure Machine Learning にまかせブランクにしています。


これらのプロパティは、最上部にある「
create trainer mode」で「Parameter Range」を選択することにより、与えられたレンジ値の中から最適なものを見つけ出すよう指定することもできます。


最後に
Score Model Evaluate Model を、それぞれ Machine Learning > Score および Machine Learning > Evaluate から配置します。

Score Model に対し Split Data モジュールからもう一方のコネクタを結合することで、さっき指定した 0.6 の残りのデータがモデルの検証に用いられ、それぞれの正誤が判定されます。
また Evaluate Model は学習済モデルの精度を判定する指標を得るために利用します。Score Model と Evaluate Model をコネクタで結びます。
これらのモジュールには注目すべき設定項目はありません。

 

8_score

 

9_eval

 

 

モデルの評価

 

ワークフローが完成したので RUN ボタンをクリックします。計算が終了したら Evaluation モジュールを右クリックし、Evaluation Results > Visualize を選択します。

 

分類モデルの評価に用いられる ROC 曲線は左上に張り付いているほうが良好で、AUC 1 に近いほど良好と判断する指標とされています。ただし、これらの指標は閾値(下図の状態は既定のまま 0.5 となっています)によって変化する指標ではないので、閾値にかかわらずモデルが安定しているかを示していると考えた方がいいかもしれません。

いっぽう F1 Score 1 に近いほどモデルが良好と判断できる指標ですが、こちらは閾値によって変化する指標です。下図の Threshold バーを変化させることで F1 Score も変化する様子を見ることができます。したかって F1 Score は決められた閾値のもとでモデルの良否を判断する指標となります。(言うまでもなく閾値は何を分類するかによって決める必要があります)

 

10_roc

10_results


さて、今回用いたデータセットはこのように非常に良好な学習結果を得ることができたのですが、「自分たちのデータで試してみると、こんなに良好な学習結果が得られない」という感想をお持ちの方も多いのではないでしょうか
?

それではなぜ今回用いたデータセットがこんなに良好な学習が可能だったのか考えてみます。


11_decision_boundary


上のグラフは今回用いたワインデータセットを散布図にしたグラフです。赤線でディシジョン境界を描いてみました。ここから分かるように、ディシジョン境界に直線を引こうと思えば、それほど無理なく描くことができます。

線形回帰モデルは言うまでもなく、いくつかの分類モデルでは直線や平面のような線形の性質を持つモデルを構築することを前提にしているので、今回のデータセットのように、ディシジョン境界に直線が引けるようなデータからは、良好なモデルを得ることができます。

逆にディシジョン境界が直線ではなく曲線になるようなデータセットの場合は、そのままでは良好なモデルを構築することが不可能なので、曲線にフィットするようにフィーチャーを変形する必要があります。例えばディシジョン境界が放物線のような曲線になるようだったら、元のデータを 2 乗した値を新なフィーチャーとして加え、モデルを学習させるなどの工夫が必要になります。

 

N


関連記事

Azure Machine Learning Jupyter Nootebooks 対応 ( 前編 )

Azure Machine Learning Jupyter Nootebooks 対応 ( 後編 )

Azure Machine Learning Jupyter Notebook 対応 ( Variable Selection 編 )

Azure Machine Learning のサンプルを使って機械学習を始めてみよう!

Comments (0)

Skip to main content