LSTM で航空会社の乗客数を予測

あゆた Deep Learning 担当の佐々木です。

前回のLSTM で正弦波の予測する記事では LSTM を用いた正弦波の予測を行い、ちゃんと未来予測ができていそうな結果が出ていました。
ただ、正弦波の予測では現実の問題に対して単純すぎる、もっとリアリティのある問題に対して LSTM を使ってみたい!という要望もあるのかなと。
という訳で今回は航空会社の乗客数を予測してみたいと思います。

以下の内容は、基本的にこの記事の要約です。
ただ、全く同じことをしたのでは面白みがないので、この記事ではバッチ処理への対応と、データが無い期間の未来予測も行っていきます。もっと詳しい説明が欲しい方は、本家の方を見てみてください。


入力データの準備

コードはほぼ前回の記事で上げたものと同じです。入力するデータのみ変更すればおkです。データを変えるだけで、別の問題に使いまわせるのがディープラーニングのいいところですね!!

さて、そんな訳で入力用のデータを作っていきます。
今回使用するデータは、このサイトから CSV 形式でダウンロードできます。 保存した CSV ファイルの中身を見てみましょう、以下のようになっています。

データのダウンロードさえしてしまえば、あとは pandas で読み込むだけです。

dataframe = pd.read_csv('international-airline-passengers.csv',  
                        usecols= [1],
                        engine=  'python') \
              .dropna()

dataset = dataframe.values.astype('float32')  

usecols で使用するカラムを指定しています。学習には乗客数のデータのみあればいいので、2番目のカラムを指定しています。また、上記の画像を見ていただければ分かるように、この CSV ファイルには最後に不要な文字列が入っています。このような文字列は pandas で読み込んだ際に NaN (Not a Number) に変換されるので、dropna() で NaN の入った行を削除してやりましょう。

この後、モデルを作り学習させるところまでは前回の記事のコードそのままでイケます。


結果

time_steps 14, batch_size 1 で 1000 epoch 学習させた結果がこちら。上の画像をみると、テストデータによる予測 (Predict) の部分では、だいたい実際の結果と似たような出力が得られているようにみえます。

しかしながら、データの無い期間の未来予測を行った部分(Future) は微妙な感じ…。凹凸の形状は実際の傾向と似たような雰囲気になっているけれど、値の絶対値が若干さがっている?ような雰囲気。
機会があればこの問題の原因と、解決策を探ってみようと思います。