エンコーディングと相互検証
最近、相互検証スキーム内でのエンコーディングの適切な使用について考えています。機能をエンコードするための通常のアドバイス方法は次のとおりです。
- データをトレインとテスト(ホールドアウト)セットに分割します
- エンコーダー(
LabelEncoder
またはのいずれかOneHotEncoder
)を列車セットに取り付けます - 取り付けられたエンコーダーを使用して、トレインとテストセットの両方を変換します。
この方法は、データ漏えいを防ぐと主張されています。ただし、これは相互検証中に省略されることが多いようです。前述の列車セットで交差検定を実行しているとしましょう。トレインセットをエンコードしてから相互検証を実行すると、上記の手順を実際には模倣しません。その場合、エンコードは相互検証の「範囲内」で実行されるべきではありませんか?たとえば、5分割交差検定を実行すると仮定すると、各交差検定ステップでエンコーダーを4分割に適合させ、5分割で変換する必要がありますか?これは通常ターゲットエンコーディングで行われることだと思いますが、ラベルやワンホットエンコーディングでは実際には行われません。
したがって、私の質問は次のとおりです。
- 本当に過剰適合を防ぎたいのであれば、各交差検定ステップの5番目の検証フォールドではなく4つのフォールドにエンコーダーを取り付ける必要性について正しいですか?
- そうでない場合、トレインとテスト(ホールドアウト)セットを処理するときに、前述の3つのステップすべてを実行する必要があるのはなぜですか?
回答
確かに、エンコード手順自体がデータ漏洩の原因となる可能性があり、通常は、説明したように、現在のトレーニングセットのみを使用してCVループ内で実行する必要があります。
その理由は確かにあなたがコメントで言及しているものです:CV中に特定のトレーニングセットに偶然に表示されないクラスラベルまたは機能カテゴリがある場合、モデルはこのクラス/カテゴリでさえ知らないはずです存在します。
一般に、この問題はテストセットのパフォーマンスを低下させるだけだと思うので、おそらく他の種類のデータ漏洩ほど深刻ではありません。それでも、トレーニングセットのみを使用してエンコードすることは間違いなくよりクリーンな実験計画です。
NLPで密接に関連する問題は、システムが語彙外(OOV)単語を処理するように設計されていない場合です。トレーニングセットとテストセットの両方のすべての単語がエンコードされている場合(同じ間違い)、誤って表示されます。すべてのテキストは完全にエンコードされる可能性があり、後で悪い驚きを引き起こす可能性があります。
そうは言っても、通常はまれな機能やラベル値を破棄することをお勧めします。これを行うと、適切な方法または雑な方法を使用しても結果は同じになります。