今回は、航空会社の乗客数を予測してみます
こんにちは cedro です。
過去から現在までが一定のトレンドで推移していて、未来もそのトレンドが続くと仮定するならば、未来予測ができるはずです。
分かりやすい例が、ムーアの法則。
ムーアの法則とは、インテル創業者の一人であるゴードン・ムーアが、1965年に自らの論文上で唱えた「半導体の集積率は18か月で2倍になる」という半導体業界の経験則で、50年経った今でも通用していると言われています。
ニューラルネットワークの中には、過去の時系列データの流れからその後のデータを予測する、リカレント・ニューラル・ネットワークというのがあり、主に文章・対話の生成、音素・音声認識、 映像認識等に使われています。
今回は、このリカレント・ニューラル・ネットワークを使って、航空会社の乗客数を予測してみます。
データの収集・加工
今回は、オリジナルのデータ収集は行わず、ネットにあるものをダウンロードして使います。
これは、超有名な統計データで、1949年から1960年(12年間)のインターナショナル・エアラインズの乗客数の月別推移です。
毎年、ピークがあるのはバカンスで乗客数が急増するためでしょうか。
明らかな季節変動要素を持ち、かつ長期的には綺麗な右肩上がりのトレンドで、サンプルデータとしてはもってこいです。
今回は、1949年から1956年の8年間をニューラルネットワークに学習させ、1957年~1960年のその後の4年間を予測させてみたいと思います。
早速、DataMarket というサイトへ行き、Exportタブを選んで、Excel(.xls)をダウンロードします。
ダウンロードしたら、その後のデータ加工のことを考えて、OpenOfficeのCalcで開いて下さいね。
データは、おおむね-1~+1の範囲でなければならないので、各データを月別乗客数の最大値622で割ったものを計算します。
これを12か月分づつ、コピーしてデータファイルを作成します。
まず、黄色の部分をコピーします。
新しいファイルを開き、A1のところで右クリックし、「形式を選択して貼り付ける」を選択します。
ポップアップが出たら、「OK」を押します。
新しいファイルに、12か月分のデータがコピーされました。
名前を付けて保存を選び、ファイル名は「0」とし、「テキストCSV(.csv)」を選んで「保存」を押します。
文字の種類を聞いてくるので、「Unicode(UTF-8)」を選択して、「OK」を押します。
こんな警告は出ますが、問題ありません。「OK」を押します。
これで、SONY Neural Network Console が読める、CSV形式で文字コードUTF-8の、0.csv というファイルが出来ました。
同じ要領で、全部で12個のファイル(0.csv ~ 11.csv)を作成します。
それでは、学習ファイルと評価ファイルを作成します。
学習ファイル air_train.csv は、これだけ。
評価ファイル air_test.csv もこれだけ。
C:直下に、SNNC75フォルダーを作成しその中に、学習ファイルair_train.csv、評価ファイルair_test.csv、air_dataフォルダーを格納します。
そして、air_dataフォルダーの中に、0.csv ~ 11.csv を格納します。
SONY Neural Network Console を起動し、DATASET画面の Open dataset で、air_train.csv とair_test.csv を登録しておきます。
ニューラルネットワークの作成・学習・評価
さて、今回流用するプロジェクトは、リカレントニューラルネットワークの中でも、最もシンプルな、eleman_net.sdcproj です。
一端、SNNC75フォルダーにセーブして、編集します。
EDIT画面での変更点は以下の様です。
レイヤーについては、Slice を削除し(MNIST用なので不要です)、BinaryCrossEntropy → SquaredError に変更します(分類から数値へ)。
パラメーターについては、Input を1,28,28 → 12,1 (白黒28×28画像から12行×1列の行列に変更)し、それに従って、関係するところを変更します(図を参照)。
RecurrentInput、Concatenate、RecurrentOutput のaxisを「0」にします。
そして、SquaredError のT.Datasetを y → x に変更します。
学習データと評価データをMNISTから入れ替えたら、Batch Size4(評価データが4個しかないので)、Max Epoch 500で、学習のスタートです。
最初、評価誤差がポンと上がりましたが、すぐ収束しました。
評価結果がこれです。Neural Network Consoleには、こういう場合にグラフ表示してくれる機能がないので、表示はそっけないです。
これは、8.csv に対する予測結果は、.\0_0000\0.csv に出力されています、という意味です。
具体的に、このファイルが何処にあるかと言うと、
SNNC75フォルダーの内容を表示し、air_eleman_net.files をクリックします。
その中に、実行した日付と時刻別のフォルダーがあるので、見たいフォルダーをクリックすると、
この0_0000フォルダーの中に、出力の0.csv〜3.csv が入っています。
中身をみると、1行×12列のデータになっていますので、これを自分で加工して、Calcでグラフ表示させます。
青色がActual(実績)、赤色がForcast(予測)です。ピークとボトムは合っているようですが、段々ピークが上がっているところの予測がイマイチなようです。
LSTMで予測してみる
リカレント・ニューラル・ネットワークの中には、1995年に登場した有名なLSTM(Long Short-Term Memory Network)というのがあります。
これは、短期だけでなく長期の時系列データでも適切に学習が行われるように工夫がされたものです。
Neural Network Console の中にも、long_short_term_memory(LSTM).sdcproj というプロジェクトが登録されています。
結構複雑そうなニューラルネットワークですね。
ところで、Neural Network Consoleには、この複雑なニューラルネットワークを1つにまとめたUNITが登録されているのはご存知ですか?
実は、EDIT画面の左側のComponentsの真ん中あたりに、LSTM‗Unitがあるんです。
今回は、これを使って、LSTMのニューラルネットワークをゼロから作ってみます。
はい、出来ました(笑)。
えっ?これだけでいいんですか?って思うでしょ。でも、これだけでいいんです(笑)。
実は、LSTM Unit は、long_short_term_memory(LSTM).sdcproj の RecurrentInput からRecurrentOutput までをまとめたものなんです。
なんて便利なんでしょう。
では、Batch Size 4、Max Epoch 500、Structure Seaech Enable にチェックを入れ、自動最適化をさせてみます。
60回くらいやって、一番良かったのがこれ
最初と比べると、LSTM Unit と Affine の間に「Dropout」が追加され、Affine と Sigmoid の間に 「BatchNormalization」が追加されました。
予測結果です。eleman_net.sdcproj と比べて、段々ピークが上がって行くところも、ある程度追従できるようになったようです。
では、また。