かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Azure MLで平均気温を予測してみた #azurejp #jazug

Azure MLの勉強もかねて遊んでみました。

データの準備

機械学習って、データを用意するのがめんどくさいんですが@garicchiさんから気象庁の過去データおすすめを言われたので覗いてみました。これは確かにいい。

www.data.jma.go.jp

ということで、東京都の過去の最高気温・最低気温・平均気温を2年分くらいDLしてみました。そして以下のような感じに加工してみました。

f:id:okazuki:20151008151536p:plain

目標は、月のデータと最高気温と最低気温から平均気温を割り出してみようという感じです。ML StudioでDATASETを選んで先ほどのファイルをアップロードします。

f:id:okazuki:20151008152058p:plain

データの前処理

データの準備ができたのでEXPERIMENTSで新規の実験を作ります。

Saved DatasetsからMy Datasetsを開いて天気データをドロップします。そして、定型通り学習用データと評価用データに分割します。SplitをドロップしてFraction of rows in the first output data...を0.75にして75%と25%に分割します。ここで実行をしてみましょう。

Splitの左側の出力の丸をクリックしてVisualizeを押すとこんな感じでデータが分割できてるのがわかります。

f:id:okazuki:20151008152435p:plain

さて、ここでは月と最高と最低から平均を出すといったので日付はいらないデータですね。なので天気データを分割する前に日のデータを消そうと思います。列を消すにはProject Columnsを使うので天気データとSplitの間に置きます。

f:id:okazuki:20151008152740p:plain

Project Columnsを選択して右側のLaunch column selectorでmonth, mean, max, minを選びます。

f:id:okazuki:20151008152844p:plain

これでもう一度RUNをしてSplitのところでVisualizeするとdateのカラムが消えてることが確認できます。こんな感じでデータの前処理は完了です。

学習させよう

さて、次は学習をさせます。アルゴリズムがいろいろ用意されてるのですが、とりあえず数値を予測するのに一番一般的なLinear Regressionを使ってみたいと思います。どのアルゴリズムを選択すべきなのかとかはチートシートを見て選ぶといいです。(日本語版がほしいところ)(月と気温が線形な関係にあるかはあやしいので向いてないかも…)

azure.microsoft.com

Train Modelを置いて左側のピンにLinear Regressionをつないで、右側のピンにSplitの左側のピンをつなぎます。これで75%のデータを使ってLinear Regressionを使ってトレーニングをするようになります。

f:id:okazuki:20151008153417p:plain

Train Modelに!マークが出てるのは、予測しないといけないデータはどれかということを設定してないからになります。Train Modelを選択して右側からLaunch column selectorを選択して予測対象の列を選択します。今回は平均を予測させたいのでmeanを選びます。

f:id:okazuki:20151008153557p:plain

RUNをしてTrain Modelの下のピンを選んでVisualizeすると結果が見て取れます。

f:id:okazuki:20151008153739p:plain

Weightを見る限り月は誤差っぽいですね…気にしないで行きましょう。

評価してみよう

Score Modelで学習の結果と実際の結果を比べます。以下のように繋いで、Splitで分割していた25%のデータを使って学習結果がどんなもんか見てみます。

f:id:okazuki:20151008154031p:plain

RUNしてScore Modelの下側のピンでVisualizeを選択すると以下のような結果が表示されます。Scored Labelsが予測した結果です。meanと比べると割といい感じっぽいですね。

f:id:okazuki:20151008154146p:plain

Scored Labelsを選択すると画面右側にグラフが出ます。compare toでmeanを選択すると以下のような感じで、比較結果が視覚化されます。これを見てもいい感じに予測できてそうに見えます。

f:id:okazuki:20151008154310p:plain

数学的にどうよ?っていうのはScore ModelをEvalute Modelとつなぐことで見ることができるようになります。

f:id:okazuki:20151008154431p:plain

RUNをしてEvalute Modelの下のピンのVisualizeを選択すると以下のように結果が表示されます。

f:id:okazuki:20151008154532p:plain

Mean Absolute Errorが小さいほどよくて、Root Mean Squared Errorが小さいほどよくて、Coefficient of Determinationが1に近いほどいいらしいです。アルゴリズムを差し替えたり、パラメータを調整してよさげな感じになるまで試行錯誤するのが本来っぽいですね。

Webサービス化

まぁ、今回はお遊びということでこのままWebサービスにしてしまいましょう。SET UP WEB SERVICEのPredictive Web Service [Recommended]を選んでいい感じにしてもらいます。

f:id:okazuki:20151008155420p:plain

Web service inputがWebサービスのインプットになってWeb service outputがアウトプットになります(そのまんまですね) さて、今回はWeb service inputとして月、最大、最小があればいいです。Score Modelの右側にWeb service inputをつないでProject columnsでmonth, min, maxを選びます。

f:id:okazuki:20151008155730p:plain

f:id:okazuki:20151008155808p:plain

そして、出力は予測値だけでいいのでScore ModelとWeb service outputの間にProject columnsを入れてScored Labelsを選びます。

f:id:okazuki:20151008155932p:plain

RUNをしてエラーが出ないことを確認します。そしてDEPLOY WEZB SERVICEを選ぶとWebサービスになります。

テスト

Webサービスの画面ではTestボタンがあってテストが可能になってます。

f:id:okazuki:20151008160140p:plain

また、ExcelのワークブックもDownloadできて、そこでもテストが可能になってます。

f:id:okazuki:20151008160317p:plain

REQUEST/RESPONSEのリンクをクリックすると、C#、Python、RでのWebAPIの呼び出し方の書いてあるページに行くことができます。 これで自前アプリから作成した機械学習を呼び出すことができるようになります。

まとめ

数学勉強しなきゃ…。

追記

月のデータはJanuary~Decemberまでの数値じゃないデータにしたほうがそれっぽくなりました。