機械学習（AWS）

##**はじめに**

　弊社では月に1回程外部勉強会を開催しております。実は筆者も先月社外勉強会を行いまして、その際のテーマが「クラウドで実践する機械学習」として｢AWS｣と｢Azure｣の機械学習のサービスを使用してどちらがより簡単か？どちらがより精度が高いのかを比較しました。本記事はその時のデモで取り扱ったデータの作成方法等のご紹介となります。
　今回は「AWS　MachineLearning」を取り扱います。
<HR>

##**■1■今回やること**
　[AWS MachineLearning]を使用して「二項分類」による予測を行います。「二項分類」とは「二値分類」ともよばれています。内容はいわゆる「YesOrNo」による予測であらかじめ投入したデータ（教師あり）を元に特定の問題に対する予測を行います

今回のシナリオではAWSで提供している[AWS MachineLearning]と気象庁の観測データを使用し予測を行います。

作業時間はおおむね20分程度となります。

<Font color=red>**テーマ：
｢AWS｣、｢Azure｣それぞれの機械学習サービスはどちらが簡単でどちらの方が精度が高いか**</Font>

<Font color=red>**本記事の予測内容：
｢AWS｣の｢MachineLearning｣を使用してある特定日に雨が降ったか降らなかったのかを予測する**</Font>

##**■2■準備**
・AWS　Account
・予測するデータ（今回は気象庁のデータになります）

-予測データ概要-
日にち　：　2014年1月1日　～　2018年5月31日
天候予測地区：東京
データ取得日数　：　1613日
データ数　：　36349

##**■3■データ準備**

気象庁（以下URL）よりデータを取得します。基本的には感覚で操作可能です。しかしながらそのままでは予測データとして不適当な為、取得したデータを加工します。
　加工して予測データとして使えるものにするのですが、実際に過去の実績データに｢雨が降ったのか？ふらなかったのか？｣という答えをあらかじめ与えています。
　二項分類ではあらかじめ正解のデータを機械に与えることで未知の問題に対する予測を行います。

1). 以下URLへアクセス
　　http://www.data.jma.go.jp/gmd/risk/obsdl/index.php
2). 「日本地図」から「東京」を選択。（次画面も東京を選択）
3). 「検索条件」タブから「期間を選ぶ」を選択する
4).　以下の期間をプルダウンより指定し｢項目を選ぶ｣を選択
　　　4-1).2014年1月1日　～　2014年12月31日
5). 「項目」では以下の項目にチェックを入れる
　　　※チェックできる項目はすべてチェックしてください
6). 「CSVファイルをダウンロード」を押下し「Data.csv」を作業端末へダウンロード
7).　｢Data.csv｣を開き以下の編集を行う
　　　7-1). 1～3行目を削除。
　　　7-2). 3行目の｢品質番号｣,｢均質番号｣と記載されているすべての列を削除
　　　7-3). 2,3行目を削除
　　　7-4). 最終列に｢判定A｣,｢判定B｣,｢ターゲット｣という列を追加する
　　　7-5). ｢判定A｣の一行目に以下の関数を指定し全行に反映させる
　　　　　　**``=IF(COUNTIF($B2,"*"&"雨"&"*"),"●","")``**
　　　　　　**``※$B2　：　天気概況(昼：06時～18時)``**
　　　7-6). ｢判定B｣の一行目に以下の関数を指定し全行に反映させる
　　　　　　**``=IF(COUNTIF($C2,"*"&"雨"&"*"),"●","")``**
　　　　　　**``※$C2　：　天気概況(夜：18時～翌日06時)``**
　　　7-7). ｢ターゲット｣の一行目に以下の関数を指定し全行に反映させる　　　
　　　　　　**``=IF(OR(X2="●",Y2="●"),"1","0")``**
　　　　　　**``※X2　：　判定A``**
　　　　　　**``※Y2　：　判定B``**
　　　7-8). ｢ターゲット｣全行をコピーし同列に｢値｣を張り付け
　　　7-9). 以下の列を削除する
 　　　　　　**``※天気概況(昼：06時～18時)``**
 　　　　　　**``※天気概況(夜：18時～翌日06時)``**
 　　　　　　**``※判定A``**
 　　　　　　**``※判定B``**
7).　｢Data.csv｣を｢weather_yyyy｣として保存する。
8).　手順｢1) ～7)｣まで以下の年数分繰り返す
 　　　　　　**``2015年1月1日　～　2015年12月31日``**
 　　　　　　**``2016年1月1日　～　2016年12月31日``**
 　　　　　　**``2017年1月1日　～　2017年12月31日``**
 　　　　　　**``2018年1月1日　～　2018年12月31日``**
9).　作成したファイルを一つのファイルに結合する
 　　　　　　**``ファイル名　：　Weather.csv``**


##**■4■データアップロード**
　前項で作成した｢Weather.csv｣をAWS上でも使用できるようにS3にアップロードします。ここにアップロードしたデータを｢AWS MachineLearning｣で使用します。

1). ｢AWS｣にログインしサービスから｢s3｣を選択する
2). ｢パケットを作成する｣をクリックする
3). 以下設定を行う。
　　3-1).　｢パケット名｣は任意の名前を入力
　　3-2).　｢リージョン｣は米国東部を指定
　　3-3).　｢作成｣を押下する。
　　3-4).　｢s3｣に作成された｢パケット名｣をクリック
　　3-5).　｢アップロード｣を押下する。
　　3-6).　｢Weather.csv｣をドラッグ＆ドロップし｢アップロード｣を押下する

##**■5■AWS MachineLearning**
　ようやく｢MachineLearning｣の登場になりますアップロード済みのデータを使用して天候予測を行います。今回はシンプルに簡単に作るをテーマにしていますので複雑なことは一切やりません。

1). サービスから｢Machine Learning｣を選択する
2). ｢Get Started｣をクリック
3). ｢View Dashboard｣をクリック
4). ｢Objects｣から｢Datasource and ML model｣をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/33ec79b6-3409-71b8-84f9-35e490d2bfc5.png)

5). ｢InputData｣の｢S3 Location｣にアップロードしたファイルのパスを入力し｢verify｣

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/cc436f03-a752-4a0b-2da2-e15f55a7e027.png)

6). 以下ポップアップは｢yes｣
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/7ca4a423-ad81-7d13-2452-7e56ce3432da.png)

7). 問題なければ｢Continue｣

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/baa8283a-9505-c371-e2a7-f3569d822392.png)

8). ｢ターゲット｣が｢Binary｣になっていることを確認し｢Continue｣

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/ac33fe77-0d82-6bd1-81f1-d1bb96ddbfe8.png)

9). ｢ターゲット｣にチェックをいれ｢Continue｣

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/434fc62a-847a-5535-af03-80563f91e06e.png)

10). ｢Row identifier (optional)｣の画面では特に操作はないので｢Review｣を押下する
11). 設定内容が表示されるので問題なければ｢Continue｣
　　　※設定を変える場合はEditをクリックして内容を変更する

12). ｢Default｣が選択されていることを確認し｢Review｣を押下する
　　　※｢Custum｣を選んだ場合作成するモデルの詳細について設定することが可能です。
　　　　今回はシンプルに作成するのがテーマになるため自動で作らせます

![0001.png](https://qiita-image-store.s3.amazonaws.com/0/150678/fd42d794-1448-2f58-2016-4512f063d3a9.png)

12). 内容を確認し問題なければページ下部の｢Create ML Model｣を選択する
　　 ※この後｢Status｣が｢Complated｣になるまで待ちます。（大体5分くらい）
　　 ※｢Complated｣になったらデータセットとモデル作成が終わっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/4718a9a5-c453-692a-5d5f-5cc86fa92097.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/6b1b6252-3d4b-7f33-7355-f1d8a228fcb6.png)

##**■6■予測**
　作成したモデルで予測を行うには二つパターンがあります。一つは複数のデータ(CSVに複数のデータを読み込む)から予測を行う「bat予測」とデータを一つづつ入力し予測を行う「リアルタイム」になります。今回は特定日だけで構いませんので後者になります

1). ｢Try raal-time predictions｣を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/1dc9ee69-ebd1-0fcf-046b-7869e64d2555.png)

<hr>
以下より特定日のモデルデータを入力しますが、やり方は二つあります。一つは手順｢2A｣で使用している手入力方式ともう一つは手順｢2B｣で使用しているCSVから一括データ入力です。手順としては｢2A｣,｢2B｣どちらか一つで構いません。

ただ｢2B｣の場合は、カラムがづれているかもしれませんので入力の際は先にチェックを入れておいたほうがいいです

また今回予測として使用するデータは｢雨が降っている日｣と｢雨が降らなかった日｣の二つを予測します。
　**``一つ目　：　2018年6月10日　天候：　雨``**
　**``二つ目　：　2018年6月10日　天候：　晴れ（雨は降っていない）``**

今回行う予測では以下のような2択にしています。
　**``0　：　その日、雨は降っていない``**
　**``1　：　その日、雨は降っていた``**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/45438fb0-7ed9-d2bd-dd56-5c94579b0fc5.png)


<hr>

■2A).　手入力方法
2A1). 下記画像赤枠の入力欄にひとつづつデータを手入力し、全項目を埋めたら｢Create Predictions｣を押下

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/977d1565-460b-d4e2-9c3f-54b0bd63e775.png)


■2B).　データ入力方法
2B1). ｢past a recode｣をクリック
2B2). 下記画像のテキスト欄に予測するデータをカンマ区切りで記載する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/6d608a10-6c9e-abf1-7b27-131066f58b90.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/b42b744f-0053-c545-0ae8-acdd8c84cfdb.png)

2B3). ｢create predictions｣をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/5145c821-d35c-74fe-9317-97c4dd595fcb.png)

##**■7■予測結果確認**
　前項までで予測の実行まで終わりました。本稿では予測した結果がどうなっているか確認します

<<予測結果>>
結果を確認する場合は、下図の｢predictedLabel｣の値に注目します。｢predictedLabel｣が｢1｣ならば雨。｢0｣ならば雨は降っていないという予測結果になります

上記手順■2B)の方法を用いて｢2018年7月2日｣と｢2018年6月10日｣のデータを入力します
実際に入力するデータは以下の通りとなります。

```Ruby:入力データ
年月日,平均気温(℃),最低気温(℃),最高気温(℃),降水量の合計(mm),日照時間(時間),降雪量合計(cm),平均風速(m/s),最大風速(m/s),最大風速(m/s),平均湿度(％),平均蒸気圧(hPa),平均雲量(10分比),合計全天日射量(MJ/㎡),最深積雪(cm),最大瞬間風速(m/s),最大瞬間風速(m/s),最多風向(16方位),最小相対湿度(％),最低海面気圧(hPa),平均海面気圧(hPa),平均現地気圧(hPa),平均雲量(10分比)
2018/7/2,28.8,24,33.5,0,13.6,0,3.7,10.9,南,70,27.6,0,29.11,0,10.9,南,南,54,1010.9,1014,1011.3,
2018/6/10,20,22,18.6,31,0,,3,6.5,東北東,91,21.2,10,2.09,0,11,東北東,北東,76,1006.9,1009.6,1006.8
```

<<2018年7月2日>>

・気象庁データ　（AWSの予測結果では0を予測）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/5f776952-5906-b658-7f01-225626c3f573.png)

・AWS予測結果　０（雨は降っていない）
　下記の通り[predictedLabel]が0を表示しており、雨は降っていないと予測しています。

```Ruby:PredictionResults

{
    "Prediction": {
        "details": {
            "Algorithm": "SGD",
            "PredictiveModelType": "BINARY"
        },
        "predictedLabel": "0",
        "predictedScores": {
            "0": 0.011369608342647552
        }
    }
}
```

<<2018年6月10日>>

・気象庁データ　（AWSの予測結果では1を予測）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150678/3daaaac1-c4d2-490d-62ef-39f98d455b5a.png)

・AWS予測結果　１（雨は降っている）
　下記の通り[predictedLabel]が1を表示しており、雨は降ることを予測しています。

```Ruby:PredictionResults

{
    "Prediction": {
        "details": {
            "Algorithm": "SGD",
            "PredictiveModelType": "BINARY"
        },
        "predictedLabel": "1",
        "predictedScores": {
            "1": 0.9999917149543762
        }
    }
}
```

##**■8■終わり**
　いかがでしたでしょうか？今回はAWSを用いて、機械学習の一つである教師あり学習の二項分類を行ってみました。実際の予測結果は両日とも正解となっておりました。ですがこの結果は気象庁のデータが正確だったためにできた結果になります。
　機械学習の必須である[python]等の知見がなくても機械学習を使用することができるという点かなと思います。
　またクラウドでは様々な機械学習のサービスが提供されており今後より注目していく必要があるのではと感じました。
　次回は｢Azure｣での｢MachineLearning｣を行います

次回の記事　：　[機械学習（Azure）](https://qiita.com/yo_dazy/private/c4c12e394c924f108d60)

出展：気象庁HP（http://www.jma.go.jp/jma/ ）