Qualcuno sa se è stato descritto quanto segue e (in entrambi i casi) se sembra un metodo plausibile per l'apprendimento di un modello predittivo con una variabile target molto sbilanciata?
Spesso nelle applicazioni CRM di data mining, cercheremo un modello in cui l'evento positivo (successo) è molto raro rispetto alla maggioranza (classe negativa). Ad esempio, potrei avere 500.000 casi in cui solo lo 0,1% appartiene alla classe di interesse positiva (ad es. Il cliente ha acquistato). Quindi, al fine di creare un modello predittivo, un metodo è quello di campionare i dati per cui si mantengono tutte le istanze di classe positive e solo un campione delle istanze di classe negativa in modo che il rapporto tra classe positiva e negativa sia più vicino a 1 (forse il 25% al 75% da positivo a negativo). Sopra campionamento, sottocampionamento, SMOTE ecc. Sono tutti i metodi in letteratura.
Ciò di cui sono curioso è combinare la strategia di campionamento di base sopra ma con l'inserimento della classe negativa. Qualcosa semplicemente come:
- Mantieni tutte le istanze di classe positive (ad es. 1.000)
- Campionare le istanze di classe negative per creare un campione bilanciato (ad es. 1.000).
- Montare il modello
- Ripetere
Qualcuno ha sentito parlare di questo prima? Il problema che sembra senza insaccare è che campionare solo 1.000 istanze della classe negativa quando ci sono 500.000 è che lo spazio del predittore sarà scarso e potresti non avere una rappresentazione di possibili valori / modelli di predittore. Il bagging sembra aiutare questo.
Ho osservato rpart e nulla "si interrompe" quando uno dei campioni non ha tutti i valori per un predittore (non si interrompe quando si predicono quindi le istanze con quei valori del predittore:
library(rpart)
tree<-rpart(skips ~ PadType,data=solder[solder$PadType !='D6',], method="anova")
predict(tree,newdata=subset(solder,PadType =='D6'))
qualche idea?
AGGIORNAMENTO: ho preso un set di dati del mondo reale (marketing dei dati di risposta alla posta diretta) e l'ho suddiviso casualmente in formazione e convalida. Ci sono 618 predittori e 1 obiettivo binario (molto raro).
Training:
Total Cases: 167,923
Cases with Y=1: 521
Validation:
Total Cases: 141,755
Cases with Y=1: 410
Ho preso tutti gli esempi positivi (521) dal set di addestramento e un campione casuale di esempi negativi della stessa dimensione per un campione bilanciato. Mi adatto ad un albero rpart:
models[[length(models)+1]]<-rpart(Y~.,data=trainSample,method="class")
Ho ripetuto questo processo 100 volte. Quindi ha previsto la probabilità di Y = 1 sui casi del campione di validazione per ciascuno di questi 100 modelli. Ho semplicemente calcolato la media delle 100 probabilità per una stima finale. Ho decilato le probabilità sul set di validazione e in ogni decile ho calcolato la percentuale di casi in cui Y = 1 (il metodo tradizionale per stimare la capacità di classificazione del modello).
Result$decile<-as.numeric(cut(Result[,"Score"],breaks=10,labels=1:10))
Ecco la performance:

Per vedere come questo rispetto a nessun insaccamento, ho previsto il campione di convalida solo con il primo campione (tutti i casi positivi e un campione casuale della stessa dimensione). Chiaramente, i dati campionati erano troppo scarsi o troppo adatti per essere efficaci sul campione di validazione.
Suggerendo l'efficacia della routine di insaccamento quando si verifica un evento raro e n e p di grandi dimensioni.
