はじめに

最近、AWS のイベントの JAWS Days や AWS SUMMIT に参加しましたが、Amazon Machine Learning が面白そうだったので試してみたいと思います。 Amazon Machine Learning は「複雑な機械学習アルゴリズムおよびテクノロジーを学習する必要なく」簡単に機械学習サービスを利用することができます。

機械学習については、いろいろなサイトで紹介されているのでここでは記述しません。

Amazon Machine Learning でできること

Amazon Machine Learning は、「教師あり学習( Supervised learning )」と呼ばれる機械学習をすることができ、以下の分析を行うことができます。

  • Binary Classification(二項分類)
    • 2つのうちどちらになるか予測
  • Multiclass Classification(多クラス分類)
    • 複数のうちどれになるか予測
  • Regression(回帰分析)
    • 数値を予測

教師あり学習とは、「事前に与えられたデータをいわば『例題(=先生からの助言)』とみなして、それをガイドに学習(=データへの何らかのフィッティング)を行う」ことです。

また、作成した分析・分類モデルは以下の使い方ができます。 利用するシステムや使用用途と料金を考慮して、どちらを使用するか選択すると良いと思います。

  • バッチ
    • 事前に大量のデータを解析・予測する場合に使用
  • リアルタイム API
    • リアルタイム予測する場合に使用

Amazon Machine Learning の流れ

Amazon Machine Learning は以下の流れになります。

  1. 何を機械学習させるか考える
  2. 与えるデータ(例題)とそれから求められる結果(答え)となるデータを用意
  3. 用意したデータを S3 または Redshift に保存( CLI なら RDS も可)
  4. データを入力し機械学習させ分析モデルを作成
  5. 分析モデルを調整 & 評価
  6. 求める結果がでなければ 2 もしくは 4 に戻る
  7. 分析モデルを利用

為替で一攫千金!

では、実際に Amazon Machine Learning を使って何か予測してみたいと思います。

天気予報などすでに公開されてるものを予測しても面白くないので、今回は思い切ってお金を儲けるために為替の予測をしてみたいと思います。

為替での儲け方はいろいろありますが、前日終値を基準として当日の終値が上げて終わるか下げて終わるかが分かれば、その日の開始時に予測する方向に買いか売りポジションを持てば寝ていても儲かるのでは?と考えました。この戦略を Amazon Machine Learning で機械学習してみます。

データの用意

最初に機械学習をさせるデータを用意します。 値が上がるか下がるかを予測するのにどのようなデータがあればよいか考えましょう。 テクニカル(チャート)的に上げ下げには直近数日間の動きが関係していそうと考え以下の値を用意してみます。

フィールド
3 日前の 2 日移動平均と 4 日前の 2 日移動平均を
比べて上げたか下げたか
同じか上げなら 1、
下げなら 0
2 日前の 2 日移動平均と 3 日前の 2 日移動平均を
比べて上げたか下げたか
同じか上げなら 1、
下げなら 0
1 日前の 2 日移動平均と 2 日前の 2 日移動平均を
比べて上げたか下げたか
同じか上げなら 1、
下げなら 0

学習させるデータには例題(ソースデータ)に対する答え(結果)も必要なのでそれを加えてCSVデータを以下のような項目で作成します。

フィールド
3 日前の 2 日移動平均と 4 日前の 2 日移動平均を
比べて上げたか下げたか
同じか上げなら 1、
下げなら 0
2 日前の 2 日移動平均と 3 日前の 2 日移動平均を
比べて上げたか下げたか
同じか上げなら 1、
下げなら 0
1 日前の 2 日移動平均と 2 日前の 2 日移動平均を
比べて上げたか下げたか
同じか上げなら 1、
下げなら 0
前日とくらべて上げたか・下げたか 同じか上げなら1、
下げなら0

今回は 2014 年 6 月 ~ 2016 年 5 月の豪ドル円のデータを使用します。 Amazon Machine Learning は S3 か Redshift か RDS からデータソースを読み込むことができますので CSV ファイルを今回は S3 に保存します。

image

開始

データソース作成、ML modle 作成、予測を一括で行うため、画面の「Create new…」ボタンから「Datasource and ML model」を選択します。

image

データ入力

1. Input Data

次は、データソースを入力します。

データソースを S3 に保存したので、「Where is your data?」で「S3」を選択し、「S3 location」でS3に保存したCSVファイルを指定します。

image

2. Schema

次は「Input Data」で指定したデータソースのデータ型の指定です。

自動的に型が選択されますので特に変更は必要がないと思いますが、間違った型選択されている場合は変更します。 特に、今回予測する「前日とくらべて上げたか・下げたか」の項目の型は、Binary Classification での予測を想定していますので Binary となっていることを確認して下さい。

image

3. Target

次は、予測する項目の指定します。

「前日とくらべて上げたか・下げたか」の項目を選びます。

image

4. 確認

最後に確認して Continue します。

機械学習モデルの作成

1. ML model setting

モデルの調整します。

「ML model type」はデータソースで予測する項目で選択した値から自動でモデルタイプが決定しています。 Recipe で作成するモデルを調整することができますが今回は Default のセッティングで進めます。

image

2. 確認

入力データとモデルのセッティングを確認して問題なければ「Finish」します。

image

これで入力データ、モデル、評価が作成されます。 作成されるまで少し時間がかかりますので待ちましょう。

image

評価

AUC ( the Area Under a Curve ) でモデルの評価ができますので確認します。 AUC は 0 から 1 の値で、一般的に 1 に近づくほど精度がよくなり、0.5 だとコイントスで裏表が出る度の精度(適当に選んだ程度)になります。

さて作成されたモデルの評価はどのような結果が出たでしょうか。

image

うーん、AUC = 0.59 なので全く良い結果ではありませんでした・・・。

検証してみる

本来ここで、利用するのに耐えられるモデルにするために、ソースデータやパラメータ調整をしてモデルの精度を高めるのですが、今回は記事の都合上割愛しこのまま検証してみます。

使い方としてバッチとリアルタイム API がありますが、日毎の為替の上げ下げの予想ですのでバッチで処理します。 ソースデータと同じ項目のデータを用意し、「Batch predicion」から実行します。

image

1. モデル選択

image

2. 検証したいデータの入力

最初に入力したデータソースの 30 %( 230 レコード )が検証データとして残されていますのでそれを使用します。

image

3. 検証結果の保存先

S3 の好きなパスを検証結果の保存先に指定します。

image

4. 検証完了

少し待つと検証結果が保存されます。

image

結果とまとめ

検証結果を集計すると以下の結果となりました。

検証総数 正解 不正解
230 (100% ) 130 (56.5% ) 100 (43.5%)

ランダム(おそらく正解率 50 % )に売買するよりは56.5%という少し良い正解率が出ていますが、この数値では実運用に耐えられそうにありません。予想はしていましたが残念な結果です・・・。為替を予測して一攫千金を夢見ていましたがまだまだ道半ばのようです・・・。

ただ、手軽に機械学習に利用できるのは可能性を感じます。 機会があれば、モデル作成時のパラメータを調整したり入力するデータを改良して高い評価が出るモデルの作成に挑戦したいと思います。