時系列データなのに、LSTMよりランダムフォレストの方が精度が高くなることはあり得る事なのでしょうか?

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 3,574

kururi10

score 25

株価の分析をしているのですが、
今のところLSTMよりランダムフォレスト方が高い精度が出ています。

自分の理解だと、ランダムフォレストは
時系列を時系列だと認識できず
単なる組み合わせとして判断している
と思っているのですが、
それがLSTMより精度が高くなるのはなぜなのか
が分からずにいます・・・・

私がLSTMを使いこなせていないだけ
というのが一番の理由かもしれませんが。。。

時系列データなのに
LSTMよりランダムフォレストの方が精度が高くなる理由について
考えられることがあれば教えていただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

https://www.slideshare.net/mobile/KeishoSuzuki/randomforest-vs-lstm

ランダムフォレストの方がパラメータチューニングしやすいこともありますから。

どちらかが得意でしょうがないデータもあるかもしれませんが、トイモデルでない限りそのようなデータに当たることは珍しいでしょう。


https://www.quora.com/Which-classifier-is-better-random-forests-or-deep-neural-networks

性質は結構異なるらしいので実践的には合わせた方が性能が出ます。


ネコの画像を見てネコだとわかるか、ネコの仕草を見てネコだとわかるか
ネコのマンガを見るか、ネコの動画を見るか、を比較してみると、どちらもそれなりにわかるのでは?

3分後になにかが起こることと、
1分経ってからさら1分経って、そしてその1分後になにかが起きる、
ということも同じです。

違いは順序にあります。
3分前にAがあって、2分前にBがあって、1分前にCがあると、Dになるということであれば、2つの手法はそれほど違いが出ません。
Aの後にBが来て、それからCが来れば次にDがくるもいうことであればLSTMが有利そうです。

累積和の閾値とか…

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/22 23:46

    ちょっと色々聞きすぎましたね・・・
    すみません。
    色々とありがとうございました!

    キャンセル

  • 2018/07/23 07:20

    偏りが大きいデータに対しては、accのほかrecallやprecisionなども見てみるとよいかもしれません。

    https://www.kaggle.com/rspadim/gini-keras-callback-earlystopping-validation

    このようにコールバックに仕込めばほぼ任意の評価関数を入れることができます。

    キャンセル

  • 2018/07/23 15:23 編集

    他の視点からのアドバイスありがとうございます!

    まだ基本的な評価関数のところしかやっていないのですが、
    教えて頂いたリンク先のように
    色々と定義もできるようになっているのですね。


    一応、僕としてはprecisionを最大限良くすることを目標に
    今までやってきました。
    recallは50%程度で良く、取りこぼしがあっても構わないので
    とにかく判断したものは高い確率で正しくあってほしい
    という指針を立ててやっている感じです。

    一応今のところ一番上手くいっているのは(ましなもの)
    検証データでこんな感じです。

    -------------------------------------------
    [[247 | 145]
    [ 66 | 63]]
    -------------------------------------------
    class | precision | recall | f1-score | support

    0 | 0.79 | 0.63 | 0.70 | 392
    1 | 0.30 | 0.49 | 0.37 | 129

    avg / total | 0.67 | 0.60 | 0.62 | 521

    これが今のところ一番いいprecisionでして、
    1の方のprecisionが0.3前後ぐらいになります。

    1の方が少数派のクラスで、
    このprecisionを可能な限り上げるのが目標です。

    これ以上がまだまだです・・・。

    キャンセル

+1

LSTMはベースが時系列モデルなので、モデルに適合するようにデータの事前処理をしたり、データの傾向に合わせてモデルを定義しないと期待した性能が出ません。一方、ランダムフォレストはツリーで表されるモデルを学習過程で構築する手法なので、ハイパーパラメーターの設定を失敗しなければそれなりの結果が得られます。
詳細不明なため、確信的なことは言えませんが、モデルそのものに問題があるか、データの事前処理が不十分である可能性を疑ったほうがいいかと思います。
とりあえず思いつくチェックポイントは以下です。
1.定常性の有無
2.自己相関の有無、移動平均との相関の有無
3.階差モデルの適用の適否
4.季節的周期性
5.外部要因組み込みの適否
ざっくりでいいので時系列モデルの理論を確認して、kerasで実装するとどうなるのかを踏まえて見直しするといいかと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/17 22:22

    ご回答いただき、ありがとうございます!
    定常性や階差についてはある程度考慮したと思ってはいたのですが、
    きちんとできているかどうか自信がありません。。。
    教えて頂いた他のチェックポイントも含めて
    もう一度見直してみたいと思います。

    実行したLSTMでの学習過程は一応こんな感じです

    Train on 5524 samples, validate on 1382 samples
    Epoch 1/500
    5524/5524 [==============================] - 25s 5ms/step - loss: 5.2890 - acc: 0.2444 - val_loss: 0.7459 - val_acc: 0.2590
    Epoch 2/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 3.8069 - acc: 0.2587 - val_loss: 0.8735 - val_acc: 0.2590
    Epoch 3/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 3.2372 - acc: 0.2587 - val_loss: 0.7537 - val_acc: 0.2590
    Epoch 4/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 3.2505 - acc: 0.2587 - val_loss: 0.7657 - val_acc: 0.2590
    Epoch 5/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 3.1615 - acc: 0.2589 - val_loss: 0.7552 - val_acc: 0.2590
    Epoch 6/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 3.0657 - acc: 0.2621 - val_loss: 0.7287 - val_acc: 0.2590
    Epoch 7/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 3.0800 - acc: 0.2717 - val_loss: 0.7214 - val_acc: 0.2677
    Epoch 8/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 3.0767 - acc: 0.2864 - val_loss: 0.7164 - val_acc: 0.3973
    Epoch 9/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 3.0728 - acc: 0.2822 - val_loss: 0.7140 - val_acc: 0.3958
    Epoch 10/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9702 - acc: 0.3059 - val_loss: 0.7064 - val_acc: 0.5456
    Epoch 11/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9884 - acc: 0.3219 - val_loss: 0.7003 - val_acc: 0.6035
    Epoch 12/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 3.0324 - acc: 0.3503 - val_loss: 0.6983 - val_acc: 0.6165
    Epoch 13/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9398 - acc: 0.3756 - val_loss: 0.6882 - val_acc: 0.6621
    Epoch 14/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9705 - acc: 0.3807 - val_loss: 0.6877 - val_acc: 0.6657
    Epoch 15/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.8913 - acc: 0.4035 - val_loss: 0.6831 - val_acc: 0.6867
    Epoch 16/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9296 - acc: 0.3914 - val_loss: 0.6820 - val_acc: 0.6838
    Epoch 17/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.8784 - acc: 0.4178 - val_loss: 0.6725 - val_acc: 0.7164
    Epoch 18/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9106 - acc: 0.4222 - val_loss: 0.6679 - val_acc: 0.7315
    Epoch 19/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.7937 - acc: 0.4575 - val_loss: 0.6613 - val_acc: 0.7366
    Epoch 20/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.8684 - acc: 0.4526 - val_loss: 0.6596 - val_acc: 0.7373



    Epoch 495/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9476 - acc: 0.7493 - val_loss: 0.6178 - val_acc: 0.7410
    Epoch 496/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.6723 - acc: 0.6696 - val_loss: 0.6095 - val_acc: 0.7410
    Epoch 497/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9770 - acc: 0.6872 - val_loss: 0.5990 - val_acc: 0.7410
    Epoch 498/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.5253 - acc: 0.6895 - val_loss: 0.6039 - val_acc: 0.7410
    Epoch 499/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9107 - acc: 0.6961 - val_loss: 0.6310 - val_acc: 0.7410
    Epoch 500/500
    5524/5524 [==============================] - 18s 3ms/step - loss: 2.9368 - acc: 0.7820 - val_loss: 0.6162 - val_acc: 0.7410


    何かお感じになることとかありますでしょうか?

    また、一番苦心しているのが不均衡データであることなのですが、
    LSTMのclass_weightに"balanced"を設定したり手動で重みを入れたりしていますが
    その調整が難しいです。
    データ量が1万ぐらいしかないので
    アンダーサンプリング・オーバーサンプリング
    は厳しいと考えていて、weightを調整するしかないかなと思っています。

    キャンセル

0

どんな使い方をしているかにもよります。うまく動いていない可能性もあるでしょうし。モデルの設計が悪いとか、LSTMを学習させるのに十分なデータの蓄積がないとかもありえます。

また、ランダムフォレストは普通に使っても過学習っぽくなるのも特徴なので、汎化性能を見ないでスコアを出すと評価を見誤ります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/12 21:01

    精度と書くとわかりにくいですね、もう少し詳しく書かないといけなかったと
    気づかされました^^;
    precisionが高いことを目標としているのですが、
    ランダムフォレストの方が高かったのと、
    期間的に全くかぶりのないテストデータでの汎化性能も高かったので
    疑問でした。
    確かにおっしゃるとおり設計が悪かったり
    データが足りなかったりもする感じかもしれないですね。。。
    簡単なところからもう少し1つ1つ進めてみたいと思います。
    ご回答ありがとうございます^^

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Pythonに関する質問
  • 時系列データなのに、LSTMよりランダムフォレストの方が精度が高くなることはあり得る事なのでしょうか?