Est-ce que quelqu'un sait si ce qui suit a été décrit et (de toute façon) si cela ressemble à une méthode plausible pour apprendre un modèle prédictif avec une variable cible très déséquilibrée?
Souvent dans les applications CRM de data mining, nous chercherons un modèle où l'événement positif (succès) est très rare par rapport à la majorité (classe négative). Par exemple, je peux avoir 500 000 cas où seulement 0,1% sont de la classe d'intérêt positive (par exemple, le client a acheté). Ainsi, afin de créer un modèle prédictif, une méthode consiste à échantillonner les données par lesquelles vous conservez toutes les instances de classe positives et uniquement un échantillon des instances de classe négatives afin que le rapport de la classe positive à la classe négative soit plus proche de 1 (peut-être 25% à 75% de positif à négatif). Le suréchantillonnage, le sous-échantillonnage, SMOTE, etc. sont toutes des méthodes dans la littérature.
Ce qui m'intéresse, c'est de combiner la stratégie d'échantillonnage de base ci-dessus mais avec l'ensachage de la classe négative.
- Conserver toutes les instances de classe positives (par exemple 1 000)
- Échantillonnez les instances de classe négatives afin de créer un échantillon équilibré (par exemple 1 000).
- Adapter le modèle
- Répéter
Quelqu'un a entendu parler de ça avant? Le problème qu'il semble sans ensachage est que l'échantillonnage de seulement 1 000 instances de la classe négative lorsqu'il y en a 500 000 est que l'espace des prédicteurs sera clairsemé et vous risquez de ne pas avoir une représentation des valeurs / modèles de prédicteurs possibles. L'ensachage semble aider cela.
J'ai regardé rpart et rien ne "casse" quand l'un des échantillons n'a pas toutes les valeurs pour un prédicteur (ne se casse pas lors de la prédiction des instances avec ces valeurs de prédicteur:
library(rpart)
tree<-rpart(skips ~ PadType,data=solder[solder$PadType !='D6',], method="anova")
predict(tree,newdata=subset(solder,PadType =='D6'))
Des pensées?
MISE À JOUR: J'ai pris un ensemble de données du monde réel (données de réponse de marketing direct) et je l'ai partitionné au hasard en formation et validation. Il existe 618 prédicteurs et 1 cible binaire (très rare).
Training:
Total Cases: 167,923
Cases with Y=1: 521
Validation:
Total Cases: 141,755
Cases with Y=1: 410
J'ai pris tous les exemples positifs (521) de l'ensemble d'entraînement et un échantillon aléatoire d'exemples négatifs de la même taille pour un échantillon équilibré. J'adapte un arbre rpart:
models[[length(models)+1]]<-rpart(Y~.,data=trainSample,method="class")
J'ai répété ce processus 100 fois. Puis a prédit la probabilité de Y = 1 sur les cas de l'échantillon de validation pour chacun de ces 100 modèles. J'ai simplement fait la moyenne des 100 probabilités pour une estimation finale. J'ai décilé les probabilités sur l'ensemble de validation et calculé dans chaque décile le pourcentage de cas où Y = 1 (la méthode traditionnelle pour estimer la capacité de classement du modèle).
Result$decile<-as.numeric(cut(Result[,"Score"],breaks=10,labels=1:10))
Voici la performance:
Pour voir comment cela se comparait à l'absence d'ensachage, j'ai prédit l'échantillon de validation avec le premier échantillon uniquement (tous les cas positifs et un échantillon aléatoire de la même taille). De toute évidence, les données échantillonnées étaient trop clairsemées ou trop ajustées pour être efficaces sur l'échantillon de validation retenu.
Suggérant l'efficacité de la routine d'ensachage en cas d'événement rare et de grand n et p.
la source