まず、トレーニング セットとテスト セットの分布が一貫している必要があるのはなぜですか。
トレーニング セットとテスト セットの分布は一貫性がありません。つまり、データ セットがオフセットされており、その一様な分割と一様な分布は、最終的なモデルの予測結果に影響を与えます。もちろん、将来登場する可能性のある、より堅牢でよりスマートなモデル ネットワークとアルゴリズムでは、ネットワークの堅牢性と実際の有効性を高めるために、この一貫性のない分割が必要になる可能性がありますが、現時点では、それは私たちのモデルには影響しません。大きな影響があり、テスト セットの予測が送信された後のスコアの低下につながり、満足のいく結果が得られません。
それには主に 2 つの理由があります (さまざまな理由があります)。
- サンプル選択バイアス: トレーニング セットは、不均一な選択 (Non-uniform Selection) などのバイアスのある方法で取得され、その結果、トレーニング セットでは適切に表現できない実際のサンプル空間が生成されます。
- 環境の不均衡 (つまり、時間と空間が異なれば状況も異なります) : この問題は、通常は時間または空間の変化により、トレーニング セット データの収集環境がテスト セットと一致しない場合に発生します。
たとえば、分類 (画像分類、NLP 分類など) タスクでは、データ セットまたは元のデータ セット自体のランダムな分割では、クラス バランスの問題が考慮されていません。セットとテスト セットを比較すると、カテゴリ 1 がカテゴリ 2 よりはるかに大きい、またはトレーニング セット内の特定の種類のデータが大部分または少数を占めているのに対し、この種類のデータのテスト セットが大部分を占めている場合、など。この種のサンプル選択バイアスの問題は、トレーニング セットがサンプル空間全体を十分にカバーしていないため、テスト セットでトレーニングされたモデルのロバスト性の低下につながります。さらに、ターゲット変数に加えて、入力特徴にもサンプル選択バイアスの問題がある可能性があります。たとえば、タイタニック号の乗客の生存率を予測する場合、トレーニング セットの入力特徴は「性別」の下で男性が多くなります。テスト セットの「性別」は女性のほうが多く、これもテスト セットでのモデルのパフォーマンスが低下する原因になります。入力特徴によって生じる偏差の主な原因は、特徴エンジニアリング段階でデータ セットが適切に処理されないため、テスト セットでのスコアが低くなり、モデルのロバスト性が低下します。
環境の不均衡によって生じた一部の月のデータに関しては、これは主にデータ収集中のさまざまな客観的および主観的要因の影響によるものであり、データの不一致につながります。
2つ目は、どうやって判断するか
- KDE (カーネル密度推定) 分布プロット
KDE は、分布が不明な密度関数を推定するためのノンパラメトリック テストです。確率密度関数ヒストグラムやカーネル密度推定グラフを描いてデータセット内のトレーニングセットとテストセットの分布を比較観察することで、両者の分布を直感的に観察できます。
#主に使用する関数:sns.kdeplot()
サンプルコード:
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 创建样例特征
train_mean, train_cov = [0, 2], [(1, .5), (.5, 1)]
test_mean, test_cov = [0, .5], [(1, 1), (.6, 1)]
train_feat, _ = np.random.multivariate_normal(train_mean, train_cov, size=50).T
test_feat, _ = np.random.multivariate_normal(test_mean, test_cov, size=50).T
# 绘KDE对比分布
sns.kdeplot(train_feat, shade = True, color='r', label = 'train')
sns.kdeplot(test_feat, shade = True, color='b', label = 'test')
plt.xlabel('Feature')
plt.legend()
plt.show()
- KS テスト
KS テストもノンパラメトリック検定方法です (つまり、データ分布を知らずに検定が実行されます)。CDF (累積分布関数) に基づいて、2 つのデータセット間の分布が一貫しているかどうかをテストします。
例:
上の図に示すように、この図は 2 つの異なるデータセットでの CDF 曲線を示しており、図の最大垂直方向の差を使用して分布の差を説明できます。
#主に使用する関数:scipy.stats.ks_2samp()[ KS(最大垂直差分)の統計値と仮説検定のp値を取得するために使用]
コード:
from scipy import stats
stats.ks_2samp(train_feat,test_feat)
KS 統計値が小さく、p 値が大きい場合、帰無仮説 H0 が受け入れられます。つまり、2 つのデータ分布が一致しています。p 値が <0.01 の場合、帰無仮説は棄却されます。
- 敵対的検証
トレーニング セットとテスト セットを分類するための分類器を構築します モデルが明確に分類できた場合、トレーニング セットとテスト セットの間に明確な違いがある (つまり、分布が一致していない) ことを意味します
(1) トレーニング セットとテスト セットがマージされ、トレーニング セットのサンプルを 0、テスト セットのサンプルを 1 としてマークするラベル「Is_Test」が追加されます。
(2) 混合データセットをトレーニングするための分類器 (LGB、XGB など) を構築し (相互検証を使用できます)、ターゲット ラベル 'Is_Test' を適合させます。
(3) 交差検証で最適な AUC スコアを出力します。AUC が大きいほど (1 に近づくほど)、トレーニング セットとテスト セットの分布の不一致が大きくなります。
第三に、データセットの分散の不一致を解決する方法
- 適切な検証セットの構築 (テスト セットの配布と同様の検証セットを構築するため)
(1) 時系列を例として検証セットを手動で分割します。一般的なテスト セットも将来のデータになるため、トレーニング セットが履歴データであり、分割された検証セットが将来のデータであることも確認する必要があります。「タイムトラベル」が発生する データ漏洩の問題により、モデルが過剰適合してしまう(過去のデータを予測するために未来を使うなど) 現時点で参考にできる検証分割方法は2つあります。
a. TimeSeriesSplit: b. Sklearn によって提供される TimeSeriesSplit
。
固定ウィンドウ スライディング分割法: 固定時間ウィンドウ、データ セット上で継続的にスライディングして、トレーニング セットと検証セットを取得します。
時系列データに加えて、他のデータセットの検証セット分割も、テストセットのデータパターンに可能な限り一致するという原則に従う必要があります。
(2)テストセットに最も類似したサンプルを検証セットとして選択します
敵対的検証では、トレーニング セットとテスト セットを分類するために分類器をトレーニングします。その後、当然のことながら、トレーニング セットがテスト セットに属する確率も予測できます (つまり、トレーニング セットは「Is_Test」ラベルの下で確率を予測します) )、トレーニング セット 予測確率を降順に並べ替え、確率が最も高い上位 20% のサンプル部分が検証セットとして選択されるため、テスト セットに近い分布を持つ検証セットを取得できます。元のデータセット。その後、分割した検証セットとテストセットの分布を評価することもできます **評価方法: **検証セットとテストセットに対して敵対的検証を行い、AUCが小さいほど分割した検証セットの分布を示します近いほど (つまり、分類子と検証セットとテスト セットの区別がつきにくくなります)。
(3)重み付けされた相互検証
トレーニング セット内の分布がテスト セットの分布に偏っているサンプルに大きなサンプルの重みを与え、トレーニング セット内のテスト セットの分布と一致しないサンプルに小さな重みを与えると、オフラインでもジッターをある程度軽減するのに役立ちます。lightgbm ライブラリのデータセット初期化パラメータには、重み付きパラメータの重みのサンプルが提供されています。詳細については、ドキュメント [8] を参照してください。図 7 では、検証に対して分類器によって予測されたトレーニング セットの Is_Test 確率を重みとして使用できます。
- 分散が一貫していない機能を削除する
分散が一貫していないフィーチャや重要度の低いフィーチャが見つかった場合は、そのようなフィーチャを直接削除することを選択できます。
分布にばらつきがあるものの重要度が高い特徴については、実態に応じて特徴の分布と特徴の重要度の関係を調整し、一定の処理を行う必要があります。
- 一貫性のない分布を持つ予測出力を修正
ターゲット フィーチャの分布を調べて、修正の余地があるかどうかを確認します。つまり、トレーニング後のモデル結果に対して補正処理が行われます。(より良い、より効率的な結果を得るために、それに応じて調整してください)
- 一貫性のない分布を持つ特徴量入力を修正する
トレーニング セットとテスト セットの KDE (カーネル密度確率マップ) を比較して観察するときに、データに対する数学的演算 (加算、減算、乗算、除算など) またはサンプルの追加と削除によって修正できることが判明した場合は、このような前処理は、モデルをより適切にトレーニングするために行われます。
- 擬似ラベル
擬似ラベル付けは、ラベルなしのデータをトレーニングに利用する半教師あり手法です。
一般的な方法と手順:
(1) ラベル付きトレーニング セットを使用してモデル M をトレーニングします。
(2) 次に、モデル M を使用して、ラベルのないテスト セットを予測します。
(3) テスト セット内で予測信頼度の高いサンプルを選択してトレーニング セットに追加します。
(4) ラベル付きサンプルと信頼性の高い予測サンプルを使用してモデル M' をトレーニングします。
(5) テストセットを予測し、予測結果を出力します。
モデルのトレーニングでは、テスト セットのいくつかのサンプルが導入されます。これは、テスト セットの分布の一部を導入することに相当します。ただし、次の点に注意してください: (1) 前の方法と比較すると、擬似ラベルは通常、あまり良好なパフォーマンスを発揮しません。これは、高い信頼度でテスト セット サンプルを導入しており、これらのサンプルはトレーニング セットの分布に近い可能性が高いためです。 、そうなります 予測確率は高いです。したがって、導入されたテスト セットの分布はあまり変わらないため、使用すると過学習が発生することがよくあります。(2) 信頼度の高いサンプルを導入しているため、信頼度の低いサンプルを導入するとノイズが多くなることに注意してください。さらに、モデルの過学習を避けるためにも、トレーニング セットに追加する信頼性の高いサンプルを選択しすぎることはお勧めできません。(3) 擬似ラベルは画像ドメインにもう少し適用されます。
原文:
リンク
この記事は学習記録と共有、侵入、削除のみを目的としています。