質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.53%

  • Python

    7897questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 2.7

    1259questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • 機械学習

    678questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

機械学習の汎化能力について。過学習もしていないのに、極端に汎化能力が低かったという経験をされたことがありますか?

解決済

回答 1

投稿

  • 評価
  • クリップ 3
  • VIEW 2,368

kururi10

score 17

pythonで機械学習をしていて、
エポック数:103
loss:0.4152
acc:0.8072
val_loss:0.2200
val_acc:0.9487
という時点でのモデルをkerasのModelCheckpointにて保存しました。

訓練の精度はacc:0.8072と悪くなく、
テスト(バリデーション)の精度もval_acc:0.9487と悪くないので
過学習しているようには見えません・・・。

しかし、新しいデータを用意し、
このモデルを使ってpredictさせてみると
157個のうち20個しか正解しません。

val_accで精度が出ていれば、
そこそこ正解するんじゃないかと思っていたのですが
違うのでしょうか・・・?

似たようなご経験をされた方や
原因がお分かりになる方がいらっしゃれば
この現象の詳細について教えていただければ幸いです。
宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+6

サンプリングに問題があると起こり得ます。
特に時系列データでよく起こります。
過去に対してうまく予測できるのに、未来に対して予測できません。
一例に過ぎないので、そのように考えていただければ。

過去データのシャッフルすると、バリデーションに対しても内挿になります。
それに対して外挿は精度が悪くても意外性はありません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/09 00:47 編集

    mkgreiさん

    早速のご回答をいただきまして、ありがとうございます。

    結果だけを見て時系列に良くあると見抜かれたのは
    さすがだと思いました!
    まさに時系列データを分析していました。

    教えていただいた内挿と外挿について今調べていて
    なかなか意味がつかみきれないのですが、

    時系列に格納されたnumpy.arrayしたものをランダムにシャッフルすると
    良くなるよということですか?

    それともその逆で

    ランダムにシャッフルされていたとすると
    バリデーションに対しては良くなるが未知のデータに対応できない
    ことも起こりうるよ
    という意味でしょうか?

    キャンセル

  • 2017/12/09 00:50


    ランダムにシャッフルされていたとすると
    バリデーションに対しては良くなるが未知のデータに対応できない
    ことも起こりうるよ

    ランダムにシャッフルされていたとすると
    バリデーションに対しては良くなるが未知のデータに対応できない
    ことも起こりうるので

    ランダムにシャッフルはしないほうがいいよ

    キャンセル

  • 2017/12/09 00:51

    その逆の方です。
    時系列データではシャッフルするとバリデーションが機能しなくなることが多いです。

    キャンセル

  • 2017/12/09 00:53

    あ、そうなんですね~。
    ご回答ありがとうございます。

    そうすると僕のデータは
    シャッフルせずに格納してあるので
    他の問題が発生していると考えられるのですかね・・・。

    キャンセル

  • 2017/12/09 00:59

    あ、kerasのfitのAPIを見てみると

    shuffle=True

    と書いてありますね。
    これってデフォルトかどうかは書いてないですが
    たぶんデフォルトですよね・・・。

    そうすると何も指定しなければ
    fitの時にシャッフルしてるんですね。

    なるほど、なるほど。
    きちんとFalseにして学習させてみたいと思います。

    素早いお返事をいただけて、
    とても嬉しく思っております。

    ちなみに、
    「時系列データではシャッフルするとバリデーションが機能しなくなることが多い」
    というのは
    経験の中で導かれたのですか?

    僕も本を買ったりして調べたりするんですが
    なかなかそこまで詳しいのが見つからなくてですね・・・。

    キャンセル

  • 2017/12/09 01:15 編集

    あまり良くない例ですが、
    例えば、2017年の10代に飲酒経験のアンケートを行います。すると法律を守っていれば、ほとんどないという経験則が得られます。
    10年後に同じ同じ母集団に対してアンケートを行います。すると過半数に経験があると答えます。
    これは年齢的に考えると平均年齢が20以上なので違和感ありませんが、元のモデルから考える想定外のことになります。
    時系列データにはこのような常識を覆すような要因が含まれます。
    もちろん10年後に同じ10代にアンケートすれば、法律が変わってなければ、10年前のモデルとさほどかわからない結果が得られます。ただ、株の法律はどうでしょう?参加している人たちはどうでしょう?
    ゆえに時系列データに対しては、よりロバストな差分であったり、オンライン学習のようなものが使われることが多いです。
    それでも内挿と外挿の違いについて意識することが大事になります。

    キャンセル

  • 2017/12/09 01:33 編集

    内挿について
    http://m.huffingtonpost.jp/nissei-kisokenkyujyo/bias_b_9405506.html

    外挿の問題点について
    http://heartland.geocities.jp/ecodata222/ed/edj1-6-1-3.html
    https://books.google.co.jp/books?id=EEMoDwAAQBAJ&pg=PR4&lpg=PR4&dq=外挿&source=bl&ots=qoc5kaOzqp&sig=RcL8vq-ex3nt3WCLAcTx1f857Xc&hl=ja&sa=X&ved=0ahUKEwjz2tm56_rXAhVGa7wKHVA2CC04KBDoAQg2MAc#v=onepage&q=外挿&f=false

    直感的には、
    内挿は端が抑えられているという点において比較的安定です。
    外挿はデータ点の端から離れるほど不確定性が高まります。

    キャンセル

  • 2017/12/09 02:03 編集

    おお!1つ1つ、解説が分かりやすいページを調べてくださったのですね!
    どうもありがとうございます!

    1つめのURLである
    内装についてのページは、
    外挿バイアスについて書かれている気がするのですが、
    内挿のことはページのどのあたりを読み取ればいいですかね・・・。

    すべてのページを拝見させてもらって、
    一番最後のページのグラフが
    とても分かりやすかったです。

    誤解を恐れずに言うと、
    外挿部分になると不測の要素が入ってきて
    内挿部分では上手くいっていたものが上手くいかなくなる
    =予測は難しい
    というイメージでしょうか・・・。

    僕の場合は、パターンを
    時系列分析できないかなと思って今勉強しているところです。

    このようなパターンというのは、
    RNNがやはり向いていますかね?

    キャンセル

  • 2017/12/09 02:14

    仰ることは理解できます。
    問題は人間が見つかるようなパターンよりさらに過学習したパターンを得てしまうことによります。正則化を与えることによってバイアスを緩和することはできます。ただし、それを評価することは容易ではありません。そこでバリデーションの出番のはずです。
    それとは別の問題として、学習する際は良いが、バリデーションにはふさわしくないというのが結論です。
    バリデーションを現実に沿うような形で与えること、すなわちバリデーションは時系列的に後のものを与えることがバリデーションたる存在意義になります。

    キャンセル

  • 2017/12/09 02:15

    RNNはある程度の時系列性を強制する意味において有効になります。

    キャンセル

  • 2017/12/09 02:33

    なるほど、なるほど、
    機械学習が人間以上に精密なパターンを見つけてしまって
    過学習を抑えたり、過学習か否かの線引きが難しくなってしまうのですね。

    バリデーションデータは、
    訓練データの2割ぐらいを切り取って使っていて、
    その2割はもちろん切り取り後の訓練データとはかぶらない様にして
    かつ
    訓練データより時系列的に後になるようにしてあるのですが
    これで合っていますかね・・・。

    そして、最初に質問させていただいた、テストデータは
    バリデーションデータのさらに後に発生した取引の
    データを与えています。

    時系列的には
    訓練データ--->バリデーションデータ--->テストデータ

    時期的な被りは一切ないようにしていました。

    それでテストデータを
    predictさせて157個のうち20個という流れで
    最初の質問につながっていきました。

    RNNはやはり有効なのですね、安心しました^^
    ありがとうございます!

    キャンセル

  • 2017/12/09 02:34

    ちなみに、mkgreiさんはtwitterなどはされていらっしゃらないのでしょうか?

    タイムチケット(https://www.timeticket.jp/ )
    などをされていらっしゃると嬉しいのですが・・・。

    キャンセル

  • 2017/12/09 14:49

    一部誤字を修正しました。
    内挿のURLを貼り間違えていましたね。
    失礼しました。
    http://www.rist.or.jp/atomica/data/fig_pict.php?Pict_No=09-02-08-05-01
    https://matome.naver.jp/odai/2135005082467292201
    ガウシアンプロセスの信頼領域を見ると直感的かもしれません。
    http://blog.cocomoff.info/archives/2015/12/17/7624/

    時系列的に被らないように学習させるのは正しいように思われます。
    他に問題点を探すのであれば、そうですね。
    データ数が少々少ないことが問題かもしれません。

    その兆候として、loss/accとval_loss/val_accが少々乖離しているように感じます。

    時系列データには周期性がありますので、十分なデータがあるのかは少し専門的な知識が必要のように思われます。
    仮にもしかしたら、訓練データとバリデーションデータが波の立ち上がりのものであったりすると、今後も上がっていくと学習されるかもしれません。
    そこでたまたま、バリデーションデータでピークとなり、テストデータで下がっていく傾向を取っているのかもしれません。
    そうするとモデルというより問題設定に疑問が出てしまいます。

    株などの予測にはつきものの問題点で、学習がうまくいくためには周期よりも長いデータが必要なので、長期的なデータを学習に使うのが合理的である一方で、市場を支える社会背景・ルールが変化していないとみなせるほど短期である必要もあります。


    残念ながらtwitterはやっていないです。

    キャンセル

  • 2017/12/09 21:27 編集

    URLの方、修正していただきありがとうございます!
    拝見させていただきます。

    データ数については、
    訓練データ:2106
    バリデーションデータ:234
    です。
    まさにおっしゃるとおり、少ないような気がします・・・。

    一応5000エポックまで試しましたが、
    その後はval_lossは下がらず
    少し上がった感じで推移していきました。

    問題設定の方ももう少し見直しが必要なのですね・・・。
    詳しく教えていただき、ありがとうございます!

    少しお金を出してでもお聞きしたいことがあるのですが、
    twitter以外に何かご連絡できるものはありませんでしょうか?

    キャンセル

  • 2017/12/11 10:12

    後は、金融データの場合はノイズが強いので移動平均などをうまく使うことでモデルの精度が改善することが多いかと。
    ノイズが大きいことに伴うことですが、正答率が7割超えているのは複数銘柄をうまく組み合わせるなどしない限り、過学習をしていないか警戒する領域に入っているかと思います。

    twitter等々に関するお話ですが、よりフィードバックの速いプラットフォームがよいということでしょうか。
    それともコード・データ等をできるだけ公開するのを控えたいということでしょうか。

    キャンセル

  • 2017/12/11 17:35 編集

    お返事をいただきありがとうございます。
    移動平均で動きをスムーズにして、ノイズの影響を受けないようにした方が
    よいとのことですね。

    訓練データの正答率が7割を超えてきてからは
    よりいっそう過学習の注意をすべきなのですね。

    twitter等々に関するお話なのですが、
    これは後者のコードやデータなどの公開を控えたい
    というのが強いですね・・・。

    それに加えて、色々と詳しく教えていただいているので
    何かmkgreiさんにもメリットになるような
    ことができないかなという思いもあります。

    キャンセル

  • 2017/12/13 12:52

    金融データはいかに少しでも学習するのかとノイズを学習しないようにするのかの戦いのような印象があります。
    画像の分類みたく、人も結果についてよく知っているわけではないのが難しさの原因でしょうか。

    後半のお話ですが、声をかけてくださって大変光栄であり、嬉しく思います。
    ただ公開されていないデータを扱うのは責任を伴いますし、また私個人の都合として年末・年度末いろいろと立て込んでいる都合でいつ時間が取れるのか定かではありません。
    ですので、大変申し訳ありませんがこの度のお誘いはお引き受け致しかねます。

    何かお困りのことでこちらのプラットフォームで公開できるようなことであれば、ご質問を見かけたらお答えできる範囲で回答致しますので、よろしくお願い致します。

    キャンセル

  • 2017/12/14 21:43

    お返事いただきありがとうございます!

    確かに確かに。
    人間の目で見ても、どちらとも言えるな~という状況が多数あるので
    これは機械学習側も迷うだろうなあーと思いながら改良しています。

    公開されていないデータについてですが、
    これは僕が個人的にやっているので
    趣味的な感じで考えていただければ良かったのですが、
    年末などでお忙しいのですね・・・。

    mkgreiさんのマイページを拝見させていただくと
    色々と回答されているようで
    好きでやっていらっしゃるのだなあと
    しみじみ感じました。
    それでも、ここまでご丁寧にお答えいただいたので
    少し申し訳ないなあと思ったのと
    実益を伴う可能性のあるテーマなので
    何かご一緒させていただけたら嬉しいなあと思っておりました。

    またこのサイトでご質問させていただいたときは
    お時間があればご回答いただけると幸いです。
    ありがとうございました^^

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7897questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 2.7

    1259questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • 機械学習

    678questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

  • トップ
  • Pythonに関する質問
  • 機械学習の汎化能力について。過学習もしていないのに、極端に汎化能力が低かったという経験をされたことがありますか?