AzureMLは機械学習をこれから勉強する人にとって最高の環境だった

ブルベースの諫山です。

先日、機械学習の勉強会を職種・役職関係なく、非エンジニアも含め20名以上で開催しました。会社として今後、機械学習に力を入れていくに際し、共通言語を持つ必要性を感じたため、開催に至りました。

その研修ではAzureMLを使って簡単な回帰モデルの作成ができることをゴールとして課題設定したため、営業メンバーでも問題なく課題をこなすことができました。AzureMLでなければ、営業メンバーはきっと課題を完成させることはできなかったでしょう。今回はAzureMLが初学者の学習プラットフォームとしては最適である理由などをお伝えしたいと思います。

# AzureMLを選んだ理由
エンジニアのみであれば、Pythonでコードを書くことも出来たでしょう。しかし、今回は営業メンバーも含まれているため、コードを書かせることは出来ません。一方、AzureMLは**ドラッグ＆ドロップ**で機械学習のステップや**アルゴリズムを選択**し、いくつかの**設定を入力**すれば、機械学習モデルを作成することができます。
<img width="600px" alt="ドラッグアンドドロップ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/793ca31c-f9a7-291b-4ff7-d7ee7c33258e.png">
これなら営業メンバーでもきっと出来るでしょう…。

# 回帰モデルの作成プロセス
今回は**木の胴回り**、**木の高さ**から**木の体積を予測する**、**回帰モデル**を作成しました。予測するプロセスを下図に示します。
<img width="800px" alt="作成するモデル概要.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/7970b5b1-f13e-fde3-be29-6655b50a6718.png">
手順としては、

1. 元データを**教師データ**と**評価データ**に分割する。
1. 教師データを学習アルゴリズム（回帰）を噛ませ、**学習済みモデルを作成**する。
1. **学習済みモデル**に対し、**教師データ**を用いて**予測**させる。
1. **評価データ**に対し、**学習済みモデル**を用いて**予測**させる。
3と4の**予測結果を比較**して、**学習済みモデルを評価**する

となります。ここまで出来れば、機械学習がどんなプロセスで進むのか理解してくれることでしょう。

## Step1：学習済みモデルを作成する

とはいえ、先ほどの図を1から作っても、単なる作業をしたぐらいにしかならないので、いくつかのステップに分けて、何度も繰り返し練習することにしました。

まずは、学習済みモデルを作成します。Step1の範囲を下記に示します。
<img width="800px" alt="step1_new.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/2bd9ca2a-928b-7e45-51bb-4703075862ba.png">
これをAzureML上で再現するには、次のように作業します。基本的にはドラッグ＆ドロップで作業ができるので、プログラムコードを書く必要は一切ありません。

作業の前に予めデータセットを準備します。tree.csvをアップロードし、ファイル形式や列見出しを設定すれば完了です
<img width="700px" alt="データセット.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/72e4af55-369a-abcb-e31a-722a0e7cbe9e.png">
さて、本題に入ります。AzureMLでStep1を実行するには、左メニューから必要な項目をドラッグ＆ドロップして、必要に応じ、パラメーターを設定していきます。一通り並べ、送信ボタンをクリックすれば学習済みモデルの出来上がりです。
![step1_azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/66f08f76-11fd-f1c4-92be-8b4481bd16c8.png)
このようにコードを記述することなく、視覚的に機械学習を学べるので、非エンジニアも苦手意識を持つことなく勉強できます。

## Step2：教師データと評価データに分割後、予測させる

Step1の状態から徐々に発展させて、冒頭に示した完成形を目指していきます。Step1では**学習済みモデルが出来ただけ**でこれにデータを与えなければ、何も起きません。よって、元のデータを**教師データ**と**評価データ**に分割し、**評価データを学習済みモデルを用いて予測**させます。Step2の流れを下図に示します。
<img width="800px" alt="step2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/03ef93b0-fa0c-0eef-22e3-defc0ba9a280.png">
データを分割する時は、AzureML上でSplit Dataを選択し、分割する割合、分割の方法などが設定できます。
<img width="800px" alt="step2_azure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/ad56461d-ccd7-4bec-cee9-179e81806099.png">
送信ボタンをクリックして、Score Modelを可視化すると下図の結果が得られます。この結果表示もAzureML上で簡易的な表＆グラフで表示されるので直感的です。
<img width="700px" alt="score_model.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/138c3539-56e5-0573-c584-bb26f5eecb44.png">

## Step3：モデルを評価する

Score Modelで予測結果を得ることはできましたが、これがどのぐらいの精度のものか説明することはできません。予測結果を評価するため、そこで先ほどの状態にEvaluate Modelを加えます。
<img width="700px" alt="evaluate_model.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/b680795c-9826-00d1-fd8a-9622e1ee2f4d.png">
この状態で実行し、Evaluate Modelをクリックして確認します。各種評価指標の詳細については割愛させていただくとして、今回のテストでは決定係数（1に近づくほど精度が高い）が0.89となりました。これは今回構築したモデルで木の体積の変動を89%説明できるということを示しています。

<img width="400px" alt="決定係数.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/42ff8bfd-08e3-e030-cb30-e5bc0ffb6371.png">
これで冒頭に紹介した一連のプロセスが学べたことになります。（再掲）
<img width="800px" alt="作成するモデル概要.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/85d29ae0-749e-5e97-b2d8-21df38458d01.png">
そして、その後も使用する列の選択、欠損値への対応などを行い、最終的に下図にまで発展しました。
<img width="700px" alt="最終形態.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/56af5e91-75a8-2164-1448-73f166e6b115.png">
ここまでやっても一切コードに触れることはありませんでした。もちろん、営業メンバーも最後まで実行することが出来ました。冒頭の図とAzureML上で作成したものが類似しているので、今何をやっているのか、指差し確認しながら作業出来たのがポイントだったと考えます。

# そもそも、なぜ、このような勉強会をしたのか。

冒頭で次のように説明しましたが、もう少し補足します。

> 機械学習の勉強会を職種・役職関係なく、非エンジニアも含め20名以上で開催しました。会社として今後、機械学習に力を入れていくに際し、共通言語を持つ必要性を感じたため、開催に至りました。

弊社では人材事業やシステムの受託開発を行っています。人材事業を例に説明すると、機械学習プロジェクトを進めている企業の案件に対し、どのフェーズでの人材が必要なのか、どのようなスキルが必要なのかが曖昧だと、エンジニアに求人を説明することも困難ですし、企業に対しても的確なエンジニアの提案ができません。よって、営業の質、エンジニアの育成を目的に今回の勉強会を開催しました。

AzureMLで作成した図で示すと、必要なスキルや職種は下図のように分割して考えることができます。
<img width="700px" alt="役割分担.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550717/3797f7dd-be76-d3e2-15be-45c149ef5658.png">
機械学習プロジェクトではここから更にアプリケーションエンジニア（iOS、Android、Web）が必要になるケースもあります。

このAzureMLを用いて、営業メンバーには機械学習プロジェクトにおけるフェーズ、登場人物、必要なスキルを整理させたかったのです。エンジニアは機械学習の流れが理解できれば、各フェーズをコード化すれば自分でも出来るという自信、苦手意識の克服に繋がると考えました。

# さいごに

弊社では不定期ではありますが、このような勉強会を開催しております。これは「**人を育てられる人を育てる**」という経営理念に従って開催しています。