Azure MLの勉強もかねて遊んでみました。
データの準備
機械学習って、データを用意するのがめんどくさいんですが@garicchiさんから気象庁の過去データおすすめを言われたので覗いてみました。これは確かにいい。
ということで、東京都の過去の最高気温・最低気温・平均気温を2年分くらいDLしてみました。そして以下のような感じに加工してみました。
目標は、月のデータと最高気温と最低気温から平均気温を割り出してみようという感じです。ML StudioでDATASETを選んで先ほどのファイルをアップロードします。
データの前処理
データの準備ができたのでEXPERIMENTSで新規の実験を作ります。
Saved DatasetsからMy Datasetsを開いて天気データをドロップします。そして、定型通り学習用データと評価用データに分割します。SplitをドロップしてFraction of rows in the first output data...を0.75にして75%と25%に分割します。ここで実行をしてみましょう。
Splitの左側の出力の丸をクリックしてVisualizeを押すとこんな感じでデータが分割できてるのがわかります。
さて、ここでは月と最高と最低から平均を出すといったので日付はいらないデータですね。なので天気データを分割する前に日のデータを消そうと思います。列を消すにはProject Columnsを使うので天気データとSplitの間に置きます。
Project Columnsを選択して右側のLaunch column selectorでmonth, mean, max, minを選びます。
これでもう一度RUNをしてSplitのところでVisualizeするとdateのカラムが消えてることが確認できます。こんな感じでデータの前処理は完了です。
学習させよう
さて、次は学習をさせます。アルゴリズムがいろいろ用意されてるのですが、とりあえず数値を予測するのに一番一般的なLinear Regressionを使ってみたいと思います。どのアルゴリズムを選択すべきなのかとかはチートシートを見て選ぶといいです。(日本語版がほしいところ)(月と気温が線形な関係にあるかはあやしいので向いてないかも…)
Train Modelを置いて左側のピンにLinear Regressionをつないで、右側のピンにSplitの左側のピンをつなぎます。これで75%のデータを使ってLinear Regressionを使ってトレーニングをするようになります。
Train Modelに!マークが出てるのは、予測しないといけないデータはどれかということを設定してないからになります。Train Modelを選択して右側からLaunch column selectorを選択して予測対象の列を選択します。今回は平均を予測させたいのでmeanを選びます。
RUNをしてTrain Modelの下のピンを選んでVisualizeすると結果が見て取れます。
Weightを見る限り月は誤差っぽいですね…気にしないで行きましょう。
評価してみよう
Score Modelで学習の結果と実際の結果を比べます。以下のように繋いで、Splitで分割していた25%のデータを使って学習結果がどんなもんか見てみます。
RUNしてScore Modelの下側のピンでVisualizeを選択すると以下のような結果が表示されます。Scored Labelsが予測した結果です。meanと比べると割といい感じっぽいですね。
Scored Labelsを選択すると画面右側にグラフが出ます。compare toでmeanを選択すると以下のような感じで、比較結果が視覚化されます。これを見てもいい感じに予測できてそうに見えます。
数学的にどうよ?っていうのはScore ModelをEvalute Modelとつなぐことで見ることができるようになります。
RUNをしてEvalute Modelの下のピンのVisualizeを選択すると以下のように結果が表示されます。
Mean Absolute Errorが小さいほどよくて、Root Mean Squared Errorが小さいほどよくて、Coefficient of Determinationが1に近いほどいいらしいです。アルゴリズムを差し替えたり、パラメータを調整してよさげな感じになるまで試行錯誤するのが本来っぽいですね。
Webサービス化
まぁ、今回はお遊びということでこのままWebサービスにしてしまいましょう。SET UP WEB SERVICEのPredictive Web Service [Recommended]を選んでいい感じにしてもらいます。
Web service inputがWebサービスのインプットになってWeb service outputがアウトプットになります(そのまんまですね) さて、今回はWeb service inputとして月、最大、最小があればいいです。Score Modelの右側にWeb service inputをつないでProject columnsでmonth, min, maxを選びます。
そして、出力は予測値だけでいいのでScore ModelとWeb service outputの間にProject columnsを入れてScored Labelsを選びます。
RUNをしてエラーが出ないことを確認します。そしてDEPLOY WEZB SERVICEを選ぶとWebサービスになります。
テスト
Webサービスの画面ではTestボタンがあってテストが可能になってます。
また、ExcelのワークブックもDownloadできて、そこでもテストが可能になってます。
REQUEST/RESPONSEのリンクをクリックすると、C#、Python、RでのWebAPIの呼び出し方の書いてあるページに行くことができます。 これで自前アプリから作成した機械学習を呼び出すことができるようになります。
まとめ
数学勉強しなきゃ…。
追記
月のデータはJanuary~Decemberまでの数値じゃないデータにしたほうがそれっぽくなりました。