次のものが記述されているかどうか、また(どちらにしても)ターゲット変数が非常に不均衡な予測モデルを学習するためのもっともらしい方法のように聞こえるかどうか、誰もが知っていますか?
データマイニングのCRMアプリケーションでは、多くの場合、ポジティブイベント(成功)が多数派(ネガティブクラス)に比べて非常にまれなモデルを探します。たとえば、肯定的な興味のあるクラス(例:顧客が購入した)が0.1%だけである500,000のインスタンスがあるとします。したがって、予測モデルを作成するための1つの方法は、データをサンプリングすることです。これにより、すべてのポジティブクラスインスタンスとネガティブクラスインスタンスのサンプルのみを保持し、ポジティブクラスとネガティブクラスの比率が1に近くなります(おそらく25%プラスからマイナス75%)。オーバーサンプリング、アンダーサンプリング、SMOTEなどはすべて、文献の方法です。
私が興味を持っているのは、上記の基本的なサンプリング戦略と、ネガティブクラスのバギングを組み合わせることです。
- すべてのポジティブクラスインスタンスを保持する(例:1,000)
- バランスの取れたサンプル(たとえば1,000)を作成するために、ネガティブクラスインスタンスをサンプリングします。
- モデルを適合させる
- 繰り返す
前にこれを行うことを聞いた人はいますか?バギングがないと思われる問題は、500,000の場合にネガティブクラスの1,000インスタンスのみをサンプリングすると、予測子スペースがまばらになり、予測子の値/パターンの表現がない可能性があることです。バギングはこれに役立つようです。
サンプルの1つに予測変数のすべての値が含まれていない場合、rpartを見て、「壊れない」ことを確認しました(これらの予測変数の値を使用してインスタンスを予測するときに壊れません:
library(rpart)
tree<-rpart(skips ~ PadType,data=solder[solder$PadType !='D6',], method="anova")
predict(tree,newdata=subset(solder,PadType =='D6'))
何かご意見は?
更新: 現実世界のデータセット(ダイレクトメール応答データのマーケティング)を取得し、それをトレーニングと検証にランダムに分割しました。618個の予測変数と1つのバイナリターゲットがあります(非常にまれです)。
Training:
Total Cases: 167,923
Cases with Y=1: 521
Validation:
Total Cases: 141,755
Cases with Y=1: 410
トレーニングセットからすべての肯定的な例(521)と、バランスの取れたサンプルに対して同じサイズの否定的な例のランダムサンプルを取りました。私はrpartツリーに適合します:
models[[length(models)+1]]<-rpart(Y~.,data=trainSample,method="class")
このプロセスを100回繰り返しました。次に、これらの100個のモデルそれぞれの検証サンプルのケースでY = 1の確率を予測しました。最終的な推定のために、100個の確率を単純に平均しました。検証セットの確率を調整し、各十分位数で、Y = 1(モデルのランキング能力を推定するための従来の方法)のケースの割合を計算しました。
Result$decile<-as.numeric(cut(Result[,"Score"],breaks=10,labels=1:10))
パフォーマンスは次のとおりです。
これをバギングなしと比較する方法を確認するために、最初のサンプルのみで検証サンプルを予測しました(すべての陽性例と同じサイズのランダムサンプル)。明らかに、サンプリングされたデータはあまりにもまばらであるか、適合しすぎて、検証サンプルを有効にするには有効ではありません。
まれなイベントと大きなnおよびpがある場合のバギングルーチンの有効性の提案。