はじめに

Azure Machine Learning(以降AzureML)は数あるクラウド上の機械学習PaaSの中でも柔軟性の高い機械学習の開発環境です。

ところでここ数年でとてもよく耳にするようになった機械学習とはなんでしょうか。正確に定義するは難しいのでここで詳細に説明することは避けたいと思いますが、誤解を恐れずに大まかに説明すると「大量のデータを元に機械にパターンを学習させ、未知のデータを与えたときの結果を予測できるようにする技術」です。

機械学習では機械に学習させた結果をトレーニング済み(学習済み)モデルと呼びます。トレーニング済みモデルを作成するためにはデータを与えて学習させるための実装が必要です。そして作成したトレーニング済みモデルを使って予測結果を受け取るためにはパラメータを渡して結果を受けとれるようにするための実装が別途必要です。

AzureMLはAzure Machine Learnig Studio(以降MLStudio)というブラウザで稼働する環境を用意しています。MLStudioでは入力からモデルのトレーニングまでの一連の処理、またはWebサービスによる入力データの受付から予測を行い、その結果を出力する一連の流れをExperimentと呼び、1つの単位として管理します。そしてExperimentに対して画面上からWebサービスを作成することができます。

また、トレーニング済みのモデルの保存、入力データや予測をした結果の出力をデータセットとして保存しておくことができます。

MLStudioはSQL DatabaseやAzure Blob Storage、DocumentDBなどのAzureのデータストレージリソースに対して入出力を可能とするモジュール(Import Data Module)が用意されており、それ以外のリソースについてはHive QueryまたはHttpでアクセスできるものであればデータの入力にすることができます。

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

MLStudioでは用意されたモジュールのプロパティに対して調整やコードを記載する方法が基本的な実装方法ですが、RとPythonスクリプトを実行するモジュールも用意されています。また、Jupyter NotebookによるPython実装も可能です。

註:Hive QueryとはApache Software Foundationが提供するApache Hiveと呼ばれるHadoop上で稼働するミドルウェアが提供する機能です。Hadoopの一部であるファイルシステムHDFSに対してSQLライクな書式でクエリを投げることができます。

Azure Machine Learning概念図

本連載では4回に渡ってMLStudioを使用した基本的な機械学習実装から、Webサービスによる公開までをご紹介します。

第1回ではMLStudioの基本的な使用方法をご紹介します。実際にデータを加工・分割してモデルの作成(トレーニング)の前処理を行います。

第2回では第1回でおこなった前処理の結果を用いて予測を行うモデルの作成(トレーニング)を行います。

第3回では第2回で作成したトレーニング済みモデルに対して、MLStudioの外側からパラメータを渡してトレーニング済みモデルを利用できるようWebサービスを作成し、画面とExcelから呼び出します。

第4回ではAzureの新しいAPI仕様であるARM(Azure Resource Manager)に準拠した現在Previewの新しいWebサービスでWebサービスを作成し、プログラムからWebサービスを呼び出します。

Machine Learning Studio Workspaceを作成する

一番最初に用意するのはワークスペースです。ワークスペースとは配置するリージョンと課金単位を決定するものです。またワークスペースは複数の実験結果を管理する単位でもあります。MLStudioはこのワークスペースに対してアクセスします。

[1] ワークスペースを作成する

Azure にログインし、左側のメニューの[+]をクリックし、検索ボックスに「machine learning」と入力します。表示される候補の中から「Machine Learning Studio Workspace」をクリックします。

ワークスペースを作成する

Machine Learning Studio Workspaceの概要説明とともに、作成を促すボタンが下部に表示されます。「作成」ボタンをクリックします。

「作成」ボタンをクリック

[2] ワークスペース情報を入力する

ここでは次のように入力しました。

ワークスペース情報の入力例

ワークスペース名mynavi
サブスクリプション任意
リソースグループ新規/mynavi
場所東南アジア
ワークスペース価格レベルStandard
Webサービスプラン新規作成/mynaviPlan
Webサービスプラン価格レベルDevTest

ワークスペース名は任意の値を入力してください。サブスクリプションは現在ログインユーザーしているユーザーがワークスペース作成権限のあるサブスクリプションの中から選択します。

リソースグループは新規で作成しても既存のリソースグループを選択してもどちらでも構いませんが、今回専用のリソースグループを作成しておいた方が環境削除時に楽ができますのでお勧めです。

場所はリージョンのことです。全てのリージョンで使用できませんので注意してください。2017/10現在、Machine Learning Studio Workspaceを作成できるリージョンは下記になります。

  • 米国東部2
  • 米国中南部
  • 米国中西部
  • 西ヨーロッパ
  • ドイツ中部
  • 東南アジア
  • 東日本

最新情報はリージョン別の利用可能な製品を参照してください。

ワークスペース情報の入力例

ワークスペース価格レベルはFree とStandardがあります。FreeはMSアカウント1つにつき、1つだけ使用可能です。Webサービスプランは新規作成または既存のWebサービスプランを選択します。初めての場合は新規作成を選択してください。

Webサービスプラン価格レベルはDevTest Standard、S1、S2、S3から選択します。DevTest Standardは今回のようなテスト用のプランですが、1リージョン1サブスクリプションにつき1つしか選択できないため、他ユーザーとの共有環境では注意してください。

[3] Machine Learning Stuidoを開く

「作成」ボタンをクリックし、リソースの作成完了を待ちます。作成が完了すると、通知アイコンに「展開が成功しました」とメッセージの表示とともに、作成したリソース(今回の場合はMachine Learning Studio Workspace)を表示する「Go to resource」ボタンが現れますので、クリックします。

通知アイコンの「Go to resource」をクリック

作成したワークスペースが表示されます。

作成したワークスペース

「Machine Learning Studio の起動」をクリックします。新しいブラウザが立ち上がり、MLStduioの画面が表示されます。

画面左上の横三本線で表されるメニューボタンをクリックし、[Azure Machine Learning]ー[Studio]をクリックします。

[Azure Machine Learning]ー[Studio]をクリック

MSStudioの初期画面が表示されます。

Machine Learning Studioの初期画面

Experimentsの作成

まずはMLStudioの使い方に慣れましょう。MLStudioでは入力からモデルのトレーニングまでの一連の処理、またはWebサービスによる入力データの受付から予測を行い、その結果を出力する一連の流れをExperimentsと呼び、1つの単位とします。従って機械学習を開始するにはまずはExperimentsという器を用意します。

画面一番左下「+NEW」をクリックします。

「+NEW」をクリック

様々なサンプルがあることがわかります。今回は「Blank Experiments」をクリックします。

Blank Experimentsをクリック

註:「+NEW」をクリックして表示される様々なサンプルですが、Experiments Tutorialは、MLStudioを使用したモデルのトレーニングからWebサービスの公開をステップバイステップで紹介してくれるものです。それ以外のサンプルはMachine Learning Studio Galleryの一部です。膨大な量ですのでここで一つ一つ紹介できませんが、様々な分類器、回帰の実装サンプルと解説(英語)がありますので、アルゴリズムについて詳しく知りたい方はぜひご覧ください。

今作成したExperimetsが開きます。

Blank Experiments初期画面

サンプルデータセットの配置

機械学習を始めるにあたってとても困るのがデータです。データが無ければ機械学習を始めることができません。幸いなことにMLStudioには様々なサンプルデータが用意されています。

[1] サンプルデータを配置

左側のサイドメニューから「Saved Datasets」ー「Samples」とクリックします。様々なサンプルデータが一覧表示されます。この左側のサイドメニューのことをモジュールパレットと呼びます。

現在表示されている中から一番上に表示されている「Adult Census Income Binary Classification dataset」を画面中央へドラッグ&ドロップします。この画面中央のモジュールの配置エリアのことをキャンバス、と呼びます。

「Adult Census Income Binary Classification dataset」は、年齢、人種や職業などの属性値によって、年収が5万ドル以上か、未満かを表すデータです。

「Adult Census Income Binary Classification dataset」をドラッグ&ドロップ

[2] Experimentsの保存

ここで一度Experimentsを保存しておきます。キャンバス上部の「Experiment created on 2017/5/28」にポイントを合わせると編集できます。ここでは「MyNavi Experiment」とします。

Experiments名の修正

[3] データの中身を参照

今キャンバスに配置したデータの中身をのぞいてみましょう。配置した「Adult Census Income Binary Classification dataset」の下辺に大きな①が表示されていると思います。これを右クリックし、「Visualize」をクリックします。

「Visualize」をクリック

データの中身が表示されます。全件ではなく、先頭100件ほどしか表示されないことを覚えておいてください。あくまで「Visualize」は中身をのぞく感覚です。しかし件数と列数を把握することはできます。左上の「rows」が件数、「coluns」が列数です。

データの中身が表示される

件数が32561件、列数が15列であることが確認できました。

トレーニング用と評価用にデータを分割

機械学習ではデータをトレーニング用と評価用に分割します。トレーニング用は文字通りモデルをトレーニングするために使用します。評価用はトレーニングしたモデルを使用して予測させるためのデータです。データには実測値が含まれているため、予測値と比べることでトレーニング済みモデルの精度を評価することができます。

註:実測値を含むデータのことを「教師ありデータ」と呼びます。詳しくは第2回で解説します。

ではデータを2つに分割してみましょう。左側のモジュールパレットの上部にある検索窓に「split」と入力します。「Data Transformation」-「Sample and Split」の下に表示される「Split Data」モジュールをキャンバスにドラッグ&ドロップします。

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

配置済みの「Adult Census Income Binary Classification dataset」と、今配置した「Split Data」を線で繋ぎます。「Adult Census Income Binary Classification dataset」の下辺の○から「Split Data」の上辺の○へドラッグ&ドロップします。

「Split Data」モジュールは上辺から入ってきたデータを2つに分割します。分割した結果は下辺の①と②から出力されます。①と②の出力割合は「Split Data」のプロパティ値を修正することで変更できます。

ここでは①に75%、②に25%のデータを出力するように分割してみましょう。「Split Data」を選択し、画面右側のプロパティの「Fraction of rows in the first output dataset」の値を「0.75」とします。

線で繋ぎ、プロパティ値を変更

実行してみる

「RUN」をクリック

ここでCTRL+Sと押下するか、画面下部の「Save」アイコンをクリックして保存しておきましょう。では、分割されることを確認します。画面下部の「RUN」にポインタを合わせるとポップアップするメニュー内から「RUN」をクリックします。

処理が終了すると、右上に「Finished running」という文字とともに緑色のレ点が表示されます。また、処理が正常終了したモジュールにも緑色のレ点が表示されます。

正常終了

分割結果を確認します。下辺左の○を右クリックし、「Visualize」をクリックします。

「Visualize」をクリック

行数を確認しましょう。24421、となっていることがわかります。全体が32561件でしたのでおよそ75%です。設定通りに分割されています。

行数を確認する

分割されたもう片方のデータ件数も確認します。下辺右側の○を右クリックし、「Visualize」をクリックし、データを参照します。

行数を確認する

8140行であることが確認できます。左側に分割された24421行と合わせると合計32561行となって元の件数と一致します。

「Split Data」モジュールの使用法をご紹介しました。使用法をまとめると、

①モジュールは左側のモジュールパレットからキャンバスにドラッグ&ドロップ
②他モジュールと線で繋ぐことで入出力を指定
③モジュールを選択状態にし、右側のプロパティでモジュールの動きを調整

となります。これは「Split Data」だけではなく、あらゆるモジュールに共通する基本的な使用方法となります。

不要なデータを除く

「Split Data」以外にも便利なモジュールがMLStudioには用意されています。モジュールの使用方法の復習も兼ねて良く使用されるモジュールの1つ、「Select Columns in Dataset」モジュールを使用してみましょう。これは入力データから必要な列に絞り込む機能を持つモジュールです。

[1] 「Select Columns in Dataset」をドラッグ&ドロップ

左側のモジュールパレットに検索窓に「Select」と入力し、絞り込まれた結果から「Data Transformation」ー「Manupilation」ー「Select Columns in Dataset」をキャンバスにドラッグ&ドロップします。

「Select Columns in Dataset」をドラッグ&ドロップ

「Split Data」でデータ分割する前に列を絞り込みましょう。データの流れを表す線を付け替える必要があります。

①「Adult Census Income Binary Classification dataset」と「Split Data」を繋ぐ線をクリックで選択し、キーボードの「Del」キーを押下し、線を消す
②「Adult Census Income Binary Classification dataset」の下辺○から「Select Columns in Dataset」の上辺○へドラッグ&ドロップする
③「Select Columns in Dataset」の下辺○から「Split Data」の上辺○へドラッグ&ドロップする

線を繋ぐ

ちゃんと結線したのに、「Select Columns in Dataset」モジュールに赤丸ビックリマークが表示されていることがわかります。これはプロパティ値にエラーが存在していることを意味します。「Select Columns in Dataset」モジュールは、どの列を出力(もしくは除外)するのかを指定する必要があるのですが、まだ列の指定をしていないためエラーとなっています。

[2] 列を指定する

「Select Columns in Dataset」モジュールを選択し、右側のプロパティの「Launch column selector」をクリックします。すると「Select Columns」というダイアログが立ち上がるかと思います。このダイアログによる列指定方法は複数あるのですが、デフォルトの「BY NAME」による出力する列を指定する方法にしましょう。

「AVAILABLE COLUMNS」の下に表示されている列名をどれか1つクリックしてからCTRL+Aと押下すると、前列が選択状態になります。その状態からCTRLキーを押下したまま、除外したい列をクリックします。ここでは「fnlwgt」と「occupation」をクリックしました。

列を指定する

「>」をクリックすると「AVAILABLE COLUMNS」で選択した列が右側の「SELECTED COLUMNS」に移動します。「SELECTED COLUMNS」に表示されている列だけを出力するように設定したわけです。この状態を保存するには右下のレ点をクリックします。

保存する

[3] 確認する

正しく列が除外されたかを確認してみましょう。そろそろ慣れてきたかと思いますが、モジュールの出力結果を覗き見るのはモジュール下部の出力端子○を右クリックして「Visualize」をクリックします。と、その前に「RUN」ボタンをクリックして実行しておくことをお忘れなく。「RUN」ボタンによる実行を忘れると、「Visualize」がグレーアウトしてクリックできません。

「Visualize」をクリックして「fnlwgt」列と「occupation」列が除外されたことを確認する

「fnlwgt」と「occupation」が出力されていないことがおわかりいただけたかと思います。列数も15から13に減っています。 出力列を絞り込んだ結果が、「Split」モジュールにも引き継がれていることを確認しましょう。「Split」モジュール下部の出力端子〇を右クリックして「Visualize」をクリックします。

列の選択結果を確認する

行数は24421で列を除外する前と変わっていませんが、除外した「fnlwgt」と「occupation」は出力されていないことが確認できます。

最後に

簡単ではありますが、MLStdioの基本的な使い方がおわかりになったかと思います。今回は事前に用意されたデータセットを使用しましたが、本番では様々なデータソースをインプットに事前処理を行います。その時にはMLStudioに用意されている便利なモジュールを是非使用してください。

次回は今回作成した結果を使ってアルゴリズムを選定、モデルをトレーニングして予測を行います。そしてそのトレーニングを行った結果を評価します。

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