cedro-blog

Keras LSTMでトレンド予測をしてみる

今回は、LSTMを使って、航空会社の乗客数を予測してみます。

こんにちは cedro です。

過去から現在までが一定のトレンドで推移していて、未来もそのトレンドが続くと仮定するならば、未来予測ができるはずです。

ニューラルネットワークの中には、過去の時系列データの流れからその後のデータを予測する、リカレントネットワークというのがあり、主に文章・対話の生成、音素・音声認識、 映像認識等に使われています。

今回は、LSTMを使って、航空会社の乗客数を予測してみます。

 

データセットの準備

今回使うデータセットは、以前にもご紹介したことのある、1949年から1960年(12年間)のインターナショナル・エアラインズ乗客数の月別推移です。

毎年、ピークがあるのはバカンスで乗客数が急増するためでしょうか。明らかな季節変動要素を持ち、かつ長期的には綺麗な右肩上がりのトレンドで、サンプルデータとしてはもってこいです。

今回は、1949年から1958年の10年間学習させ、1959年~1960年のその後の2年間を予測させてみたいと思います。

 

DataMarket   でExpot タブを選択し、CSVファイルをダウンロードするとこんな内容になっています。1行目にタイトル、2行目以降、年月と乗客数が並んでいます。このファイルをプログラムと同じフォルダーに格納します。

 

プログラムを作成します

手順に沿って、プログラムを作成します。

必要なライブラリーインポートしたら、pandas を使って CSVファイル読み込みます。引数 skipfooter =3 は、最後3行分にメモが書いてあるので読み飛ばす指定です。

そして、np.array乗客数データを配列の形で、raw_data に格納します。引数 iloc [ : , 1 ] は乗客数が書いてある列の指定です。

最後に raw_data を600で割っているのは正規化するためです。ニューラルネットワークに入力するデータは、概ね−1〜+1の範囲である必要があります。今回の乗客数のMAXは606だったので、ざっくり600で割ったというわけです。少し手抜きですね(笑)。

さあ、これでraw_data の中に12ヶ月×12年間=144個乗客数データが格納されました。

 

LSTMに入力する形式にデータを加工します。今回のデータは明確な季節変動のあるデータなので、12個の連続したデータを元に、13個目のデータを予測することにします。まず、配列 x, y を作ります。

for i in range ループの初回は、xraw_data0番目〜11番目のデータが追加され、yraw_data12番目のデータが追加されます。2回目はxraw_data1番目〜12番目のデータが追加され、yraw_data13番目のデータが追加されます。これを順次繰り返します。

繰り返し回数は、len(raw_data) – length -24 = 144 – 12 -24 = 108 回なので、これで108組のデータが作成できます。最後にシェイプを整えます。12個の連続データ data のシェイプ(108, 12, 1)。13番目のデータ target のシェイプ(108, 1)

 

モデル構築をします。12個の連続データで次のデータを1つ予測するので、length_of_sequence = 12in_out_neurons = 1 です。隠れ層(n_hidden)の数は300個とします。

学習は、batch_size = 1epoch = 100 で行い、データの10%を評価に(validation_split = 0.1)使います。つまり、108個のデータの内、97個を学習に使い、11個を評価に使います。学習を完了すると、model.predict()データ予測を行います。

 

学習結果を元に、1959年〜1960年を予測する部分です。future_test = data [ len(data) – 1]dataの最後のデータ(1958年1月〜1958年12月)を意味します。future_result は予測した結果を保存する配列です。

for i in range ループでは、初回 future_test のシェイプを(1, 12, 1)に変換し、model.predict で翌月の乗客数 batch_predict を予測します。

そして、np.delete で future_test の0番目を消し、予測した翌月の乗客数 batch_predict を加えます。この結果、future_test1958年2月〜1959年1月のデータに置き換わります。

最後に、future_result に予測した翌月の乗客数 batch_predict を追加します。これを24ヶ月繰り返します。完了すると、future_result1959年1月〜1961年1月までの24ヶ月分の予測データが保存されます。

 

波形表示の部分です。raw_data = 生データ(1949年〜1960年)は青色predicted学習時の予測データ(1950年〜1958年)は赤色future_result = 学習後の予測データ(1959年〜1960年)は緑色で表示します。

最後に、ロス推移グラフ表示部分です。ここは、何回も出て来ているので、説明は不要でしょう。

 

最後にプログラム全体を載せておきます。

 

プログラムを動かします

シンプルなプログラムですので、普通のPCで軽快に動きます。私のMacbook Air で約4分で完了しました。ロス推移グラフを見ると、順調にロスは下がっているようです。

 

予測グラフです。青色生データで、赤色学習時の予測データ緑色予測データです。赤色を見るとまずまず上手く学習できている状況が読み取れます。また緑色の予測の部分も、結構いい感じではないでしょうか。

実は、1年前の10/21 のブログで、今回と同じネタを SONY Neural Network Console でやったことがあるのですが、あの時と比べると、データセットの作成やグラフ表示は効率的にやれるようになったし、python も多少分かって来ました。少し進歩したかな(笑)。

では、また。