ML.NETドキュメントリーディング#2

#1.概要
ML.NETのモデルビルダーの使い方を解説します。
前回の続きになります。

[ML.NETドキュメントリーディング#1](https://qiita.com/sunnyyone/items/14900f3f8e1aba14d854)

【動作環境】

+ Windows 10 Home(1903)
+ VisualStudio2019 v16.5.2
+ .NetCore v2.2, v3.1
+ ML.NET Model Builder(Preview) v16.0.2003.302

【事前準備】
[ModelBuilderのインストール方法](https://docs.microsoft.com/ja-jp/dotnet/machine-learning/how-to-guides/install-model-builder)からモデルビルダーをインストールする

#2.モデルビルダーとは
統計データを準備し、予測したい項目を指定するだけで、最適なアルゴリズムとソースコードが自動で生成できるツールです。

生成されたソースコードはML.NETが提供する基本的な機能を網羅しており、モデルの生成からデータの予測までの一連の流れを実行することができます。
以下は、ML.NETでのワークフローになります。


<img width="550" alt="ワークフロー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/77dcd5cf-7847-927a-d0fb-c5babfb45b3b.png">
※[ML.NETのワークフロー](https://docs.microsoft.com/ja-jp/dotnet/machine-learning/how-does-mldotnet-work)より


上の図では「データの読み込み」→「パイプラインの作成(アルゴリズム指定)」→「学習」→「評価」の順に処理されます。
「学習」の結果はZIPファイルで学習モデルが保存され、下の図では学習モデルを展開し予測が行われます。

#3.統計データの準備
モデルビルダーでソースを作る前にデータを準備しておきます。
[データの読み込み方法](https://docs.microsoft.com/ja-jp/dotnet/machine-learning/how-to-guides/load-data-ml-net)のところに適当なCSVデータがありますので、とってきてデータを足します。
2レコードだけのデータではデータ量が少なく、モデルビルダーでエラーとなるためデータを足しています。
以下のデータを任意の場所に「data.csv」で保存してください。

```csv:統計データCSV(data.csv)
Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
700, 100000, 3000000, 250000, 500000
1000, 600000, 400000, 650000, 700000
1200, 700000, 300000, 700000, 800000
1400, 800000, 200000, 750000, 900000
1600, 900000, 100000, 800000, 1000000
1600, 1000000, 200000, 900000, 1100000
1600, 1000000, 200000, 900000, 1100000

```

■データの説明
5カラムあり、そのうち「Current Price」が今回予測したいデータとしています。
「Current Price」以外は入力データとし、データは適当な値になります。
シナリオとしては、以下のINデータからOUTデータを予測する統計的な回帰を行います。($は省略)

IN：Size, HistoricalPrice1, HistoricalPrice2, HistoricalPrice3
OUT：Current Price


#4.モデルビルダーの作成
モデルビルダーでデータを取り込み、ソースコードを作成する手順を説明していきます。
コンソールアプリ上で実装する場合を想定します。

1. VisualStudio2019を起動し、新しいプロジェクトからコンソールアプリを作成する。
![手順1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/1d813666-bf9f-b223-4451-5e681c02f456.png)
![手順2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/89806acf-ddc2-733d-c1e4-d971dede5269.png)
![手順3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/5e248d6c-7368-27d1-4f89-b15520e38bae.png)


2. 作成した「MLNetSample1」プロジェクトに「Machine Learning」を追加する。
![手順4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/d12d821e-040f-08dc-cdd2-f2986b70fe94.png)


3. ML.NET Model BuilderのWizerdから「Price Prediction」シナリオを選択する。
![手順5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/219ccf26-0188-328c-7ae0-25297dd4faca.png)


4. 作成したCSVファイル(data.csv)を指定し、Labelに「Current Price」を設定する。
![手順6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/d07a58d9-3c45-75e6-3e5d-137815cc23dc.png)


5. 「Train」ボタンを押す。
![手順7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/f475f231-79a3-5476-85d1-52d5c374e7d5.png)


6. 学習時間を「10」から「20」に変更し、「Start Train」ボタンを押す。
![手順8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/dee7330c-41cd-b382-3cf2-a1a55a571696.png)
↓
![手順9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/3e201429-fd54-7e40-e97e-0e0c349060e6.png)

7. 成功すると「Evalueate」ボタンが表示される。「Evalueate」ボタンを押す。
![手順10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/4ac16c1d-844b-27e9-694e-0e031457ba2a.png)

8. 「Details」タブを押す。アルゴリズムのランキングが表示される。
　内容を確認して「CODE」ボタンを押す。※「Overview」タブの「OCDE」ボタンでも可。
![手順11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/41ad2021-6853-ab41-006a-0337b4f0e621.png)
↓
![手順12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/ca2d4655-3ade-06d5-febf-74b17fdb00c9.png)

9. 「Add Projects」ボタンを押す。
![手順13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/f343cfe6-0b9a-98f2-0fe5-57d9e74f1ee5.png)
↓
![手順14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/169441c5-1ba6-9788-8e70-60880d151a40.png)


#5 アプリ起動
二つのプロジェクトが追加されました。

+ MLNetSample1ML.ConsoleApp
+ MLNetSample1ML.Model

「MLNetSample1ML.ConsoleApp」は所定のワークフローを実行する手順が記述されています。
「MLNetSample1ML.Model」は読み込んだ「data.csv」のデータ構造が記述されています。

「MLNetSample1ML.ConsoleApp」プロジェクトのMain関数を外部から関数コールできるようpublicに変更し、作成した「MLNetSample1」プロジェクトからMain関数をコールすれば起動できるようになります。

![手順15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/e28efb00-842c-a8bb-37dd-01788971ffbd.png)

↓
![手順17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/788bcaba-12dd-043c-2740-d2489b41abde.png)

↓
![手順18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/e6dd1c61-1271-efa6-5df3-caba08383652.png)

↓
![手順16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/570bec43-d62d-69a5-69b4-17cba7a1a684.png)
↓
![手順19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263183/019eb87f-8ec9-2bda-a5e4-273a1fd267cf.png)

Predicted Current_Priceの箇所が予測結果のデータです。
結果はNaNが返ってきていますが、データ量が増やせば正しい予測値が返ってくると思います。


#6 まとめ
モデルビルダーを使い、ソースコードを自動で生成する方法をみてきました。

今回のシナリオは回帰データを予測する場合のソースコードを作成しましたが、分類や推薦といった他のシナリオも存在します。
データさえ整備すれば、データの予測や分類、検知などを行う処理が作れるので一度試してみてはどうでしょうか？

続く
[ML.NETドキュメントリーディング#3](https://qiita.com/sunnyyone/items/4bed6f986ca36c5aa86c)