機能の選択と相互検証


76

私は最近、このサイト(@ Aniko、@ Dikran Marsupial、@ Erik)およびクロス検証で発生する過適合の問題について他の場所で多くのことを読んでいます-(Smialowski et al 2010 Bioinformatics、Hastie、Elements of statistics learning)。提案は、ということである任意の(クラスラベルとの相関を使用して)教師付き特徴選択は、クロスバリデーション(またはブートストラップのような他のモデルの推定方法)を使用して、モデルのパフォーマンス推定の外部で実行オーバーフィッティングをもたらすことができます。

これは私には直感的ではないようです-確かに、機能セットを選択し、クロス検証を使用して選択した機能のみを使用してモデルを評価すると、それらの機能の一般化されたモデルパフォーマンスの公平な推定が得られます(これは調査中のサンプルが代表的であると仮定しています人口の)?

この手順では、もちろん最適な機能セットを要求することはできませんが、目に見えないデータで選択した機能セットのパフォーマンスを有効として報告することはできますか?

データセット全体に基づいて機能を選択すると、テストセットとトレインセット間のデータリークが発生する可能性があることを受け入れます。しかし、最初の選択後に機能セットが静的であり、他の調整が行われていない場合、クロス検証されたパフォーマンスメトリックを報告することは確かに有効ですか?

私の場合、56個の機能と259個のケースがあるため、#cases> #featuresです。機能はセンサーデータから派生します。

私の質問が派生的であるように思える場合はおbutびしますが、これは明確にする重要なポイントのようです。

編集: 上記のデータセットのクロス検証で機能選択を実装すると(以下の回答のおかげで)、このデータセットでクロス検証する前に機能を選択すると、重要な要素が導入されたことを確認できますバイアス。このバイアス/オーバーフィッティングは、2クラスの定式化と比較して、3クラスの定式化で最も大きくなりました。機能選択にステップワイズ回帰を使用したことで、この過剰適合が増加したと思います。比較のために、異なるが関連するデータセットで、クロス検証前に実行された順次順方向特徴選択ルーチンを、CV内の特徴選択で以前に取得した結果と比較しました。両方の方法の結果に劇的な違いはありませんでした。これは、ステップワイズ回帰がシーケンシャルFSよりも過剰適合しやすいことを意味する場合があります。または、このデータセットの奇抜である可能性があります。


7
私はそれが(まったく)何であるとは思わない。提唱しています。一般的な議論は、特徴選択が応答を使用する場合、CVプロシージャの一部として含める方が良いということです。たとえば、標本の分散を調べて、変動が小さい予測子を除外するなど、予測子のスクリーニングを行う場合、ワンショット手順としては問題ありません。
枢機

3
ただし、この場合でも+1は交差選択が特徴選択プロセスの分散を表していないため、特徴選択が不安定な場合に問題になる可能性があります。最初にスクリーニングを実行すると、各フォールドのパフォーマンスの変動は真の変動を十分に表現できなくなります。各フォールドでスクリーニングを実行すると、各フォールドのパフォーマンスのばらつきが適切に増加します。計算コストを払うことができれば、私は常に各フォールドで常にスクリーニングを実行します。
ディクラン有袋類

1
「クロス検証を使用してモデルのパフォーマンスを推定する前に実行される機能の選択は、過剰適合になる可能性があります」と述べています。は、Hastieや他の人が示唆する内容の誤引用または不実表示です。また、この文は、選択された変数の適切性を合法的にテストする唯一の方法であることを示唆しているように思えます。 。
マイケル・Chernick

@MichaelChernick-同意しました。私は自分の意味をよりよく反映するために上記を編集しました。
BGreene

1
@Bgreene:この問題に関する最近の議論があり、goo.gl / C8BUaで読むことができます。
アレック

回答:


69

すべてのデータに対して機能選択を実行してから相互検証を行う場合、相互検証手順の各フォールドのテストデータも使用して機能を選択します。これがパフォーマンス分析のバイアスとなります。

この例を考えてみましょう。コインを10回裏返して、頭か尻尾かを記録して、ターゲットデータを生成します。次に、各機能についてコインを10回反転することで20の機能を生成し、取得したものを書き留めます。次に、ターゲットデータに可能な限り一致するフィーチャを選択してフィーチャ選択を実行し、それを予測として使用します。その後、相互検証を行うと、予想エラー率は0.5よりわずかに低くなります。これは、交差検証手順のすべてのフォールドでトレーニングセットとテストセットの両方に対する相関に基づいて機能を選択したためです。ただし、ターゲットデータは単純にランダムであるため、真のエラー率は0.5になります。交差検定の各フォールド内で独立して機能選択を実行する場合、エラー率の期待値は0です。

重要な考え方は、交差検証はモデルを構築するプロセスの一般化パフォーマンスを推定する方法であるため、各フォールドでプロセス全体を繰り返す必要があるということです。そうしないと、偏った推定値、または推定値の分散の過小推定値(あるいはその両方)になってしまいます。

HTH

以下に、このセットアップのモンテカルロシミュレーションを実行するMATLABコードを示します。56個の機能と259のケースを使用して、例を一致させるために、出力は次のとおりです。

バイアス推定器:erate = 0.429210(0.397683-0.451737)

不偏推定量:erate = 0.499689(0.397683-0.590734)

バイアス推定器は、交差検証の前に特徴選択が実行される推定器であり、不偏推定器は、交差検証の各フォールドで特徴選択が独立して実行される推定器です。これは、学習課題の性質に応じて、この場合バイアスが非常に厳しい可能性があることを示唆しています。

NF    = 56;
NC    = 259;
NFOLD = 10;
NMC   = 1e+4;

% perform Monte-Carlo simulation of biased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform feature selection

   err       = mean(repmat(y,1,NF) ~= x);
   [err,idx] = min(err);

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, '  Biased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

% perform Monte-Carlo simulation of unbiased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      % perform feature selection

      err       = mean(repmat(y(partition~=j),1,NF) ~= x(partition~=j,:));
      [err,idx] = min(err);

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, 'Unbiased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

3
ありがとう-これはとても役に立ちます。提案されたアプローチを採用する場合、最終モデルをどのように評価しますか?複数の機能セットがあるので、最終的な機能セットをどのように選択しますか?歴史的には、選択したモデルパラメーターと機能を使用した単一の相互検証に基づいた結果も報告しました。
-BGreene

16
交差検証は、モデル自体ではなく、モデルを近似する手順のパフォーマンスを評価するものと見なすのが最善です。通常、最善の方法は、上記のように相互検証を実行し、次に相互検証手順の各フォールドで使用される同じ手順を使用して、データセット全体を使用して最終モデルを構築することです。
ディクラン有袋類

2
この場合、クロス検証(潜在的に多くの異なる機能セット)に基づいて分類結果を報告しますが、それらの機能セットの1つのみを含むようにモデルを報告します。
BGreene

10
基本的には、相互検証では、モデル自体ではなく、モデル構築プロセスの予想パフォーマンスのみを推定します。機能セットが相互検証の1つの倍から別の倍に大きく変化する場合、それは機能選択が不安定で、おそらくあまり意味がないことを示しています。多くの場合、特に後者が不安定な場合は、特徴選択ではなく正則化(リッジ回帰など)を使用するのが最適です。
ディクラン有袋類

3
これはとても重要な投稿です。驚くほど多くの人はこれを適用しません。
クリスA.

12

問題の少し異なる、より一般的な説明を追加するには:

データ駆動型の前処理を行う場合、例えば

  1. クロスバリデーション/ブートストラップ外によるパラメータ最適化
  2. モデルの入力を生成するためのPCAまたはPLSなどの手法による次元削減(PLS-LDA、PCA-LDAなど)
  3. ...

また、クロス検証/アウトオブブート(/ホールドアウト)検証を使用して最終モデルのパフォーマンスを推定したい場合は、サロゲートトレーニングデータに対して、つまり各サロゲートモデルに対して個別に、データ駆動型の前処理を行う必要があります。

データ駆動型の前処理がタイプ1の場合、これは「ダブル」または「ネスト」クロス検証につながります。パラメーター推定は、「外部」クロス検証のトレーニングセットのみを使用したクロス検証で行われます。ElemStatLearnには図がありますhttps://web.stanford.edu/~hastie/Papers/ESLII.pdf印刷の5ページの222)。

前処理は、実際にはモデルの構築の一部であると言えます。行われる前処理のみ

  • 個別に各ケースまたは
  • 実際のデータセットとは無関係

検証ループから取り出して計算を節約できます。

逆に、特定のデータセットの外部の知識によってモデルが完全に構築されている場合(たとえば、測定チャネル63-79が問題の解決に役立つとは限らないという専門知識によって事前に決定した場合は、もちろんこれらのチャネルを除外できます) 、モデルを構築し、それをクロス検証。同じことを、あなたはPLS回帰を行い、3つの潜在変数は、合理的な選択である(しかしないことをあなたの経験によって決定した場合ではない 2または5はLVより良い結果を与えるかどうかを中心に遊ぶ)あなたがすることができます通常のブートストラップ/クロス検証を実行してください。


残念ながら、ElemStatLearn本の印刷5へのリンクは機能していません。あなたが参照していたイラストがまだ同じページにあるのではないかと思っていました。キャプションも言及してください。
rraadd88

したがって、2つのデータセットがある場合、その1つで機能の選択/エンジニアリングを行い、もう1つでCVを実行しても問題はありませんか?
ミロス島

1
@Milos:いいえ、これらの機能が相互検証のモデルの固定パラメーターになる限り、それは問題ありません。これは、適切な仮説生成(=データセットAの機能開発)/仮説テスト(=データセットBで現在修正された機能のパフォーマンスの測定)セットアップになります。
cbeleites

@cbeleitesはい、それは私が意図したことです。Aの機能を決定し、それらの機能を修正して、Bのモデルの相互検証を行います。ありがとう。:)
ミロス島

@Milos:ただし、Aでモデルを完全にトレーニングし、テストのみにBを使用する場合、達成されたパフォーマンスに対する議論はさらに優れていることに留意してください。
-cbeleites

5

それを少し直感的にしようとしましょう。この例を考えてみましょう。バイナリ依存と2つのバイナリ予測子があります。予測子が1つだけのモデルが必要です。両方の予測変数には、95%の確率で扶養家族と等しくなる可能性があり、5%の確率で扶養家族と一致しない可能性があります。

現在、偶然データの1つの予測子は97%の時間でデータ全体に依存し、もう1つの予測子は93%の時間でのみに依存しています。97%の予測変数を選択し、モデルを構築します。交差検証の各フォールドでは、モデルが依存する=予測子になります。これはほとんど常に正しいためです。したがって、97%のクロス予測パフォーマンスが得られます。

今、あなたは言うことができます、[OK]それはちょうど不運です。ただし、予測子が上記のように構築されている場合、少なくとも1つの予測子の75%がデータセット全体で95%を超える精度を持つ可能性があり、それが選択されます。そのため、パフォーマンスを過大評価する可能性は75%です。

実際には、効果を推定することは決して簡単ではありません。フィーチャの選択により、データセット全体に対して行った場合と同じように各フォールドで同じフィーチャが選択される可能性があり、バイアスは発生しません。また、サンプルは多いがフィーチャが多い場合、効果は小さくなります。データで両方の方法を使用し、結果がどのように異なるかを確認することは有益です。

また、データの量(20%など)を確保し、80%で相互検証することでパフォーマンスの推定値を取得する方法と正しい方法の両方を使用し、モデルを20脇に置いたデータの割合。これが機能するためには、CVの前に機能の選択がデータの80%で行われる必要があることに注意してください。それ以外の場合は、モデルのサンプル外のデータへの転送をシミュレートしません。


あなたの直感的な例で機能選択を行う正しい方法について詳しく説明していただけますか?ありがとうございました。
uared1776
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.