今回は、航空会社の乗客数を予測してみます
こんにちは 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 と比べて、段々ピークが上がって行くところも、ある程度追従できるようになったようです。
では、また。
ありがとうございました。ここのブログの例題で、自分もAir Passengerを予測することが出来ました。本当に素晴らしい。Sony Neural Network(NN) Console.
Deep learningの閾値が一気に下がりました。これまでは、Pythonのコード作成で頓挫したことが何度もありましたが、Sony NN Consoleのお陰で、ネットワークの設計にフォーカスを合わせることができるようになりました。
Sony NN ConsoleとPython Programmingの二刀流が出来たら最強ですね。
解きたい問題によって、データの準備や入れ方が変わることも気づいたので、これからその部分について、もっと勉強してみます。
今後ともよろしくお願いします。
Kotai さんへ
コメントありがとうございます!
あなたの意見に全く同感です。
今までのDeep learning はPython 言語を勉強してからでないと全く手が出なかった。
Python言語を勉強するには相当時間も掛かるわけで、その内挫折してしまう人も多かったのではないかと思います。私自身、もしNeural Network Console に出会わなかったら、Deep learningには手を出しませんでした。
NN Consoleは、Python言語の知識なしで、直ぐDeep learningをやってみることが出来ます。その内興味が出てきたら、Python言語を少しづつ覚えれば良いのではないでしょうか。
仰る通り、SONY NN Console とPython Programing の二刀流が出来たら、最強ですね。私も、いつかは、そうなりたいと思って勉強していまsす。今後とも、よろしくお願い致します。
自分もAir Passengerを予測しようとしたのですが、trainの部分でうまくいきませんでした。
ニューラルネットワーク作成の際、「×28」というのがどうしたら書けるのかわかりません。
ほかにも理解できていない箇所が多々あります。
もう少しだけ詳しく説明していただくことは可能でしょうか。
今後、自分はSONY NN Console を使ってセンサーデータの分析をしたいと思っています。
hiroさんへ
コメントありがとうございます。
レイヤーのパラメーター変更方法が分かり難かった様なので補足します。
レイヤーのパラメーターの変更方法は、変更したいレイヤーをクリックすると、画面左下にLayer Property が表示されますので、そこを変更します。各レイヤーの修正内容は以下の様です。
Input ————-> Size を1,28,28 → 12,1
Recurrent Input —> Axis を1 → 0
Concatenate ——-> Axis は0のまま(変更不要)
Affine_2 ———-> Output を 1,28 → 12
Tanh ————–> 変更不要
Delay ————-> Size を 1,28 → 12
Recurrent Output –> Axis を 1 → 0
Slice ————-> 削除(Recurrent Output と Affine は後で繋ぐ)
Affine ————> Outshape を1 → 12,1
Sigmoid ———–> 変更不要
BinaryCrossEntropy —-> SquardErrorに変更し、T dataset をy → x
これで、お試し頂けたらと思います。
なお、センサーデータの分析については、2/9と2/12の本ブログ「SONY Neural Network Console でジェスチャー認識」が参考になるかもしれません。
ご返信ありがとうございます。
とてもわかりやすい説明で、結果を出すことに成功しました。
本当にありがとうございます。
しかし、結果は出たのですが、評価結果の表示のされ方が
「.\0_0000\0.csv」 ではなく、折れ線グラフの画像として表示されました。
なのでその後、一番行いたかった、「Actual(実績)、Forcast(予測)の比較」
ができませんでした。
お手数ですが、ご返事いただけると幸いです。
また、センサーデータ分析の参考となる記事も見させていただきます。
hiroさんへ
コメントありがとうございます。
私も、改めてやってみましたが、確かに折れ線グラフの画像が出ますね。しかし、心配はいりません。
x’ の折れ線グラフの画像のところをダブルクリックしてみて下さい。
12行×1列のCSVファイルが表示されますので、それをForcast(予測)データとして使えばOKです。
10/21のブログ投稿時の形が再現できない理由が良く分かりませんが、もしかしたらVer1.0からVer 1.1にバージョンアップした時に修正が入ったかもです。
当時、SquardErrorのOutputが12,1となっているのに、CSVの結果は1行×12列になっていて変だなと思っていました。もちろん、1行×12列で、時間軸が1つのデータしかないのでグラフも出ませんでした。
この不具合が修正された様です。
こっちの方が本来ですし、行と列の入れ替えをしなくて良いので、その後の加工も楽ですね。
cedloさん
ご返信ありがとうございます。
何度も試してみたのですが、
x’ の折れ線グラフの画像のところをダブルクリックしても
CSVファイルが表示されません。
原因がわからず困っています。
何か心当たりありましたら解決策の程
教えていただけないでしょうか。
何度もお手数をおかけしてすいません。
よろしくお願い致します。
hiro さんへ
コメントありがとうございます。
そうであれば、ブログに記載した様にして頂ければOKです。
まず、今回作ったプロジェクトファイル(例えばair_eleman_net.sdcproj とします)を見つけて、そこにある air_eleman_net.files というフォルダーを開きます。
そうすると、学習日時が付いたフォルダーがありますので、自分の見たいフォルダーを選んで開きます。
そして、その中にある0_0000フォルダーを開くと、0.csv~3.csv(Forcastデータ)があります。
あるいは、x’ のグラフが表示された部分で右クリックしてメニューが出るならば、Open(CSVファイルを開く)、Open file location(CSVファイルがあるフォルダーを開く)、save CSV as… (CSVファイルに名前を付けて保存する)のどれかを使ってもOKです。
cedroさん
何度もこちらの記事を見ていたら一つ疑問に思う
箇所が出てきました。そのため、この疑問にお答えしていただきたく
ご連絡させていただきました。
冒頭の「データの収集・加工」に関してですが、
インターナショナル・エアラインズの乗客数の月別推移グラフは
明らかな季節変動要素を持ち、かつ長期的には綺麗な右肩上がりのトレンドで、サンプルデータとしてはもってこい。とあります。
私的には、今回の予測は常にあがり続けるものにしか対応していないのではないかと思いました。
将来的には下降するかも知れない推移に関しての予測も可能なのでしょうか。
もし、後者の予測にも対応しているのであれば、
今後様々な時系列の分析を行ってみたいと考えています。
こちらの認識不足で大変申し訳ございませんが、
お答えいただけると幸いです。
よろしくお願い致します。
hiroさんへ
コメントありがとうございます!
>私的には、今回の予測は常にあがり続けるものにしか対応していないのではないかと思いました。
将来的には下降するかも知れない推移に関しての予測も可能なのでしょうか。
■常に上がり続けるものしか対応していないわけではないと思います。
例えば、周期的に上昇・下降を繰り返す正弦波の様なものや、アップダウンを繰り返しながら全体として下降するものでも対応できると思います。
要は、過去の推移に何らかの規則性があって、それが未来も繰り返されると仮定できる場合は未来を予測できると思いますが、過去に一度も現れたことがないパターンにが新たに現れる場合は、予測は難しいと思います。
「将来的には下降するかも知れない推移に関しての予測」について言えば、過去に同様に下降したパターンがある場合は予測できそうですが、過去に下降したことが一度もなく今回初めて下降する様な場合、予測は難しいと思います。
cedroさん
ご返信ありがとうございます。
先日、エアコンの消費電力量の予測に関して取り組んでみたのですが、
思っていた結果を得ることができませんでした。
データとしては
1列目に外気温度、2列目に室内温度、3列目にエアコンの消費量を入れて予測を行いました。
しかし、この場合の予測ですと、消費量の推移まで入った予測となってしまうため、
本来予測したいものとは異なるものとなってしまいました。
外気温度と室内温度から一日の消費量を予測するというような、
複数の変数から未来の予測を行うためにはどのような手法が適切でしょうか。
ご回答いただければ、誠にありがたいしだいです。
SONY NN Console について知識不足のため、
何度も質問ばかりしてしまい、大変申し訳ありません。
何卒、よろしくお願い致します。
hiroさんへ
コメントありがとうございます!
>外気温度と室内温度から一日の消費量を予測するというような、複数の変数から未来の予測を行うためにはどのような手法が適切でしょうか。
■この場合は回帰問題と捉えた方が良いようですね。外気温度をx__0、室内温度をx__1、一日の消費量をy__0、として、昨年10/8のブログ「家賃を推定するニューラルネットワーク」を参考にしてみて下さい。
cedroさん
ご返信ありがとうございます。
過去にある程度パターンがあるような際は予測可能ですが、
過去に一度も現れたことがないパターンが新たに現れた際の予測は難しいのですね。
ということは、季節変動などの上昇・下降が見られる予測に関しては
今回の分析方法では可能ということでしょうか。
例えば、自宅の一日(24時間)のエアコンの消費電力量の推移を予測したいとなった場合、
(おそらく外気温度や室内温度等が関係してくると思うのですが)
今回のデータセットの方法に当てはめ、予測を行うことは可能でしょうか。
家賃を予測する際のデータセットの方法・プロジェクトが適切かとも考えましたが、
やはり時系列の結果が欲しいため、適切ではないかとも思いました。
こちらの例のような予測を行いたい場合は
どのようなデータセットの方法・プロジェクトを使用するのが正しいでしょうか。
度々お手数をおかけして申し訳ありません。
ご返事いただけると幸いです。
hiroさんへ
コメントありがとうございます。
>例えば、自宅の一日(24時間)のエアコンの消費電力量の推移を予測したいとなった場合、
(おそらく外気温度や室内温度等が関係してくると思うのですが)
今回のデータセットの方法に当てはめ、予測を行うことは可能でしょうか。
■季節変動による周期的なデータになると思いますので、リカレント・ネットワークで予測は可能だと思います。
cedreさん
ご返信ありがとうございます。
先日、このブログの例題であるAir Passengerを予測することが出来ました。
ご丁寧な説明、ありがとうございました。
今後も、ほかのブログの課題にも取り組んでいきたいと思うので、
またわからないことがあった際は、ご教示いただけると幸いです。
本当にありがとうございました。
cedroさん
お世話になっております。
hiroです。
あれから、neural network consoleを継続して使用しているのですが、
どうしてもわからない点があり、今回ご連絡させていただきました。
Edit画面でモデルを作成する際、
複数のモデルを作成するために複数のデータをセットしたいのですが、
DataSetで各モデルごとに異なるデータをセットする方法をご存知ですか。
もしご存知であれば、ご教示いただけると幸いです。
ご検討の程よろしくお願い致します。
いつもお世話になっております。大変参考になります
ちなみにmax epochはどのような基準で”500”とされたのでしょうか?
tomoさんへ
コメントありがとうございます。
最初100でやったら、VALIDATION ERROR がまだまだ下がりそうだったので、500にしました。
一般的に、VALIDATION ERROR が下がりきるまでは、max epochを増やした方が良いと思います。
初めまして、cedroさん
大変参考になりました。
うまくできました。いくつか質問があります。
Q1
8.csvから11.csvは今回は実際のデータが使われてますが、未来予測を行うときには普通存在しないデータなので
数値は何でもいいのですよね?
ダミーファイルとしてファイルを作っているという解釈でいいですか?
Q2
12カ月毎で1つのファイルに分けていますが、何か分け方に指標はあるのでしょうか?
今回の場合、季節性があるデータなので1周期毎という意味で12カ月毎になっているのでしょうか?
例えば、毎日のデータの場合では、1カ月毎にファイルを作るべきでしょうか?
その辺りの決め方があれば教えてください。
Q3
19年3月以降、ブログの更新がなされていませんが、何かあったのでしょうか?
とてもためになるブログなので、是非続けて欲しいと願っています。
以上、よろしくお願いいたします。
harrodsさん
コメントありがとうございます。以下、お答えします。
A1
その解釈でOKです。
A2
データに周期的な特徴がある場合は、その周期を含むようにすると良いと思います。周期的な特徴が月内に収まるのであれば、1ヶ月毎でOKです。
A3
ご心配ありがとうございます。色々なことがあり長らくブログの更新をやめておりましたが、再開しました。