最終更新:2017年7月26日

機械学習法を用いた時系列データの予測方法について説明します。
R言語を使えば、機械学習も時系列データのデータ操作も簡単にできます。
両者を組み合わせて、時系列データへの予測モデルを作成してみました。

ソースコードはこちらに置いてあります。



スポンサードリンク

目次

  1. 解析の準備
    • 機械学習とは
    • 今回予測するデータ
    • caretパッケージを使う準備
  2. Rによる機械学習
    • 予測モデルの概要
    • ハイパーパラメタのチューニング
  3. 機械学習による時系列予測
    • 最適な次数を選ぶ
    • 当てはめ精度の評価
    • 将来の予測

 

1.解析の準備

機械学習とは

機械学習とは、次にどのようなデータが来るのかを、決まった手順を踏んで予測する技術、あるいは手法のことです。
機械学習の良いところは、予測のための「手順」を、過去のデータからほとんど自動で見つけられることです。

昔は人間が勘と経験そして度胸で予測を出していました。
もちろん、優秀な予測者が会社を辞めてしまえば、もう予測はできなくなります。
少しIT技術が発展したころには、エキスパートシステムなどといって「気温が高くて晴れていればビールが良く売れる」といったルールを人間が考えて、そのルールに従って予測を出していました。
しかし、このやり方だととても細かくルールを設定しなければなりませんし、ルールを設定し忘れてしまうと、変な予測結果が出てしまいます。

機械学習では、予測のためのルールを、文字通り「機械が学習」してくれます。
人間がいちいちルールを指定してやる必要はありません。

詳しくは『機械学習とは何か』を参照してください。

今回予測するデータ

機械学習といえば「気温を使ってビールの売上を予測する」といったように、色々なデータを組み合わせて予測した計算例が多いかと思います。
しかし、今回予測するデータは時系列データです。

今回は毎月の飛行機乗客数のデータを使います。
この場合「先月の乗客数が多ければ、来月も多くなるのではないか」といったように、過去から未来を予測していきます。
時間という情報を基にして将来を予測する方法を学んでください。

データはR言語に組み込みの『Airpassengers』を使います。

しかし、このデータをそのまま使うのではなく、少し変換してから使います。
変換前のもともとのデータのことを原系列などと呼ぶことがあります。

原系列に対して、対数差分系列を作ります。

原系列と対数差分系列のグラフを描いておきます。

 

差分系列とは、例えば{4,7,5}というデータがあった時{7-4,5-7}={3,-2}というようにスライドして差をとった結果のことです。
あらかじめ対数をとることにより、データを計算しやすい幅に収めやすくなる、また、対数差分系列は近似的に「変化率」の推移と等しくなるので解釈がしやすくなるというメリットが得られます。
なお、差分をとった時に、最初のデータが(差分を計算できないので)無くなってしまうことに注意してください。

元に戻すには、差分系列の累積和を計算してから、「一番最初の値」を足してやればよいです。
先の例ですと、差分系列が{3,-2}でしたので、最初の値をいれて{4,3,-2}、累積和をとって{4,4+3,4+3-2}={4,7,5}に戻ります。
Rで確認してみます。

対数差分系列なので、対数を元に戻すために『exp』が入っていることを除けば同じことです。

元に戻せることはわかったので、まずは計算がしやすい対数差分系列にのみ焦点を当てて解析をしていきます。

 

データをもう少し変換します。
今度はデータの中身は変えません。
機械学習法を適用しやすいように整形します。

こんなデータになります。

以下のような形式に整形されます。
Y:当月データ
Lag1:前月データ
Lag2:2か月前データ
Lag3:3か月前データ

このように整形することで、「過去のデータを説明変数にして、将来を予測する」機械学習モデルを作りやすくなります。

caretパッケージを使う準備

最後に、機械学習法を適用するためのパッケージを使う準備をします。
詳しくは『Rによる機械学習:caretパッケージの使い方』を参照してください。

今回は、後ほどサポートベクトルマシンという機械学習法を適用するため、それに関連するパッケージも入れておきました。

 

2.Rによる機械学習

予測モデルの概要

今回はサポートベクトルマシン(SVM)という機械学習法を適用してみます。
このモデルの詳細は『サポートベクトルマシンの考え方』を参照してください。
ニューラルネットワークの場合の計算は『ニューラルネットワークの考え方』に載っています。
今回はSVMのみを対象とします。

なお、この記事で紹介するやり方は、caretパッケージを使う場合は、他の学習モデルにも応用できます。

ハイパーパラメタのチューニング

先ほど作った学習データに対して、モデルを当てはめてみます。

『caret』パッケージの『train』関数を使えば、モデルの作成が簡単にできます。
以下、簡単にコードの説明をします。

4行目:Y(直近のデータ)を、他のデータ(過去のデータ)すべてを使って予測します
5行目:学習データの指定
6行目:予測モデルの指定。ガウシアンカーネルを使ったSVMを使用します
7行目:ハイパーパラメタをどの範囲で動かすかの指定。本来はサポートベクトル回帰ですのでεもチューニングしたかったのですが、caretパッケージではできないようでしたので、コストパラメタCとガウシアンカーネルのパラメタsigmaのみをチューニングしています。
8行目:データをあらかじめ標準化してね、という指定

10秒ほどで計算が終わります。
ハイパーパラメタのチューニング結果はこちら。

本来はこの後、もう少し細かくハイパーパラメタのチューニングをしたほうが良いのですが、今回は省略します。

パラメタのチューニングに関しては、Yoshihiko Suhara様の以下のスライドなども参考にしてください。
素晴らしくよくまとまっています。

 

なお、caretパッケージを使うと、クロスバリデーションを用いた予測の評価とグリッドサーチによるパラメタのチューニング、データの標準化などを、train関数の内部でまとめて行うことができます。

最小の予測誤差、すなわち、最も良いパラメタを使った場合の予測誤差を見てみます。
『0.076』くらいとなりました。

最も予測誤差が小さくなるパラメタがいくらなのか見てみます。

最後に、推定されたSVMの計算結果を取得します。
サポートベクトルマシンの考え方』に載っていた様々な二次解析をしたいならば、この結果を使えばよいです。



スポンサードリンク

 

3.機械学習による時系列予測

最適な次数を選ぶ

モデルの作り方がわかったので、次は最適な次数を選ぶ方法を説明します。
次数とは、例えば「前月データだけを使って予測する」なら次数は1となります。
2か月前までのデータを使うなら次数は2です。
何か月前までのデータを使うと最も予測精度が高くなるのか。それをこれから調べるということです。

ここからはコードが長く続きます。
コピペしても動きますので、要所だけ理解していただければと思います。

まずは、予測精度や予測モデルを保管しておく入れ物を用意しておきます。

次に、最大ラグ数を指定して、データを整形します。
今回は12を最大ラグ数としました。MAXで12か月前までのデータを使って予測するモデルを作るということです。
なお、直近のデータだけテスト用に残しておきました。

Lag12まで作られました。

最後に、次数を変えながら計算を繰り返し、その都度予測モデルと予測精度を保存しておきます。
計算には若干の時間がかかることに注意してください。
時間がかかるため、パラメタのチューニングはかなり荒くしてあります。

次数と予測精度の関係を図示してみました。

次数は8がちょうどよいようです。
予測誤差はクロスバリデーション法を使って計算されています。そのため、次数を増やしすぎて過学習を起こしてしまったかどうかを確認することもできます。
次数が9以上になると、予測誤差が増えていることがわかります。

当てはめ精度の評価

次に、予測精度や最も予測精度の高かったモデルを取り出します。

予測値と実測値のプロットを描いてみます。
なお、これは「手持ちのデータへの当てはまり」の精度であることに注意してください。

将来の予測

最後に1期先の予測を出してみます。

予測そのものは『predict』関数を使えばすぐにできるのですが、説明変数を作るのが若干面倒です。
以下のように、データをスライドさせることで、予測のための説明変数を作りました。

予測結果はこちらです。

若干ずれていますが、直近のデータが『-0.1672513』であったため、それよりかは増えるというところは予測できていました。

機械学習法は「予測が当たりさえすればよい」という発想で作られているところもあるので、データからの知識発見にはあまり向いていませんが、予測精度は良い印象があります。
時系列データに対して簡単に実行ができるというのであれば、ARIMAモデルなどの標準的な手法と並行して使うことも検討してよいのではないかと思います。

 

参考文献


サポートベクトルマシン (機械学習プロフェッショナルシリーズ)

 
この一冊を読めば、サポートベクトルマシンのことは大体わかります。
いま、サポートベクトルマシンの勉強をしたいと思ったら、この本から始めるのが良いと思います。
 

はじめてのパターン認識

 
様々な機械学習法が載った書籍です。
どのテーマも簡潔にまとまっている、この分野では有名な書籍です。
 



スポンサードリンク

関連する記事