文系PGがAzure ML Studioで機械学習をやってみた

　ここ数年、様々な環境が整い、機械学習は研究者、科学者、数学が得意な人だけでなく、私(sakaett)のようなプログラマでも出来るようになってきたと感じます。
　そこで、ここではMicrosoftのAzure Machine Learning Studioを使って、実際に機械学習を試し、実際どこまで出来るのか挑戦してみた内容を書いてみます。最終的には、AnacondaやTensorFlowも使ってみたいがどうだろう。

# 今回は入門編

## アカウント作成してSign In

まずはアカウントを作成してから、下記URLのページでsign inしましょう。
https://studio.azureml.net

## 実験だけなら無料

以下にある通り、実験するだけなら制限はあるものの無料で使えます。

https://azure.microsoft.com/ja-jp/pricing/details/machine-learning/


## 先ずはチュートリアルの「自動車価格予測」をやってみよう。

　まずは、以下のリンクにある、「自動車の価格予測」をやってみましょう。ドキュメントが良く出来ているので、読み進めながらやってみるだけでOKです。
https://docs.microsoft.com/ja-jp/azure/machine-learning/machine-learning-create-experiment

### 私がやってみた結果

以下のように実験が完成しました。

![スクリーンショット 2017-04-15 18.06.51.png](https://qiita-image-store.s3.amazonaws.com/0/176201/a44552aa-9019-b16f-3e8d-c72726e2e220.png)

結果は、一番下の「Evalute Model」の下側にある「○」を右クリックして、「Visualize」を選択すると表示されます。

![スクリーンショット 2017-04-15 18.10.35.png](https://qiita-image-store.s3.amazonaws.com/0/176201/0664af62-bd12-ce5d-4561-458ae1a6efa4.png)

　なんか出てきましたが、良くわかりませんね。これらの意味もチュートリアルのドキュメントに書いてあります。「Coefficient of Determination」は大きいほど、それ以外は基本的に小さいほど良いと覚えて起きましょう。

### 予測した価格は?

 というか、価格を予測したのに、予測した価格はどこで見るのでしょう?
今度は、Evaluate Modelの上にある「Score Model」の下の「○」を左クリックして、Visualizeしてみましょう。

![スクリーンショット 2017-04-15 18.17.43.png](https://qiita-image-store.s3.amazonaws.com/0/176201/5660035b-7b3a-c4b7-f53e-b21ee78943eb.png)

　Priceが実際の価格、Scored Labelsが予測した価格です。
なんか、数字の羅列なので、うまく予測してるのかそうでないのかわからないですね。

　では「Price」列を選択し、右側の「Histgram」の「compare to」で、Scored labelをプルダウンから選択してください。以下のようなグラフが表示されます。

![スクリーンショット 2017-04-15 18.19.32.png](https://qiita-image-store.s3.amazonaws.com/0/176201/f9b558a2-09b9-dcfc-a587-b2c3957b706d.png)

　縦軸が予測した値、横軸がPriceです。なんかそこそこ右上方向に伸びている感じがします。予測した値とPriceが全く同じなら、「 y = x　」のグラフになると言えばわかりやすいでしょうか?

### 予測結果をCSVでダウンロードする

　出来れば、Excelか何かで見てみたいです。では、予測結果をCSVでダウンロードしてみましょう。予測と実際の値を折れ線グラフにしたらわかりやすいですし。

　右側の「Data Format Conversions」で「Convert to CSV」を選択し、実験に追加します。「Scored Model」の下に接続しましょう。

![スクリーンショット 2017-04-15 18.36.55.png](https://qiita-image-store.s3.amazonaws.com/0/176201/f45bda91-f972-5c32-f7c7-e89a56344167.png)

　画面下の「Run」で実行すると、緑のチェックが付きますので、「Convert to CSV」の下の◯を右クリックして、「Download」します。


　OpenOfficeで以下のように表示できました。成功しています。
![スクリーンショット 2017-04-15 18.39.54.png](https://qiita-image-store.s3.amazonaws.com/0/176201/0f90177c-89fc-4c25-c1a3-356cd73c8cc1.png)


　グラフにしてみました。青が実際の値、赤が予測した値です。なんか結構予測できてる感じがしますね!!。少なくとも、傾向としては合ってます。
![スクリーンショット 2017-04-15 18.42.53.png](https://qiita-image-store.s3.amazonaws.com/0/176201/d8eff17c-b5ce-1b78-1bba-d585359960b2.png)

## sakaett的な、機械学習の概念的理解

　さて、今回は「はじめてのAzure ML Studio」みたいな内容になりましたが、ここで元々は文系の私なりに、どう理解しているかを少しまとめたいと思います。「機械学習は数学の得意な理系の人たちだけのもの」「LAMPやスマホアプリ作ることしか出来ない人間には無理」という先入観を少しは払拭できるでしょうか?

### y = axのaを、データから学習して見つけるのが機械学習

　機械学習とは統計だそうです。かなり乱暴な言い方になりますが、データ全てを数値として捉え、y = axのaがいくつだったら「だいたい近い」値になるのかを見つけるのが機械学習の基本的な考え方と理解しています。

### どうしたらより良い予測が出来るのかはトライアンドエラー

　そもそも「予測」である以上、100%はありえません。(逆に100%の予測が出来たら、過学習を疑うべき)。そして、より良い予測を出すためにはいろいろ試すしか無いそうです。経験と勘はあるようですが。このことは、「ああすれば必ずデータが登録される」「こうすれば必ず画面に画像が表示される」という普通のプログラミングとは全く異なる考え方です。

### 機械学習は「意味」を理解しているわけではない

　文系の人は、機械学習とかAIというと、ついつい投入したデータの意味を理解して解析していると感じがちです。しかし実際には、すべてを単に数値として計算し、学習用のデータに書いてある「答え」と、それに関連づけられている(同じ行にある)データとの関係を統計的に計算してもっとも近くなる結果を出しているだけです。記号論的の用語で言うと、シニィフィエだけでシニィフィアン無し、記号だけで概念なしに動作している、といった感じでしょうか?

## 方法論てきなもの

　「教師あり」「教師なし」などの用語は、本物の機械学習のプロの皆様がqiitaで書いてらっしゃるので、ここでは元々文系の私が理解している方法論的なものを書いてみます。

### データは1行にまとめる

　データベースが得意な皆さん。昔「RDBMSとオブジェクト指向の対立」なんてのがあって、Oracle7が得意だった私も悩まされたものですが、ここでも似たような感触がありました。
　「教師あり学習」において、機械学習はデータを配列として扱い、1行のデータに回答が一つある、という形のデータで学習します。つまり、時系列のデータでも答え一つに対して一行にまとめる必要があります。

### データの量に注意

　少ないデータ量ではちゃんと学習できません。多くても内容が偏ってる場合は少ない部分を増やしてあげる場合もあります。

### 用語の使い方の違いに注意

　普通にプログラミングで使っている用語と異なる使い方をする同じ言葉がありますので、注意しましょう。機械学習の文脈で「クラスタリングして」と言われたのにMySQL Clusterとか準備しだしたりしないように。

- ラベル -- 教師あり学習データの「答え」のこと。

- フィーチャー　-- 予測に使うデータのこと

- クラス -- 分類のこと。今回は回帰分析しましたが、たとえば「女性か男性か」「犬か猫か」といった分類のことです。public class AA extends BBのクラスのことでは無いです(意味的には同じでしょうが)。

- クラスタリング -- 「教師なし学習」で、データのまとまりを見つけることです。twwiter界隈で使われている「XXクラスタ」という使い方と同じです。DBのクラスタリングのことではありません。