はじめに

前回記事では、Azure Machine Learnig Studio(以下MLStudio)の基本的な使用方法をご紹介しました。モジュールを検索し、ドラッグ&ドロップしてプロパティを修正する、という一連の流れは思ったよりも簡単だったのではないでしょうか。

今回は前回作成したワークスペースと、その中に実装したサンプルデータセットを使用して機械学習のモデルをトレーニング(学習)します。またそのモデルを使って予測を行い、モデルの精度を評価します。

今回作成する機械学習の内容

前回記事で使用した「Adult Census Income Binary Classification dataset」は、年齢や学歴、性別などの属性に対して収入が5万ドル上か、以下を示すデータです。収入は「income」という名称で一番右の列に存在しています。

このデータを利用して、人の属性値を与えると収入が5万ドル以下か、以上かを分類する機械学習のモデルをトレーニングします。

今回のように、答えがわかっているデータをもとに機械学習モデルを構築することを「教師あり学習」と呼び、教師あり学習によって作成する分類のためのモデルのことをClassificationと言います。今回はこのClassificationを作成します。

前回の状態の確認

まずは前回記事で作成した状態を確認しましょう。

「Adult Census Income Binary Classification dataset」というサンプルデータセットを入力にして、「Select Columns in Dataset」モジュールを使用して不要な列を除去しました。そして「Split Data」モジュールを使用してデータを75%と25%になるように分割しました。

一度ここで全体を実行しておきましょう。画面下部の「RUN」アイコンをクリックして、実行します。正常終了すると「Select Columns in Dataset」モジュールと「Split Data」モジュールに緑色のレ点が表示されます。

  • 実行して正常終了となったことを確認する

    実行して正常終了となったことを確認する

トレーニングモデルを配置する

MLStudioではトレーニングした結果を保持するモデルは種類に応じて複数存在しますが、今回は最もオーソドックスなトレーニングモデルモジュールである「Train Model」を使用します。

[1] 「Train Model」を配置する
画面左側のモジュールパレットの検索窓で「Train Model」と入力します。検索された「Train Model」をキャンバスにドラッグ&ドロップします。

  • 「Train Model」モジュールをキャンバスにドラッグ&ドロップ

    「Train Model」モジュールをキャンバスにドラッグ&ドロップ

[Note]AzureMLのトレーニングモデルモジュール
AzureMLではトレーニングモデルモジュールは「Train Model」以外にも「Train Cluster Model」、「Train Anomaly Detection Model」、「Train Matchbox Recommender Model」、「Sweep Clustering」、「Tune Model Hyperparameters」が存在しています。

「Train Cluster Model」はクラスタリング用のモデルを使用する時に使います。
「Train Anomaly Detection Model」は異常検知のモデルを使用する場合に使用します。
「Train Matchbox Recommender Model」はMatchbox Recommenderというレコメンド用モデルのトレーニングモデルモジュールです。
「Sweep Clustering」、「Tune Model Hyperparameters」はどちらもハイパーパラメータを自動的に調整してトレーニングした結果のモデルを出力してくれるとても便利なモジュールです。ハイパーパラメータとは、トレーニング実施時に人間が設定するパラメータで、値によって大きく結果が異なるものです。
「Sweep Clustering」はclustering時に使用し、「Tune Model Hyperparameters」はregressionとClassification時に使用します。(clusteringとregression,classificationの違いは次の註釈をご覧ください)
全てのモデルモジュールで共通しているのは、アルゴリズムとトレーニング用のデータを入力にトレーニング済みのモデルを出力することです。決してこれらのモジュールがトレーニング済みモデルとなる訳ではなく、トレーニング済みのモデルを出力する点に注意しましょう。

[2] 線で繋ぐ

配置した「Train Model」に対して、トレーニング用データを接続します。「Train Model」は上辺に二つのインプットを受け付ける〇があります。左の〇はアルゴリズムを繋ぎます。右の〇はトレーニング用のデータを繋ぎます。「Split Data」モジュールの下辺①(左側)はインプットデータのうち75%を出力するように設定しましたので、この①と「Train Model」の上辺右側を線で繋ぎます。

  • 線でつなぐ

    線でつなぐ

[3] 実測値(予測した結果に対する答え)を指定する

「Train Model」にトレーニング用データを接続したのは良いのですが、このままでは「Train Model」にとっては困った状態です。データの列のうち、どの列が実測値(予測した結果に対する答え)なのかがわからないからです。機械学習では「教師あり学習」と「教師なし学習」の二通りがありますが、今回のようにClassificationを行う場合は「教師あり学習」となります。「教師あり学習」では実測値(予測した結果に対する答え)を持つデータを入力にしてモデルをトレーニングを行います。そのため、「Train Model」では実測値(予測した結果に対する答え)を持つ列がどれなのかを指定する必要があります。

[Note]「教師あり学習」と「教師なし学習」
機械学習のモデルを大きく分類すると「教師あり学習」と「教師なし学習」のいずれかとなります。この教師という言葉は実測値(予測した結果に対する答え)を意味します。「教師あり学習」は大まかにregression(回帰)とclassfication(分類)、「教師なし学習」はclustering(クラスタリング)に分類されます。回帰とはデータを与えて数値の予測を行う時に使用されるモデルで、分類はデータを予め定義したクラスに分けたい時に使用されるモデルです。クラスタリングはデータを基準なしに任意の塊(クラスタ)に自動で分類したいときに使用します。

今回のデータでは実測値(予測した結果に対する答え)を持つ列はincome列です。配置した「Train Model」モジュールを選択し、右側のプロパティの「Launch column selector」をクリックします。すると「Select Columns」というダイアログが立ち上がるのでincome列を「SELECTED COLUMNS」側に移動させてから右下のレ点をクリックします。「Select Columns」の詳しい使用方法は前回の記事を参照してください。

  • income列を選択する

    income列を選択する

アルゴリズムを選択する

AzureMLには様々なアルゴリズムが事前に用意されています。アルゴリズムは求める結果に応じて決定します。今回の求める結果は収入が5万ドル以下か、以上かです。このようなA or Bのどちらかが求める答えとなる場合、二項分類と呼ばれるアルゴリズムを使用します。

AzureMLでは複数の二項分類用のアルゴリズムが用意されていますが、今回は「Two-Class Boosted Decision Tree」を使用します。「Two-Class Boosted Decision Tree」はAzureMLで用意されている二項分類のアルゴリズムの一つで、決定木と呼ばれる種類のアルゴリズムです。

註:求める答えがA or Bのように二つのどちらかの場合は二項分類と呼ばれるアルゴリズムを使用しますが、求める答えが三つ以上の場合は多項分類と呼ばれ、適用できるアルゴリズムが変わります(当然ですが、多項分類のアルゴリズムは二項分類にも使用可能です)。

[1] 「Two-Class Boosted Decision Tree」を配置する

画面左側のモジュールパレットの検索窓で「two-class」と入力します。検索された「Two-Class Boosted Decision Tree」をキャンバスにドラッグ&ドロップします。

  • 「Two-Class Boosted Decision Tree」モジュールをキャンバスにドラッグ&ドロップ

    「Two-Class Boosted Decision Tree」モジュールをキャンバスにドラッグ&ドロップ

[2] 線で繋ぐ

配置した「Two-Class Boosted Decision Tree」と「Train Model」を線で繋ぎます。「Train Model」の上辺左側の〇がアルゴリズムの入力を受け付けます。

  • 線で繋ぐ

    線で繋ぐ

トレーニング済みモデルを使用して予測を行う

「Train Model」はトレーニング済みモデルを出力します。出力されたトレーニング済みモデルを使用して実際に予測をします。AzureMLでトレーニング済みモデルを使用して予測を行うモジュールはいくつか種類がありますが、今回は「Score Model」というモジュールを使用します。

註:モジュールとは、一般的に部品のことを指します。ここでいうモジュールはAzureMLのExperimentを構成する部品を指します。

[1] 「Score Model」を配置する

画面左側のモジュールパレットの検索窓で「Score Model」と入力します。検索された「Score Model」をキャンバスにドラッグ&ドロップします。

註:トレーニング済みモデルを使用して予測を行うモジュールは「Score Model」の他に「Score Matchbox Recommender」と「Assign Data to Clusters」があります。
  • 「Score Model」モジュールをキャンバスにドラッグ&ドロップ

    「Score Model」モジュールをキャンバスにドラッグ&ドロップ

[2] 線で繋ぐ

「Score Model」モジュールは、トレーニング済みモデルと予測用のデータを入力として受け付けます。「Score Model」モジュールの上辺左側の〇はトレーニング済みモデルを入力を、上辺右側の〇は予測用のデータを受け付けます。

そのため、上辺左側の〇は「Train Model」の出力と繋ぎ、上辺右側の〇は「Split Data」モジュールの下辺右側の②と繋ぎます。

  • 線で繋ぐ

    線で繋ぐ

[3] 実行して予測結果を確認する

これで準備は整いました。画面下部の「RUN」アイコンをクリックして実行し、正常終了したら「Score Model」の下辺〇を右クリックし、「Visualize」をクリックします。

  • 「Visualize」をクリック

    「Visualize」をクリック

Visualizeで表示された結果の一番右を参照します。income列は予測用のデータに元々入っていた値です。Scored Label列は予測した結果です。Scored Probabilities列は、二項分類の場合は予測結果が2つのクラスの1つに分類される確率を表します。0.5を境としてどちらに分類されるかが決定されます。今回でいうと5万ドル以上のクラスと5万ドル以下のクラスの二つのクラスがある訳ですから、5万ドル以下に分類される確率が高ければたかいほどScored Probabilitiesはゼロに近づき、5万ドル以上に分類される確率が高ければ高いほどScored Probabilitiesは1に近づきます。

  • 予測した結果を確認する

    予測した結果を確認する

註:予測結果が空欄となっているものが見受けられますが、これは一体どうしたことなのでしょうか。これは入力値に欠損値あることが原因で予測ができなかった可能性が考えられます(native-country列が空白)。予測できない原因は欠損値以外にも学習データ量が不足していたことが考えられますが、欠損値に対する対処はとても重要です。機械学習ではこのようなデータの不整合を予め綺麗にしておくクレンジングと呼ばれる処理がとても重要です。AzureMLでは欠損値を補うために「Apply Transformation」モジュールがあります。
  • 予測した結果がない

    予測した結果がない

モデルを評価する

予測した結果はどれぐらい正しかったのでしょうか。機械学習ではモデルを評価するための様々な指標があります。AzureMLでは指標の計算を行う専用のモジュールとして「Evaluate Model」モジュールがあります。これを使用して精度を確認してみましょう。

註:モデル評価用のモジュールは「Evaluate Model」の他に「Evaluate Recommender」と「Cross Validate Model」があります。通常は「Evaluate Model」を使用しますが、レコメンデーションを行うモデルであるMatchbox Recommenderの結果に対する評価を行う場合は「Evaluate Recommender」を使用します。また、「Cross Validate Model」はモデルの精度を検証するだけではなく、データセットがどれぐらい典型的であるか、そしてモデルがデータの変動にどのくらい敏感であるかについて、いくつかの結果を示します。

[1] 「Evaluate Model」を配置する

画面左側のモジュールパレットの検索窓で「evaluate」と入力します。検索された「Evaluate Model」をキャンバスにドラッグ&ドロップします。

  • 「Evaluate Model」モジュールをキャンバスにドラッグ&ドロップ

    「Evaluate Model」モジュールをキャンバスにドラッグ&ドロップ

[2] 線で繋ぐ
「Score Model」の下辺出力〇と、「Evaluate Model」の上辺左側の〇を線で繋ぎます。

  • 線で繋ぐ

    線で繋ぐ

[3] 選択したモジュールだけを実行する

それでは実行しましょう。今までは画面下部の「RUN」ボタンをクリックして実行していました。この方法による実行はキャンバスに配置したモジュールを先頭から最後まですべて実行し直すことを意味します。しかし今の状態は既に「Score Model」まで実行済みであり、「Evaluate Model」だけ実行してくれれば良いはずです。このように部分的に実行したい場合、実行したいモジュールを右クリックして「RUN SELECTED」をクリックすることで部分的に実行したいモジュールとそのモジュールの実行に最低限必要な他モジュールを実行することができます。

MSStudioの実行時間は課金に影響がありますので、うまく利用しましょう。

  • 「Evaluate Model」だけを実行する

    「Evaluate Model」だけを実行する

[4] 精度を確認する

それでは「Evaluate Model」の出力結果を見てみましょう。「Evaluate Model」の出力〇を右クリックして「Visualize」をクリックします。

  • 「Visualize」をクリック

    「Visualize」をクリック

するとReceiver Operator Characteristic (ROC) 曲線と混合行列、混同行列、F1値や、累積の AUC (曲線下面積) 値などのグラフと指標値が表示されます。

モデルの評価を正しく理解するためにはその数値の意味を理解する必要があります。ここで詳しい説明は割愛しますが、F1値は一つの目安です。F1値が1に近ければ近いほど良い精度です。

  • 「Evaluate Model」の出力結果

    「Evaluate Model」の出力結果

註:Microsoft AzureのHPにはモデル評価の解説ページが用意されていますので、詳しくはこちらをご覧ください。 また曲線はROCだけでなく、Precision/Recall、または Liftをクリックすることで表示することができます。

最後に

モデルのトレーニングを実際に行い、予測を行ってみました。また、作成したモデルの精度を確認する方法をご紹介しました。モジュールをドラッグ&ドロップ、そしてモジュール間を線でつないだだけでほぼ完成してしまいました。とても素早く機械学習をすることができることがおわかりいただけたかと思います。

次回は今回作成した機械学習のモデルをWebサービスとして外部に公開します。

WINGSプロジェクト 上坂 貴志(株式会社ネクストスケープ)著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。一緒に執筆をできる有志を募集中