8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

日本情報クリエイト Engineer'sAdvent Calendar 2017

Day 1

Azure Machine Learning Studio で時系列データ予測してみた

Last updated at Posted at 2017-12-01

これは 日本情報クリエイト Engineer's Advent Calendar 2017 の1日目の記事です。

Merry Christmas! 🎅

はじめに

目的

複雑な話は無しにして、
Microsoft Azure Machine Learning Studio(以下、ML Studio)を一通り

  • 学習・テストデータ作成
  • 学習フローの作成
  • 学習
  • 予測
  • 学習モデルの性能評価
  • 予測データの利用

体験すること。

きっかけ

ML Studio を知ったのはつい最近のことです。
チュートリアルや他の方が書かれた記事を読み、こう感じました。
「なんだこれ、楽しそう!」

嗚呼、使ってみたい

ML系のサービスを試したいときに困るのが、大量の学習データの用意です。
Web上のどこからか引っ張ってきたり、予め用意されている サンプルデータ を使用したり。
いろいろ方法はありますが、やっぱり自分でデータを作って弄って試してみたい。と思うものです。

何をするのか①

そこで今回は、例えば株価のような時系列データを手元で生成し、
それを ML Studio に食べさせてみたいと思います。
言わずもがな、時系列データは、画像や文章に比べて圧倒的に生成しやすいです。
如何ようにもできちゃいます。
今回は手軽さを重視して、そんな時系列データを対象にしました。

何をするのか②

詳しく後述しますが、10000個の値を持つ時系列データを用意します。
10000日分の株価だと思ってもらえれば、想像に易いかと思います。
そして、**「今日を含む過去20日間の株価から、翌日の株価を予測する」**ことにします。
例えば、「1~20日目の株価を見て、21日目の株価を予測する」という感じです。

おことわり

ML Studio を一通り使ってみることに重きを置いた記事です。
そのため、データ生成や疑似トレードのソースコードは割愛しています。
やっていることは非常に簡単ですので、お好きなプログラム言語1で再現できるはずです。
本質的な部分は、文章で説明しています。

また、筆者は実際の株トレードなどに関してはズブの素人ですので、
言葉の使い方など誤りがあるかもしれません。
それぞれの単語に、深い意味や厳密性は持たせていませんので、ご了承ください。
イメージだけ伝わればOKです。

時系列データの準備

学習・テストに使用する時系列データは、
振幅と周期をランダムに変化させた正弦波に、ノイズを加えたものとします。
今回は実験なので確率的に異なるものを、手元でいくらでもサンプリングできるようにしておきます。

10000個の値からなる時系列データを、学習用・テスト用の2種類用意しました。

  • 学習データ
    training.png

  • テストデータ
    test.png

上の2種類のデータは、同じ生成モデルからサンプリングしているので、
値は違えど似たような特徴を有しているはずです。

ML Studio に渡す学習・テストデータは、このグラフのような値そのままでありません。
先述のとおり、
過去20日分+予測したい1日分 = 21個の値 を1行として、
1日目から9980日目まで1日ずつシフトして切り取った9980行のCSVデータ2を用います。

ML Studio を使用した時系列データの学習

では、前準備ができましたので、いよいよ ML Studio を触っていきましょう。
Azure のサブスクリプションは準備できている前提とします。

Machine Learning Studio ワークスペースの作成

素直に追加します。名前も一旦は適当で。
実験用なので、価格・プランも一番低廉なもので問題ありません。

プラン、ワークスペース、ストレージの3つが作成されています。
今回は、ワークスペースのみ使用します。

ML Studio の起動

作成したワークスペースを開くと、次のような画面が出てきます。
**「Machine Learning Studio の起動」**をクリックすると、文字通り、起動します。
分かりやすいですね。
screencapture-portal-azure-1512051863124.png

今回は0から実験したいので、「Blank Experiment」を追加しましょう。
screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512052377293.png

お、なんだか楽しそうな画面が出てきましたね!わくわくします。
screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512052402483.png

データセットの追加

先ほど作成した時系列データを ML Studio 上では、データセットという概念として扱います。
データセットに、学習データ、テストデータを追加してみましょう。
CSVファイルをアップロードするだけです。簡単ですね。
screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512053351367.png

学習フローの定義

まずは、何より学習データをセット

先ほど追加したデータセットを、ドラッグ&ドロップで配置します。
GUIでできちゃうなんて素敵。

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512053479332.png

データセットの中身を確認することもできます。
ちゃんと、col0, col1, col2... のデータがあるようです。

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512054153370.png

あれっ!!??
過去20日分のデータをもとに、翌日1日分の値を予測するので、
カラムは col0 ~ col20 までの21列になるはずが…。
プログラムのミスで、col21 という空カラムができてしまっているようです…!

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512054127037.png

必要なデータを選ぶ

データセットの中に、不要なデータが混じるケースは往々にしてあります。
そんなときは慌てずに、モジュール**「Select Columns in Dataset」**を使いましょう。
データセット「training.csv」を「Select Columns in Dataset」に流し込みます。

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512054220169.png

モジュールを選択すると、画面右部の Properties からそのモジュールの詳細を設定できます。
モジュール「Select Columns in Dataset」では、学習に使用するカラムを指定できます。

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512054244585.png

これで、学習に必要なデータの整備ができました。

学習フェーズの定義

さて、いよいよ学習モジュールの追加です。といっても、呆気ないほど簡単です。
学習を行うモジュール**「Train Model」**を追加し、学習に使用するアルゴリズムを他モジュールから入力する形で指定します。
アルゴリズムも多数用意されていますが、今回は何も考えずに Linear Regression(線形回帰)を使ってみましょう。3

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512054516002.png

「Train Model」で、予測したい値(カラム)を指定します。
ここでは、21日目の値を予測したいので、21列目(col20)がこれに該当します。

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512054605485.png

予測フェーズの定義

モジュール「Train Model」で学習したモデルを使用して、未知のデータを予測してみましょう。
予測にはモジュール**「Score Model」**を使用します。
予測に使用するモデルを「Train Model」から入力し、
予測したい未知のデータをデータセット「test.csv」から入力します。

予測後、「どれくらい上手に予測できたのか」を評価したいので、
モジュール**「Evaluate Model」**に「Score Model」の出力を渡しておきます。

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512055603385.png

さあ、学習&予測を走らせよう!

画面下部の**「Run」**をクリックします。え?これだけ? …これだけです。
学習フローの上から順に実行されていきます。完了したモジュールに付くグリーンのチェックがかっこいい。
学習データのサイズは 9980行×21列 でしたが、数秒でフローが完了しました。速い。

実は、1つ前の画像が、処理を走らせた直後の様子でした。

予測がどれくらいうまくいったのか、**「Evaluate Model」**を可視化してみましょう。

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512055633170.png

Error Histgram が視覚的に分かりやすいですね。
Error(誤差)が 0.0000047 以下のデータが再瀕ですね。
これは期待できます。

予測したデータを使用して、疑似トレード(シミュレーション)を行いたいので、
モジュール「Score Model」の結果をCSVファイルに出力してみましょう。

**「Convert to CSV」**という分かりやすい名前のモジュールがあるので、これに「Score Model」の結果をびよーんと流し込みます。
あとは、「Convert to CSV」を右クリック → Download でCSVファイルを取得できます。

screencapture-japaneast-studio-azureml-net-Home-ViewWorkspaceCached-4f33ac9b949f407e88afba9e0f1d3db0-1512055048830.png

AIトレーダー vs 無垢トレーダー

テストデータを対象に、トレードをシミュレートしてみましょう。
ルールは簡単です。

  • 翌日の値が「上がる」と予測したら今日「買う」
  • 儲け = 実際の翌日の値 - 買った時の値
  • 儲けを最大化したい

2名のトレーダーに戦略を与えて、トレードしてもらいましょう。
9980回の長丁場です!がんばって!!

AIトレーダー

戦略

ML Studio で学習して得られた、予測データに従う。
予測データから、今日の値 < 翌日の値 と分かれば買う。

結果

  • 勝率:71.91%
  • 儲け:+2740.34

無垢トレーダー

戦略

翌日の値が上がるかどうかを $ \frac{1}{2} $ の確率でランダムに決める。神頼み戦法。
丁と出れば買うし、半と出れば買わない。

結果

  • 勝率:49.50%
  • 儲け:-0.69

まとめと感想

これまで、機械学習の数理的背景ばかりを追っていたので、
最新のMLサービスの使い勝手の簡単さには目からウロコでした。
まだ、GUIで操作する部分にしか触れていません。これだけでも十分に遊べると思いますが、
自分でコードを書いてより柔軟なモデルを作成することもできるようです。
ちょっとずつ掘ってみたいですね。

そして、言葉は悪いですが、すごく適当に何も考えずに構成した学習フローでしたが、
AIトレーダーの結果を見て分かる通り、予測データを用いると有意に高い勝率を叩き出しています。

現実世界のトレードでも、全く同じ手法が通用するかと問われれば、それは否です。
実際は、背後にさまざまな要因を隠した時系列データであるためです。
今回使用したデータは、ただ正弦波にノイズを加えた程度の簡単なデータであることをご留意ください。

ただ、MLは正弦波の上がり下がりのパターンや、ノイズの特徴を何かしら見つけたのだと考えます。
それが、勝率 71.91% という結果に現れています。

学習データさえ用意できれば、数分で学習と予測ができてしまいます。
この手軽さを少しでも感じていただけたなら、
Advent Calendar 1日目の記事としてお役目を果たせたと思います。
ぜひ皆さんも、遊んでみてください。ではでは。

  1. 筆者は Python 2.7系で実装しました。関数分割しても100行未満に収まる程度のボリュームです。

  2. 9980行のCSVデータ … あとで気づいたプログラムのミスです。10001日目が無いので9980行目は不正なデータです。記事中では頑なに9980という数字を使用しますが、ご容赦を…。

  3. 本来は、適切なアルゴリズムを志ん朝に選ばなければなりません。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?