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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

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

機械学習

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

Python

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

Q&A

解決済

1回答

666閲覧

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

kururi10

総合スコア27

Python 2.7

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

機械学習

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

Python

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

0グッド

5クリップ

投稿2017/12/08 13:06

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で精度が出ていれば、
そこそこ正解するんじゃないかと思っていたのですが
違うのでしょうか・・・?

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

投稿2017/12/08 15:23

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kururi10

2017/12/15 12:31 編集

mkgreiさん 早速のご回答をいただきまして、ありがとうございます。 結果だけを見て時系列に良くあると見抜かれたのは さすがだと思いました! まさに時系列データを分析していました。 教えていただいた内挿と外挿について今調べていて なかなか意味がつかみきれないのですが、 時系列に格納されたnumpy.arrayしたものをランダムにシャッフルすると 良くなるよということですか? それともその逆で ランダムにシャッフルされていたとすると バリデーションに対しては良くなるが未知のデータに対応できない ことも起こりうるよ という意味でしょうか?
kururi10

2017/12/08 15:50

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

2017/12/08 15:51

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

2017/12/08 15:53

あ、そうなんですね~。 ご回答ありがとうございます。 そうすると僕のデータは シャッフルせずに格納してあるので 他の問題が発生していると考えられるのですかね・・・。
kururi10

2017/12/08 15:59

あ、kerasのfitのAPIを見てみると shuffle=True と書いてありますね。 これってデフォルトかどうかは書いてないですが たぶんデフォルトですよね・・・。 そうすると何も指定しなければ fitの時にシャッフルしてるんですね。 なるほど、なるほど。 きちんとFalseにして学習させてみたいと思います。 素早いお返事をいただけて、 とても嬉しく思っております。 ちなみに、 「時系列データではシャッフルするとバリデーションが機能しなくなることが多い」 というのは 経験の中で導かれたのですか? 僕も本を買ったりして調べたりするんですが なかなかそこまで詳しいのが見つからなくてですね・・・。
mkgrei

2017/12/09 04:21 編集

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

2017/12/09 04:22 編集

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

2017/12/15 12:35 編集

おお!1つ1つ、解説が分かりやすいページを調べてくださったのですね! どうもありがとうございます! 1つめのURLである 内装についてのページは、 外挿バイアスについて書かれている気がするのですが、 内挿のことはページのどのあたりを読み取ればいいですかね・・・。 すべてのページを拝見させてもらって、 一番最後のページのグラフが とても分かりやすかったです。 誤解を恐れずに言うと、 外挿部分になると不測の要素が入ってきて 内挿部分では上手くいっていたものが上手くいかなくなる =予測は難しい というイメージでしょうか・・・。 僕の場合は、パターンを 時系列分析できないかなと思って今勉強しているところです。 このようなパターンというのは、 RNNがやはり向いていますかね?
mkgrei

2017/12/08 17:14

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

2017/12/08 17:15

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

2017/12/08 17:33

なるほど、なるほど、 機械学習が人間以上に精密なパターンを見つけてしまって 過学習を抑えたり、過学習か否かの線引きが難しくなってしまうのですね。 バリデーションデータは、 訓練データの2割ぐらいを切り取って使っていて、 その2割はもちろん切り取り後の訓練データとはかぶらない様にして かつ 訓練データより時系列的に後になるようにしてあるのですが これで合っていますかね・・・。 そして、最初に質問させていただいた、テストデータは バリデーションデータのさらに後に発生した取引の データを与えています。 時系列的には 訓練データ--->バリデーションデータ--->テストデータ で 時期的な被りは一切ないようにしていました。 それでテストデータを predictさせて157個のうち20個という流れで 最初の質問につながっていきました。 RNNはやはり有効なのですね、安心しました^^ ありがとうございます!
kururi10

2017/12/08 17:34

ちなみに、mkgreiさんはtwitterなどはされていらっしゃらないのでしょうか? タイムチケット(https://www.timeticket.jp/ ) などをされていらっしゃると嬉しいのですが・・・。
mkgrei

2017/12/09 05: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はやっていないです。
kururi10

2017/12/15 12:36 編集

URLの方、修正していただきありがとうございます! 拝見させていただきます。 データ数については、 訓練データ:2106 バリデーションデータ:234 です。 まさにおっしゃるとおり、少ないような気がします・・・。 一応5000エポックまで試しましたが、 その後はval_lossは下がらず 少し上がった感じで推移していきました。 問題設定の方ももう少し見直しが必要なのですね・・・。 詳しく教えていただき、ありがとうございます! 少しお金を出してでもお聞きしたいことがあるのですが、 twitter以外に何かご連絡できるものはありませんでしょうか?
mkgrei

2017/12/11 01:12

後は、金融データの場合はノイズが強いので移動平均などをうまく使うことでモデルの精度が改善することが多いかと。 ノイズが大きいことに伴うことですが、正答率が7割超えているのは複数銘柄をうまく組み合わせるなどしない限り、過学習をしていないか警戒する領域に入っているかと思います。 twitter等々に関するお話ですが、よりフィードバックの速いプラットフォームがよいということでしょうか。 それともコード・データ等をできるだけ公開するのを控えたいということでしょうか。
kururi10

2017/12/15 12:32 編集

お返事をいただきありがとうございます。 移動平均で動きをスムーズにして、ノイズの影響を受けないようにした方が よいとのことですね。 訓練データの正答率が7割を超えてきてからは よりいっそう過学習の注意をすべきなのですね。 twitter等々に関するお話なのですが、 これは後者のコードやデータなどの公開を控えたい というのが強いですね・・・。 それに加えて、色々と詳しく教えていただいているので 何かmkgreiさんにもメリットになるような ことができないかなという思いもあります。
mkgrei

2017/12/13 03:52

金融データはいかに少しでも学習するのかとノイズを学習しないようにするのかの戦いのような印象があります。 画像の分類みたく、人も結果についてよく知っているわけではないのが難しさの原因でしょうか。 後半のお話ですが、声をかけてくださって大変光栄であり、嬉しく思います。 ただ公開されていないデータを扱うのは責任を伴いますし、また私個人の都合として年末・年度末いろいろと立て込んでいる都合でいつ時間が取れるのか定かではありません。 ですので、大変申し訳ありませんがこの度のお誘いはお引き受け致しかねます。 何かお困りのことでこちらのプラットフォームで公開できるようなことであれば、ご質問を見かけたらお答えできる範囲で回答致しますので、よろしくお願い致します。
kururi10

2017/12/14 12:43

お返事いただきありがとうございます! 確かに確かに。 人間の目で見ても、どちらとも言えるな~という状況が多数あるので これは機械学習側も迷うだろうなあーと思いながら改良しています。 公開されていないデータについてですが、 これは僕が個人的にやっているので 趣味的な感じで考えていただければ良かったのですが、 年末などでお忙しいのですね・・・。 mkgreiさんのマイページを拝見させていただくと 色々と回答されているようで 好きでやっていらっしゃるのだなあと しみじみ感じました。 それでも、ここまでご丁寧にお答えいただいたので 少し申し訳ないなあと思ったのと 実益を伴う可能性のあるテーマなので 何かご一緒させていただけたら嬉しいなあと思っておりました。 またこのサイトでご質問させていただいたときは お時間があればご回答いただけると幸いです。 ありがとうございました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問