異なるテストセットとトレーニングセットの配布


13

テストセットの配布がトレーニングセットとは異なるデータサイエンスコンペティションに取り組んでいます。テストセットによく似たトレーニングセットから観測値をサブサンプリングします。

これどうやってするの?


ランダムアンダーサンプリング、ランダムオーバーサンプリング、クラスターベースのオーバーサンプリング、インフォームドオーバーサンプリング:合成マイノリティオーバーサンプリングテクニック、修正合成マイノリティオーバーサンプリングテクニック(MSMOTE)など
Aditya

いずれか1つでも満足している場合は、回答の1つを「承認済みの回答」としてマークすることをお勧めします。
TwinPenguins

回答:


15

すばらしい質問です。これは、「共変量シフト」、「モデルドリフト」、「非定常性」などの機械学習パラダイムで知られているものです。

将来の予測のための機械学習モデルを構築するために行う重要な前提の1つは、目に見えないデータ(テスト)がトレーニングデータと同じ分布から得られるということです。ただし、実際には、このかなり単純な仮定は簡単に破られ、次のデータ(その分布)は多くの理由で時間とともに変化します。この非常に重要な問題に精通していない可能性がある場合は、ここ参照する投稿してください。

私にとって、あなたの質問は同じカテゴリーに分類されます。私には完璧なソリューション(提供する実装)はありませんが、次のようになると思います。

  • このブログ投稿では、Pythonで提供されるコードを使用してトレーニングデータのサブサンプリングを処理する簡単な方法が提供されます。
  • この研究論文をチェックしてください。彼らは、トレーニングの分布を「カルバック・ライブラー発散」定理に基づくカルバック・ライブラー重要度推定手順を使用したテストの分布に近づけるようにトレーニングデータを再重み付けすることによって問題を解決することを提案します。彼らが実装を提供するのか、それとも簡単に実装できるのかはわかりませんが、ディストリビューションのミスマッチに対処するための専門的な方法のように聞こえるので、掘り下げる価値があると思います。

迅速な更新(良い解決策):それらの重みを見つけるために、その研究論文(最後の点)のKLIEPアルゴリズムのPython実装を見つけました。どちらかというと使いやすいようです!基本的には、(KLIEPアルゴリズムを介して)重みを付けてトレーニングをリサンプリングするため、トレーニングとテストの分布が類似しているという仮定が可能な限り当てはまります。


5

テストセットによく似たトレーニングセットから観測値をサブサンプリングします。

あなたがそうしたいと思うかどうかはわかりません。全体の目的は、アルゴリズムをトレーニングして、目に見えないデータにうまく一般化できるようにすることです。

通常、テストデータをトレーニングデータに適合させる必要があります(たとえば、トレーニングデータに従ってテストデータを標準化するなど)。実際には、テストデータわかりません


3

トレインセットのサブサンプリングは、最善の解決策ではない可能性があります。

テスト/実行セットとトレーニングセットの配布/機能の違いは、教師あり学習タスクで非常によく見られます(これが、Kaggleなどのコンテストが難しい理由の1つです)。そのため、過去のパフォーマンスは将来のパフォーマンスを推定するためのガイドとして(のみ)使用される可能性がありますが、それを示す/保証するものではありません。したがって、一般化可能モデルは、トレイン(サブ)セットでは非常に良好に機能し、見えないデータでは十分に機能しない微調整モデルよりも常に好まれています。

このような違いは正常ですが、過去と未来のサンプル間のギャップが大きすぎることは、それ自体が活発な研究分野である概念ドリフトの例と呼ばれることがあります。あなたの質問を考えると、あなたのケースが通常のMLケースであるか、コンセプトのドリフトが本当に起こっていると判断できません。

これらは私の提案です:

  1. 高い汎化能力を持つ多数のモデルをトレーニングします。トレーニングデータセットからのブートストラップサンプリングを使用すると、エラーのバイアスおよび分散コンポーネントを簡単に計算できます。低バイアスではなく高分散モデル(トレーニング(サブ)セットに適合しすぎる可能性がある)ではなく、分散モデル(データの変更がパフォーマンスにわずかな影響を与える)を探していることを思い出してください。これで、最適なアルゴリズムを選択して、テストセットに対してそれらを評価できます。トレーニング期間中は、テストセットを見ないことに注意してください。

  2. いくつかのランダムなダウンサンプリングの代わりに、標準化/正規化と機能選択/エンジニアリングを探します。これらの手法は、より一般的なモデルの学習に役立つ場合があります。たとえば、分布の形状(それが何であれ)がほとんど同じまま(たとえば、左または右にシフトした同じ分布)でも、特徴領域の範囲が時間とともに変化することがあります。そのような場合、単純な標準化(つまり、異なるマッピング関数を使用してトレインとテストサンプルを[0,1]などの事前定義された空間にマッピングする)により、症状を軽減できます。

  3. 体系的なダウンサンプリングが適切な解決策になるのは、(テストデータセットの精度を向上させる目的だけでなく)問題に関する知識に基づいて行う場合のみです。たとえば、列車データの一部のレコードが遠いフィールドから遠い昔にサンプリングされているか、特定の要因の影響を受けて(テストデータ収集で)将来発生しないことがわかっている場合があります。そのような場合は、将来そのようなパターンが見られなくなると確信しているため、無関係である可能性のあるサンプルを削除することができます(つまり、テストセットを調べるのではなく、トレーニングサブセットの選択の背後にある根拠が必要です。実際には、アクセスできません)。そのような場合、私はそれを異常値除去と呼びます ダウンサンプリングではなく。


1
p(y|x)

-1

Pythonには良いパッケージがあります(scikit学習)

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

このパッケージを使用して、トレーニングセットから観測値をサブサンプリングできます。


1
私が質問を理解している限り、トレイン/テストの分布は異なります。これを考慮しないと、「共変量シフト」と呼ばれるものにつながります。ここで言及されているscikit learnの "train_test_split"実装を使用した単純なサブサンプルは、分割中の分布を考慮していません。したがって、答えは関係ありません。
TwinPenguins 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.