機械学習法を用いた時系列データの予測方法について説明します。R言語を使えば、機械学習も時系列データのデータ操作も簡単にできます。両者を組み合わせて、時系列データへの予測モデルを作成してみました。ソースコードはこちらに置いてあります。機械学習とは機械学習とは、次にどのようなデータが来るのかを、決まった手順を踏んで予測する技術、あるいは手法のことです。機械学習の良いところは、予測のための「手順」を、過去のデータからほとんど自動で見つけられることです。昔は人間が勘と経験そして度胸で予測を出していました。優秀な予測者が会社を辞めてしまえば、もう予測はできなくなります。IT技術が発展したころには、エキスパートシステムなどといって「気温が高くて晴れていればビールが良く売れる」といったルールを人間が考えて、そのルールに従って予測を出していました。このやり方だととても細かくルールを設定しなければなりませんし、ルールを設定し忘れてしまうと、変な予測結果が出てしまいます。機械学習では、予測のためのルールを、文字通り「機械が学習」してくれます。人間がいちいちルールを指定してやる必要はありません。詳しくは『機械学習とは何か』を参照してください。今回予測するデータ機械学習といえば「気温を使ってビールの売上を予測する」といったように、色々なデータを組み合わせて予測した計算例が多いかと思います。今回予測するデータは時系列データです。今回は毎月の飛行機乗客数のデータを使います。この場合「先月の乗客数が多ければ、来月も多くなるのではないか」といったように、過去から未来を予測していきます。時間という情報を基にして将来を予測する方法を学んでください。データはR言語に組み込みの『Airpassengers』を使います。432しかし、このデータをそのまま使うのではなく、少し変換してから使います。変換前のもともとのデータのことを原系列などと呼ぶことがあります。原系列に対して、対数差分系列を作ります。0.102278849原系列と対数差分系列のグラフを描いておきます。main="対数差分系列")par(mfrow=c(1,1))差分系列とは、例えば{4,7,5}というデータがあった時{7-4,5-7}={3,-2}というようにスライドして差をとった結果のことです。対数をとることにより、データを計算しやすい幅に収めやすくなる、また、対数差分系列は近似的に「変化率」の推移と等しくなるので解釈がしやすくなるというメリットが得られます。差分をとった時に、最初のデータが(差分を計算できないので)無くなってしまうことに注意してください。元に戻すには、差分系列の累積和を計算してから、「一番最初の値」を足してやればよいです。先の例ですと、差分系列が{3,-2}でしたので、最初の値をいれて{4,3,-2}、累積和をとって{4,4+3,4+3-2}={4,7,5}に戻ります。432対数差分系列なので、対数を元に戻すために『exp』が入っていることを除けば同じことです。元に戻せることはわかったので、まずは計算がしやすい対数差分系列にのみ焦点を当てて解析をしていきます。データをもう少し変換します。今度はデータの中身は変えません。機械学習法を適用しやすいように整形します。sep="")}こんなデータになります。0.09193750以下のような形式に整形されます。Y:当月データLag1:前月データLag2:2か月前データLag3:3か月前データこのように整形することで、「過去のデータを説明変数にして、将来を予測する」機械学習モデルを作りやすくなります。最後に、機械学習法を適用するためのパッケージを使う準備をします。詳しくは『Rによる機械学習:caretパッケージの使い方』を参照してください。makePSOCKcluster(detectCores())registerDoParallel(cl)今回は、後ほどサポートベクトルマシンという機械学習法を適用するため、それに関連するパッケージも入れておきました。今回はサポートベクトルマシン(SVM)という機械学習法を適用してみます。このモデルの詳細は『サポートベクトルマシンの考え方』を参照してください。ニューラルネットワークの場合の計算は『ニューラルネットワークの考え方』に載っています。今回はSVMのみを対象とします。この記事で紹介するやり方は、caretパッケージを使う場合は、他の学習モデルにも応用できます。ハイパーパラメタのチューニング先ほど作った学習データに対して、モデルを当てはめてみます。'scale'))『caret』パッケージの『train』関数を使えば、モデルの作成が簡単にできます。以下、簡単にコードの説明をします。4行目:Y(直近のデータ)を、他のデータ(過去のデータ)すべてを使って予測します5行目:学習データの指定6行目:予測モデルの指定。ガウシアンカーネルを使ったSVMを使用します7行目:ハイパーパラメタをどの範囲で動かすかの指定。本来はサポートベクトル回帰ですのでεもチューニングしたかったのですが、caretパッケージではできないようでしたので、コストパラメタCとガウシアンカーネルのパラメタsigmaのみをチューニングしています。8行目:データをあらかじめ標準化してね、という指定10秒ほどで計算が終わります。ハイパーパラメタのチューニング結果はこちら。本来はこの後、もう少し細かくハイパーパラメタのチューニングをしたほうが良いのですが、今回は省略します。Suhara様の以下のスライドなども参考にしてください。素晴らしくよくまとまっています。sleepy_yoshiなお、caretパッケージを使うと、クロスバリデーションを用いた予測の評価とグリッドサーチによるパラメタのチューニング、データの標準化などを、train関数の内部でまとめて行うことができます。最小の予測誤差、すなわち、最も良いパラメタを使った場合の予測誤差を見てみます。『0.076』くらいとなりました。0.07616361最も予測誤差が小さくなるパラメタがいくらなのか見てみます。1最後に、推定されたSVMの計算結果を取得します。『サポートベクトルマシンの考え方』に載っていた様々な二次解析をしたいならば、この結果を使えばよいです。最適な次数を選ぶモデルの作り方がわかったので、次は最適な次数を選ぶ方法を説明します。次数とは、例えば「前月データだけを使って予測する」なら次数は1となります。2か月前までのデータを使うなら次数は2です。何か月前までのデータを使うと最も予測精度が高くなるのか。それをこれから調べるということです。ここからはコードが長く続きます。コピペしても動きますので、要所だけ理解していただければと思います。予測精度や予測モデルを保管しておく入れ物を用意しておきます。list()次に、最大ラグ数を指定して、データを整形します。今回は12を最大ラグ数としました。MAXで12か月前までのデータを使って予測するモデルを作るということです。直近のデータだけテスト用に残しておきました。sep="")}Lag12まで作られました。0.09193750最後に、次数を変えながら計算を繰り返し、その都度予測モデルと予測精度を保存しておきます。計算には若干の時間がかかることに注意してください。時間がかかるため、パラメタのチューニングはかなり荒くしてあります。}次数と予測精度の関係を図示してみました。ylab="error")次数は8がちょうどよいようです。予測誤差はクロスバリデーション法を使って計算されています。そのため、次数を増やしすぎて過学習を起こしてしまったかどうかを確認することもできます。次数が9以上になると、予測誤差が増えていることがわかります。次に、予測精度や最も予測精度の高かったモデルを取り出します。予測値と実測値のプロットを描いてみます。これは「手持ちのデータへの当てはまり」の精度であることに注意してください。最後に1期先の予測を出してみます。予測そのものは『predict』関数を使えばすぐにできるのですが、説明変数を作るのが若干面倒です。以下のように、データをスライドさせることで、予測のための説明変数を作りました。0.09552712予測結果はこちらです。0.1022788若干ずれていますが、直近のデータが『-0.1672513』であったため、それよりかは増えるというところは予測できていました。機械学習法は「予測が当たりさえすればよい」という発想で作られているところもあるので、データからの知識発見にはあまり向いていませんが、予測精度は良い印象があります。時系列データに対して簡単に実行ができるというのであれば、ARIMAモデルなどの標準的な手法と並行して使うことも検討してよいのではないかと思います。(機械学習プロフェッショナルシリーズ)この一冊を読めば、サポートベクトルマシンのことは大体わかります。いま、サポートベクトルマシンの勉強をしたいと思ったら、この本から始めるのが良いと思います。様々な機械学習法が載った書籍です。どのテーマも簡潔にまとまっている、この分野では有名な書籍です。PMいつも有用な情報ありがとうございます。時系列データのリサンプリング手法について教えてほしいです。SVMの最適次数を探索するときに、リサンプリングしたデータを使っても良いのでしょうか?(時系列データをリサンプリングするのはOKなんでしょうか?)感覚的に時系列データをリサンプリングすると、時間のつながりが失われるような気がしています。PMタカハシ様コメントありがとうございます。通常のリサンプリングが奨励されないことがあります。下記の記事のように、時系列データのためのクロスバリデーション法を使う方法もあります。https://logics-of-blue.com/time-series-forecast-and-evaluation-with-cv/ただ、今回のモデルは純粋な自己回帰のモデルとなっています。CVを使っても支障ないことが、シミュレーションや実データへの適用事例から示唆されています。CVは非推奨となります。本来は一度Box検定などを実行して、残差の自己相関の評価などを行った方が良いのでしょうね。今回は季節性のあるデータなので、もう少し探索すべき次数の範囲を増やすべきだったかもしれません。当方も手探りなところが一部あります。時系列データのリサンプリングについてのご説明ありがとうございます。リンク先を見ながら勉強したいと思います。コメント後に思ったんですが、機械学習と時系列予測がごっちゃになって時間が連続したデータが必要と思い込んでいました。サイトや書籍の説明が分かりやすくて、いつも助かっています。ご活躍をお祈りいたします。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。technology.。