¿Alguien sabe si se ha descrito lo siguiente y (de cualquier manera) si parece un método plausible para aprender un modelo predictivo con una variable objetivo muy desequilibrada?
A menudo, en aplicaciones CRM de minería de datos, buscaremos un modelo en el que el evento positivo (éxito) sea muy raro en relación con la mayoría (clase negativa). Por ejemplo, puedo tener 500,000 instancias donde solo 0.1% son de la clase de interés positiva (por ejemplo, el cliente compró). Entonces, para crear un modelo predictivo, un método es muestrear los datos mediante los cuales se mantienen todas las instancias de clase positiva y solo una muestra de las instancias de clase negativa para que la relación de clase positiva a negativa sea más cercana a 1 (tal vez 25% a 75% positivo a negativo). Sobremuestreo, submuestreo, SMOTE, etc.son todos los métodos en la literatura.
Lo que me interesa es combinar la estrategia de muestreo básica anterior pero con el embolsado de la clase negativa. Algo así como:
- Mantenga todas las instancias de clase positivas (por ejemplo, 1,000)
- Muestree las instancias de clase negativas para crear una muestra equilibrada (por ejemplo, 1,000).
- Ajustar el modelo
- Repetir
¿Alguien ha oído hablar de hacer esto antes? El problema que parece sin embolsar es que muestrear solo 1,000 instancias de la clase negativa cuando hay 500,000 es que el espacio del predictor será escaso y es posible que no tenga una representación de posibles valores / patrones de predictores. El embolsado parece ayudar a esto.
Miré a rpart y nada "se rompe" cuando una de las muestras no tiene todos los valores para un predictor (no se rompe cuando se predicen instancias con esos valores de predictor:
library(rpart)
tree<-rpart(skips ~ PadType,data=solder[solder$PadType !='D6',], method="anova")
predict(tree,newdata=subset(solder,PadType =='D6'))
¿Alguna idea?
ACTUALIZACIÓN: tomé un conjunto de datos del mundo real (datos de respuesta de correo directo de marketing) y lo dividí aleatoriamente en capacitación y validación. Hay 618 predictores y 1 objetivo binario (muy raro).
Training:
Total Cases: 167,923
Cases with Y=1: 521
Validation:
Total Cases: 141,755
Cases with Y=1: 410
Tomé todos los ejemplos positivos (521) del conjunto de entrenamiento y una muestra aleatoria de ejemplos negativos del mismo tamaño para una muestra equilibrada. Encajo en un árbol rpart:
models[[length(models)+1]]<-rpart(Y~.,data=trainSample,method="class")
Repetí este proceso 100 veces. Luego predijo la probabilidad de Y = 1 en los casos de la muestra de validación para cada uno de estos 100 modelos. Simplemente promedié las 100 probabilidades para una estimación final. Decilé las probabilidades en el conjunto de validación y en cada decil calculé el porcentaje de casos donde Y = 1 (el método tradicional para estimar la capacidad de clasificación del modelo).
Result$decile<-as.numeric(cut(Result[,"Score"],breaks=10,labels=1:10))
Aquí está el rendimiento:
Para ver cómo esto se compara con la ausencia de embolsado, predije la muestra de validación solo con la primera muestra (todos los casos positivos y una muestra aleatoria del mismo tamaño). Claramente, los datos muestreados eran demasiado escasos o demasiado ajustados para ser efectivos en la muestra de validación de retención.
Sugiriendo la eficacia de la rutina de ensacado cuando hay un evento raro y grandes n y p.