【Microsoft Azure】Azure Machine Learningで電力予測

# Azure Machine Learningとは
Azureが提供する、クラウド上でモデルを構築、学習、デプロイできるサービスです。
詳しい説明は[こちら](https://azure.microsoft.com/ja-jp/services/machine-learning/)

# 1. データの用意
### 気象データ
まずは、天気の情報を[気象庁のデータ](https://www.data.jma.go.jp/gmd/risk/obsdl/index.php#)から拝借します。
選択項目は2018年1月1日から現在までの日別を、ダウンロードの容量制限をこえない程度に項目を指定して(機械学習に使用する項目は後で変更できます)csv形式でダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/b8bc91fb-f6ca-ce32-8194-9f5835f0c5e7.png)
### 電力需要データ
次に、[でんき予報](https://www.tepco.co.jp/forecast/index-j.html)の過去の電力使用実績データから同様に3年分のデータをダウンロードします。
でんき予報のデータを確認すると画像のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/9be0d3bf-d09d-cb07-6df1-9b07c3158c92.png)
時間ごとの使用量になっていますが、今回はピーク時の需要量を予測します。そのため14:00のデータだけを抽出します。(気象データも時間ごとのデータを提供するため、時間単位で予測できますが今回は省略)
### データ整形
せっかくなので、Windowsのコマンドプロンプトを使ってサクッとデータを抽出しましょう。
csvがあるフォルダのアドレス部分にcmdと書いて、コマンドプロンプトを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/57c7cf45-57e3-3403-b53e-07edfb8f3b9b.png)

```
find "14:00" juyo-2018.csv
```
と入力すると、こんな感じで14:00が入った行だけ抽出されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/599419cd-2730-2859-f643-7590f01d3231.png)
それではjuyo-2018.csvとjuyo-2018.csvとjuyo-2018.csvをまとめてjuyo.csvというファイルを作ります。
```
type juyo-*.csv | find "14:00" > juyo.csv
```
type juyo-*.csvでファイル名にjuyo-を含むファイルを結合し、 | で find に出力結果を引き継いで、> juyo.csvでファイルに出力しています。

Excelで気象データであるdata.csvを開いて、電力需要量という属性を新しく追加して、juyo.csvの需要の列をコピペしましょう。適当にdata.csvを整形して、保存します。
こんな感じになりました。属性は英字にしておきましょう。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/9b8ac32b-6607-c968-0b4e-2549a0d1e36d.png)



# 2. Machine Learning Studioを作成(AzurePortalでの作業)
1. [ポータル](portal.azure.com)にアクセスし、上の検索窓にMachine Learning Studioと入力してでてきたMarketplaceのMachine Learning Studioワークスペースをクリック。出てきた画面で「Machine Learning Studioワークスペース」をクリック  
2. 必要な項目を入力して[作成]。価格レベルはDevTest Standardだと無料。それ以外だと有料になります。**Azure for Studentsの場合、有料のプランにして放置していると、クレジット切れによるアカウント無効化に陥るので注意**。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/19e2c623-4590-d712-c15e-1b2748654baa.png)
3. デプロイが完了したら、リソースに移動し、「Machine Learning Studioを起動する」をクリックし、次の手順へ。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/5e74ce55-ce73-0b13-238f-27ce7a773ffe.png)


# 3. 機械学習
1. Machine Learning Studioのポータルへ移動したら「SIGN IN」というボタンを押して、Projectsの画面へ。特にパスワードなどは聞かれませんでした。
2. [Datasets]->[+New]->[New Local File]とおし、先ほどのdata.csvをアップロード
3. [Experiments]->[+New]->[Blank Experiment]とおし、以下の画面を出す。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/76a1a5a6-87ad-f2d0-94bb-3a98f4bcbfec.png)
4. 機械学習の手順通り、ブロックを置いていきます。僕は画像のようにおきました。プログラミング一切なしで学習できるのはすごく手軽に感じますね。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/54af80fb-a359-6bd7-a5c4-7231d381b4be.png)
5. Selector Columns in Datasetを選択し、Launch column selectorで使う属性だけセレクト。今回は全突っ込み。**注意：csvの1行目の属性を日本語で書くと認識してくれないので英字にしておきましょう。**
6. Tune Model Hyperparametersは電力を選択。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/e9948c1d-2a18-38b7-ed67-6962b7181962.png)
7. [SAVE]した後[RUN]。待ちましょう。
8. チェックマークがついたら学習完了。Evaluate ModelをScore Modelの下にくっつけて、[RUN]->[Run selected]をクリック。評価してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/9ee79372-73bb-d33b-3a42-0dea2039e9d7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/8e4d1c73-17a6-9c20-b4ea-80db6c2a6790.png)

大体平均より300MkWくらいずれてるっぽい。微妙ですね。
使う属性を変えたり、Split Dataで訓練データとテストデータの割合を7:3にしたり、ハイパラをグリッドサーチしてみたりして再学習(12分くらいかかった)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/10df5780-5ddc-f443-25e3-b46dd746b7fd.png)
ちょっと下がったけど、そうでもない。データ数は約2年半分なので、根気よくもっと集めるべきですね。

# 4. アプリを作る
1. まずはサービスとして公開してみます。[SET UP WEB SERVICE]からPredictive Web Service [Recommended]をクリック  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/6b6b0dc5-ca5f-170c-b1c7-fc3cb7fa7fae.png)
2. [RUN]をクリックして実行後、[DEPLOY WEB SERVICE(Classic)]をクリック  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/602f3f73-1519-be88-b912-a6017e0ba9c5.png)
3. APIキーをメモ  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/b52b75af-e6dc-891b-1ed3-e324697546d5.png)
4. 上の画像のREQUEST/RESPONEをクリックし、SAMPLE CODEをクリック。コードをコピー  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/f7d05c3a-3c89-9eb3-c0b4-d9fb35d15902.png)
5. Visual Studioを開いて、File->New->Projectとクリックし、新しいプロジェクトを作成します。Visual C#の中にある**Console App (.NET Framework)**を選択。
6. コードをペースト
7. apikeyを"abc123"からメモした値に変更
8. 82行目にConsole.ReadKey();を挿入。結果を表示し続けるため。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/076e5442-10d2-e4e1-2202-a03d3fa9bead.png)

9. nuGetマネージャーを開き、Microsoft.AspNet.WebApi.Clientをインストール  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/ce7b4214-677a-1bbf-2243-157f76383f2f.png)

10. 44行目に、今日の気象データを入力して結果を見るとこんな感じ。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/b194bb73-92e4-7c4d-8718-62dcd3182776.png)
3969らしいですが、実際のピークはというと、  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/e6e95901-a3ff-6c8d-0816-8de19835ac3a.png)
めっちゃずれてましたね。天気のデータが細かすぎたこと、データが少ないこと、過学習してしまった可能性などが誤差の原因と考えられます。皆さんも電力予測チャレンジがんばってみてください。