web-dev-qa-db-ja.com

過剰適合と適切な予測の区別

これらは、機械学習の過剰適合を計算して減らす方法に関する質問です。機械学習の初心者の多くも同じ質問をするだろうと思うので、ここでの回答が他の人に役立つことを願って、例と質問を明確にしようとしました。

テキストのサンプルが非常に少なく、それらに関連する値を予測しようとしています。 sklearnを使用してtf-idfを計算し、それらを回帰モデルに挿入して予測しました。これにより、6323の機能を備えた26のサンプルが得られます-それほど多くはありません..私は知っています:

_>> count_vectorizer = CountVectorizer(min_n=1, max_n=1)
>> term_freq = count_vectorizer.fit_transform(texts)
>> transformer = TfidfTransformer()
>> X = transformer.fit_transform(term_freq) 
>> print X.shape

(26, 6323)
_

6323個の特徴(X)と関連するスコア(y)の26個のサンプルをLinearRegressionモデルに挿入すると、適切な予測が得られます。これらは、cross_validation.LeaveOneOut(X.shape[0], indices=True)からleave-one-out相互検証を使用して取得されます。

_using ngrams (n=1):
     human  machine  points-off  %error
      8.67    8.27    0.40       1.98
      8.00    7.33    0.67       3.34
      ...     ...     ...        ...
      5.00    6.61    1.61       8.06
      9.00    7.50    1.50       7.50
mean: 7.59    7.64    1.29       6.47
std : 1.94    0.56    1.38       6.91
_

かなり良い!ユニグラム(n = 1)の代わりにngram(n = 300)を使用すると、同様の結果が発生しますが、これは明らかに正しくありません。どのテキストにも300語は含まれていないため、予測は失敗するはずですが、失敗しません。

_using ngrams (n=300):
      human  machine  points-off  %error
       8.67    7.55    1.12       5.60
       8.00    7.57    0.43       2.13
       ...     ...     ...        ...
mean:  7.59    7.59    1.52       7.59
std :  1.94    0.08    1.32       6.61
_

質問1:これは、予測モデルが過剰適合データであることを意味する場合があります。これを知っているのは、良い結果が得られないことがわかっているngram(n = 300)に極値を選択したためです。しかし、私がこの知識を持っていなかったとしたら、通常、モデルが過剰適合していることをどのように判断しますか?言い換えると、妥当な尺度(n = 1)が使用された場合、モデルが正常に機能しているのに対して、過剰適合の結果であることが適切な予測であることがどのようにわかりますか?

質問2:予測結果を確実にするために(この状況で)過剰適合を防ぐ最良の方法は何ですか?良いか悪いか?

質問3:LeaveOneOut交差検定を使用する場合、モデルはどのようにして適切にオーバーフィットする可能性がありますか結果?過剰適合とは、予測の精度が低下することを意味します。では、テキストが省略されている場合の予測が低下しないのはなぜですか。私が考えることができる唯一の理由:主に0のtf-idfスパース行列では、非常に多くの用語が0であるため、テキスト間に強い重複があります-回帰は、テキストが高度に相関していると見なします。

すべてを知らなくても、質問に答えてください。ありがとう!

33
Zach

通常、モデルが過剰適合していることをどのように伝えますか?

1つの有用な経験則 は、モデルのパフォーマンスが、それ自体のトレーニングセットで、保持された検証セットまたは相互検証設定よりもはるかに優れている場合、過剰適合になる可能性があるということです。しかし、それだけではありません。

私がリンクしたブログエントリでは、過剰適合をテストする手順について説明しています。トレーニングセットと検証セットのエラーをトレーニングセットのサイズの関数としてプロットします。プロットの右端に安定したギャップが見られる場合は、おそらく過剰適合です。

(この状況で)過剰適合を防ぎ、予測結果が良好かどうかを確認するための最良の方法は何ですか?

保留テストセットを使用します。モデルの選択(ハイパーパラメータ調整)が完全に完了した場合にのみ、このセットの評価を行ってください。トレーニングしたり、(相互)検証で使用したりしないでください。テストセットで得られるスコアは、モデルの最終評価です。これは、検証セットを誤って過剰適合させたかどうかを示しているはずです。

[機械学習会議は、コンテストのように設定されることがあります。この場合、テストセットは、最終モデルを主催者に提供するまで研究者に提供されません。その間、彼らは好きなようにトレーニングセットを使用することができます。交差検定を使用してモデルをテストする。 Kaggle 似たようなことをします。]

LeaveOneOut交差検定を使用する場合、モデルがどのようにオーバーフィットして良好な結果が得られる可能性がありますか?

この相互検証設定では、CVでほぼ完全に機能するまで、モデルを必要なだけ調整できるためです。

極端な例として、本質的に乱数ジェネレーターである推定量を実装したとします。交差検定で非常に低いエラーを生成する「モデル」に到達するまでランダムシードを試し続けることができますが、それは正しいモデルにヒットしません。これは、相互検証に過剰適合していることを意味します。

この興味深いwarstory も参照してください。

34
Fred Foo