Jack of all trades

master of none. 多芸は無芸を地で行く、自作自演何でも屋。

Azure Machine Learning できるとこまでやってみよう Vol.1

盛り上がってきてますね、Azure Machine Learning。昨年のMicrosoft Conference 2014が開催された時点ではまだプレビューでしたが、ビッグデータやら統計やら機械学習やらが流行って(?)いる影響もあり、注目度はかなり高かったように感じます。 私自身、元々個人的に機械学習の分野を勉強しており、Azure MLのプレビュー版が公開された時は心躍りました。*1

そんなAzureMLも今ではGAとなり、方々で大規模な仕組みに活用されている、なんて噂も耳にしますが…なんせ日本語の情報がない!本当に活用されているのか…?いやいや、まだ大企業が裏側をおおっぴらに公開できないようなエンタープライジーな領域で活用しているのが主だから、我々のような個人開発者の目に触れていないだけ…だと信じたい。まぁ公式のドキュメントも最近ようやくリファレンスが日本語化されつつある*2ぐらいの状況なので、本当にまだまだこれからなのかもしれません。

ということで、本当はもっとじっくり実験してからドカッと成果物を…なんて思ってましたが、とりあえずAzure MLを使ってできるところまでやってみた際の情報を小出しにする方向に切り替えました。日本語のAzure ML情報を求めている方々に少しでも参考になればと思います。

Vol.1ではジャブ的に、MSC2014でジニアス平井氏がデモを実施していた簡単な予測の仕組みをご紹介します*3(ユースケースもそのままに、とあるお店の来客数予測という体で進めていきます)
ちなみにその時のセッション動画はこちら↓ channel9.msdn.com

この動画を見た段階で大体何やってるか理解できてしまった方はこの段階でそっ閉じしていただければOKです(Vol.2はまた違う種類の学習を扱うつもりなので、その際にはどうかひとつ)

そんなこんなで、差し当たりVol.1を通じて、Azure MLのメイン画面であるML Studioの基本的な使い方がふんわり伝わればと思います。

1.学習データの準備

まずは学習データの準備からです。これが無いと始まらない。Azure MLでは、Azure上のSQL DatabaseやBlob Storageに蓄積したデータを利用することもできますが、今回はローカルのcsvファイルをアップロードして利用する方法でやってみます。
エンコードUTF-8にしないとアップした先で日本語が化けるので注意!!!
データの内容は以下の通り。

f:id:sadynitro:20150411162924p:plain

予測する対象である日別の来客数と来客に関係しそうな要因データ(曜日、天気、気温)を並べたデータとなっています。あくまでサンプルなので、実際にはより多くの(且つ効果的な)要因データを付加し、データ量(日数)自体も大量に用意する必要があるかと思います(どの程度の精度を求めるかにもよりますが)

2.データのアップロード

ここからは前述したようにAzure MLのメイン画面であるML Studioの画面で操作していきます。

Azureのポータルから「Machine Learning」を選択。
f:id:sadynitro:20150411162900p:plain

一覧から使用するAzure MLのインスタンスを選択し、
f:id:sadynitro:20150411163016p:plain

下段の「STUDIOで開く」をクリック。
f:id:sadynitro:20150411163047p:plain

ML Studioの画面が開いたら、左下の「NEW」をクリック。
f:id:sadynitro:20150411163549p:plain

新規作成の画面で「DATASET」を選択して「FROM LOCAL FILE」をクリック。
f:id:sadynitro:20150411164014p:plain

ファイルアップロードの画面が開くので、作成したcsvファイルを選択してアップロードします。
必要に応じてデータの名称を変更したり備考を入力したりしておきます。
f:id:sadynitro:20150411164141p:plain

因みにファイルの形式が色々と選べます。今回はヘッダー付のcsvファイルを選択しておきます。
f:id:sadynitro:20150411164150p:plain

右下のチェックマーク(実行ボタン?)をクリックするとアップロードが開始します。
下段のメッセージで成功した的なメッセージが表示されればこのフェーズは完了です。

3.学習モデルの構築

ようやく実際に学習モデルを構築するフェーズに入ります。ドラッグアンドドロップで直観的な簡単操作!ただし各モジュールの意味を正しく理解している場合に限る!*4とはいえ全部を理解しておく必要はないので、幾つかパターンを覚えて、あとは状況に応じて使えそうなパターンに当てはめて微調整することで、割と様々な課題を解決できるのではないかと考えています。

3.1.新規EXPERIMENTの作成

それではまず学習モデルの構築をするためにEXPERIMENT(実験場)を作成します。
左下「NEW」をクリックして、新規作成画面から「EXPERIMENT」を選択します。様々なサンプルやテンプレートが表示されますが、今回は男らしく「Blank Experiment」を選択します。

f:id:sadynitro:20150411165202p:plain

作成されたEXPERIMENTの画面が開きます。
f:id:sadynitro:20150411165214p:plain

3.2.学習データの配置

EXPERIMENTの画面が開いたら、学習の元手となるデータを配置します。今回は上述でアップロードしたデータを用います。

左側の一覧にある「Saved Datasets」を開くと
f:id:sadynitro:20150411165104p:plain

アップロードしたデータが入っているはずなので、そのモジュールをドラッグアンドドロップで真ん中のフィールドに配置します。
f:id:sadynitro:20150411165122p:plain

配置したデータセットの下についている○をクリックするとメニューが開くので「Visualize」を選択してみましょう。
f:id:sadynitro:20150411170502p:plain
f:id:sadynitro:20150411170759p:plain

配置したデータセットの中身を見ることができます。
f:id:sadynitro:20150411170811p:plain

3.3.使用するデータの選別

次に配置したデータの中から、実際に学習に使用するデータを選別します。
左の一覧にある「Data Transformation」を開き、さらにその中にある「Manipulation」を開きます。
f:id:sadynitro:20150411171106p:plain

「Manipulation」の中にある「Project Columns」というモジュールを配置します。
f:id:sadynitro:20150411171119p:plain

モジュールを配置したら、Datasetモジュールの下とProject Columnsモジュールの上をドラッグで接続します。 そして、配置したモジュールを選択した状態で、右側のプロパティの中にある「Launch column selector」をクリックします。
f:id:sadynitro:20150411171439p:plain

データセットの中から使用する列項目を選択する画面が開くので、ここでは「include」「column names」を条件として、「date」以外の項目を選択しておきます(とりあえず日付は不要なので)
f:id:sadynitro:20150411171510p:plain

3.4.学習データと評価データに分割

選別されたデータを学習データと評価データに分割します。学習データは、実際に学習器に通して学習を実施します。評価データは、学習済みのモデルに通して、そこから出力されたデータと実際のデータを比較することで学習済みのモデルの性能を評価するために用いられます。

データを分割するにはSplitモジュールを用います。
左の一覧から「Data Transformation」→「Sample and split」の順に開き、中にある「Split」モジュールを配置します。
f:id:sadynitro:20150411171106p:plain
f:id:sadynitro:20150411172505p:plain

配置出来たらProject Columnsモジュールの下とSplitモジュールの上をドラッグで接続します。
配置したモジュールを選択状態で左側のプロパティを見ると、様々なパラメータが設定できるようになっています。
f:id:sadynitro:20150411172615p:plain
今回の説明に関係するパラメータについて軽く説明しておくと、

  • Fraction of rows in the first output dataset: データ全量のうち学習データの割合を入力します。0.7ならデータ全量のうち70%を学習データ、30%を評価データに分割します。
  • Randomized split: 分割の際のデータ振り分けをランダムで行うか否かを設定するチェックです。
  • Random seed: Randomized splitが有効な場合の乱数シードを設定します。0の場合は、システムクロックをシードとして利用するため、実行ごとにデータの振り分けが変化し、学習結果が異なる可能性があります。

ここではFraction of rows(以下略)を0.7に設定しておきます。

3.5.学習器の配置と学習アルゴリズムの選択

いよいよ実際に学習を行うための学習器と学習アルゴリズムを配置していきます。
学習器では、接続されたデータから、学習の目標値(予測させたい値)を設定し、接続した学習アルゴリズムを用いて実際に学習を行います。
学習アルゴリズムはあらかじめ用意されたモジュールの中から最適なものを選択します。また大抵のモジュールで複数のパラメータを設定することができ、パラメータの調整により学習の精度が変化します。

それでは学習器から配置していきます。
左の一覧から「Machine Learning」→「Train」の順に開き、中にある「Train Model」を配置します。
f:id:sadynitro:20150411172627p:plain
f:id:sadynitro:20150411172647p:plain

配置できたら、Splitモジュールの左下とTrain Modelモジュールの右上をドラッグで接続します。
配置したモジュールを選択した状態で、右側プロパティにある「Launch column selector」をクリックします。
f:id:sadynitro:20150411172744p:plain

目標値の選択画面が開くので、予測させたい項目を選択します。ここでは来客数を予測させたいので「visitor」を選択します。 f:id:sadynitro:20150411172754p:plain

次に学習アルゴリズムを選択します。今回は予測をさせたいので「Regression(回帰)」のアルゴリズムの中から選択します。差し当たりMSC2014でのデモに倣い「Boosted Decision Tree Regression(ブースティングされた決定木による回帰)」を使用します。
左の一覧から「Machine Learning」→「Initialize Model」の順に開き、中にある「Boosted Decision Tree Regression」を配置します。
f:id:sadynitro:20150411172659p:plain

配置したモジュールの下とTrain Modelモジュールの左上をドラッグで接続します。
モジュールのプロパティを見ると幾つかの学習パラメータが存在しますが、ここでは特に変更を加えずに使用します。 (例えばLearning Rate(学習率)を高くすると、学習スピードは速くなるが局所解に陥りやすい、など色々な効果があるのですが、実際には学習されたモデルの精度を見ながらチューニングしていくことになるのでここでは割愛します)
f:id:sadynitro:20150411172819p:plain

3.6.評価モジュールの配置

最後に、学習されたモデルがどの程度の性能であるかを評価するためのモジュール(ScoreモジュールとEvaluateモジュール)を配置します。
Scoreモジュールは学習済みモデルに評価データを接続して、実際の値とモデルから出力された値(ここでは予測値)を比較する(答え合わせ的な)モジュールです。
EvaluateモジュールはScoreモジュールによって比較された結果、その学習済みモデルがどのくらいの精度かを数値化してくれるモジュールです。

まずはScoreモジュールを配置します。
左の一覧から「Machine Learning」→「Score」の順に開き、中にある「Score Model」を配置します。
f:id:sadynitro:20150411172627p:plain

Train Modelモジュールの下とScore Modelモジュールの左上、Splitモジュールの右下とScore Modelモジュールの右上を接続します。
f:id:sadynitro:20150411172717p:plain

次にEvaluateモジュールの配置です。
左の一覧から「Machine Learning」→「Evaluate」の順に開き、中にある「Evaluate Model」を配置します。
f:id:sadynitro:20150411172725p:plain

Score Modelモジュールの下とEvaluate Modelモジュールの上を接続します。 f:id:sadynitro:20150411172849p:plain

ここまででようやく学習モデルの構築が完了です。

3.7.学習の実行

学習モデルの構築が完了したら、学習を実行してみましょう。
下段にある「RUN」をクリックすると学習が実行されます。
f:id:sadynitro:20150411172919p:plain

各モジュールが実行される様子が表示され、実行に成功したモジュールには緑色のチェックマークが付きます。全てのモジュールでチェックがつけば実行完了です。
f:id:sadynitro:20150411172930p:plain

3.8.学習結果の評価

学習の実行が完了したらお楽しみの性能評価です。
まずはScore Modelモジュールの下○をクリックして「Vizualize」を選択します。
f:id:sadynitro:20150411172940p:plain

右端の2列がそれぞれ実測値と予測値です。さすがに学習データがダミーということもあり精度はいまいち、といったところでしょうか。
f:id:sadynitro:20150411172948p:plain

とはいえ、ぱっと見でモデルの精度を正確に判断することはできないので、Evaluate Modelモジュールの下○をクリックして「Visualize」を選択してみましょう。
f:id:sadynitro:20150411172958p:plain

図に注釈を入れている項目(Relative squared error)は実測値に対して予測値がどれだけあっているという割合を示した値です。
よってこのモデルの正解率(的なもの)は約87%ということになります。やっぱり精度低めですね。でも、ちゃんと近しい値を算出しようとするモデルが出来上がっていることは見て取れます。
f:id:sadynitro:20150411173005p:plain

いかがでしょうか?Vol.1ということもあり、手順ベースでかなり細かく説明をしてきました(さすがにVol.2以降はここまで細かくは説明しない予定…)
Azure MLをほとんど触っていない方でもわかりやすく、と思ったのですがちょっと細かすぎたかもしれませんね…。
最後まで読んでくださった方、お付き合いいただき光栄です。

*1:特にExecute R Script!Rが動くなら何でもできるんじゃね?と思っていた時代が私にもありました…。今は少し冷静になりましたが。

*2:日本語ページだとナビゲーションが死んでたりするのでホントにまだまだですね。結局英語ページ見ちゃう。

*3:とにかくAzure MLの操作に関してはこのセッションが一番わかりやすいと思ったので。かくいう私もML Studio上の操作はこのセッションを見て初めて理解しました

*4:残念ながら、ある程度機械学習の知識があっても、この画面のモジュールの使い方がわからないと、どこをどうつないでいけばいいかさっぱりわからないのがAzure MLの弱点の一つだと思っています。