クラスのバランスが取れていない場合、検証/テストデータセットでサンプリングを使用する必要がありますか?


13

私は機械学習の初心者であり、状況に直面しています。IPinYouデータセットを使用してリアルタイム入札の問題に取り組んでおり、クリック予測をしようとしています。

知っているかもしれませんが、データセットは非常に不均衡です。1つのポジティブな例(クリック)に対して約1300のネガティブな例(クリックなし)です。

これが私がすることです:

  1. データを読み込む
  2. データセットを3つのデータセットに分割します。A=トレーニング(60%)B =検証(20%)C =テスト(20%)
  3. 各データセット(A、B、C)について、比率が5になるように各ネガティブクラスでアンダーサンプリングを行います(1つのポジティブな例に対して5つのネガティブな例)。これにより、よりバランスのとれた3つの新しいデータセットが得られます。A 'B' C '

次に、データセットA 'とロジスティック回帰を使用してモデルをトレーニングします。

私の質問は:

  1. どのデータセットを検証に使用する必要がありますか?BまたはB '?

  2. どのデータセットをテストに使用する必要がありますか?CまたはC '

  3. モデルの評価に最も関連するメトリックはどれですか?F1Scoreはよく使用されるメトリックのようです。しかし、ここでは不均衡なクラスのため(データセットBとCを使用する場合)、精度は低く(0.20未満)、F1Scoreは低いリコール/精度の影響を非常に受けます。aucPRまたはaucROCを使用する方が正確ですか?

  4. 学習曲線をプロットする場合、どのメトリックスを使用すればよいですか?(検証にB 'データセットを使用する場合、%errorは関係ないことを知っています)

お時間をいただきありがとうございます!

よろしく。

回答:


9

すばらしい質問...番号付きの質問に対する具体的な回答を次に示します。

1)B`ではなくBで相互検証する必要があります。そうしないと、クラスバランシングがどの程度うまく機能しているかわかりません。B B`の両方で相互検証を行うことは害にならず、以下の4の答えに基づいて役立ちます。

2) 以下の4に基づいて、CとC`の両方でテストする必要があります。

3)私はF1に固執しますが、ROC-AUCを使用すると便利な場合があり、これにより適切な健全性チェックが提供されます。両方とも、不均衡なクラスで役立つ傾向があります。

4)これは本当にトリッキーになります。これに伴う問題は、最良の方法では、学習曲線がどのように見えるかを再解釈するか、再サンプリングされたデータセットと元のデータセットの両方を使用する必要があることです。

学習曲線の古典的な解釈は次のとおりです。

  • オーバーフィット -ラインは完全に一致しません。
  • アンダーフィット -ラインは揃っていますが、F1スコアが低すぎます。
  • ちょうどいい -線は合理的なF1スコアでまとめられます。

これで、Aでトレーニングし、Cでテストしている場合、ラインが完全に一致することはありません。A`でトレーニングし、C`でテストしている場合、結果は元の問題のコンテキストでは意味がありません。それで、あなたは何をしますか?

答えは、A`でトレーニングし、B`でテストするだけでなく、Bでもテストすることです。希望する場所でB`のF1スコアを取得し、BのF1スコアを確認します。その後、テストを行い、学習曲線を生成しますCの場合、曲線は一緒になりませんが、許容バイアスの感覚が得られます。F1(B)とF1(B`)の違いです。

現在、学習曲線の新しい解釈は次のとおりです。

  • オーバーフィット -ラインは一緒にならず、F1(B`)-F1(B)よりも離れています。
  • アンダーフィット -線は合わないが、差はF1(B`)-F1(B)より小さく、F1(C)スコアはF1(B)未満です。
  • ちょうどいい -線は合わないが、差はF1(B)に近いF1(C)スコアでF1(B`)-F1(B)より小さい。

一般:不均衡なクラスについては、上記で説明した厳格なモラルをすべて回避するため、最初にオーバー/アンダーサンプリングの代わりに学習アルゴリズムでクラスの重みを調整することを強くお勧めします。scikit-learnのようなライブラリでは非常に簡単で、シグモイド関数や多数決を使用するものであれば何でも簡単にコードを渡すことができます。

お役に立てれば!


@ AN605に感謝します。それはあなたのとても素敵です!いくつかの質問があります:4)-「A 'でトレーニングし、B'でテストする」と言うとき、あなたは検証を意味しますか?-「Cの学習曲線を生成する」および「F1(C)スコアがF1(B)未満/類似している」。ただし、学習曲線については、トレーニングセットのエラーメトリック(ここではAまたはA ')と検証セットのエラーメトリック(BまたはB')のみをプロットする必要がありました。ここでCを「検証」しませんか?
jmvllt

「クラスの重み」の使用について、間違っている場合は修正します(簡単に見てみました)が、このトリックは、係数の前に係数/重み「k」を追加してコスト関数を「変更」することを伴います不均衡なクラスですよね?:􏲏Cost(h(x)、y)= -y * k * log(h(x))-(1-y)* log((h(x))そのように、アルゴリズムは誤分類を考慮する必要がありますしかし、問題は、Apache SparkとMLlibを使用してすべてのモデルを構築する必要があることです。また、sparkを使用してコスト関数を簡単に変更できるかどうかはわかりません。時間!
jmvllt

5

とのため1)2)、あなたがしたい

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

そのため、これらのデータセットの場合、クラスのバランスを取る必要はありません。

アンダーサンプリング/オーバーサンプリングの代わりにクラスの重みを使用することもできます。これにより、この決定が処理されます。

以下のために3)、あなたはおそらく(それが競争の場合)あなたがで採点されるメトリック何でも使用して最適化したいです。しかし、それが考慮事項でない場合、これらのモデルはすべて適切な選択です。F1は低精度の影響を受ける可能性がありますが、キャプチャする必要があります。F1のようなスコアが関連するのは、ナイーブモデル(多数派クラスの推測など)がいくつかのメトリックによって適切にスコアリングできるときです。

4)あなたが最適化してしまうメトリック方の上映と何も間違っています。


こんにちは@jamesmf、そのクールな答えに感謝します。F1Scoreの場合、私が抱えていた問題は、False NegativeよりもFalse Positiveを排除することにもっと集中したいということです。精度とリコールの計算でFPとFNに異なる「重み」を追加するのは正しいでしょうか?
jmvllt

それは理にかなっています。また、クラスの重み付けの説明は正確であり、MLibに実装されているようには見えませんが、機能のリクエストに値する可能性があります
-jamesmf

ジェームス、ありがとう!私は現在、LogisticGradientクラスを拡張し、computeメソッドを上書きすることで、自分でそれをしようとしています。これで良い結果が得られたらお知らせします。良い一日を過ごしてください。
jmvllt

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.