Alguém sabe se o seguinte foi descrito e (de qualquer maneira) se parece um método plausível para aprender um modelo preditivo com uma variável-alvo muito desequilibrada?
Freqüentemente, em aplicativos de CRM para mineração de dados, procuraremos um modelo em que o evento positivo (sucesso) seja muito raro em relação à maioria (classe negativa). Por exemplo, eu posso ter 500.000 instâncias em que apenas 0,1% são da classe de interesse positiva (por exemplo, o cliente comprou). Portanto, para criar um modelo preditivo, um método é amostrar os dados nos quais você mantém todas as instâncias de classe positiva e apenas uma amostra das instâncias de classe negativa, para que a proporção de classe positiva para negativa seja mais próxima de 1 (talvez 25% 75% positivo a negativo). Sobre amostragem, subamostragem, SMOTE etc são todos os métodos da literatura.
O que me interessa é combinar a estratégia básica de amostragem acima, mas com ensacamento da classe negativa.
- Mantenha todas as instâncias de classe positivas (por exemplo, 1.000)
- Faça uma amostra das instâncias de classe negativa para criar uma amostra equilibrada (por exemplo, 1.000).
- Ajuste o modelo
- Repetir
Alguém já ouviu falar disso antes? O problema que parece sem empacotar é que a amostragem de apenas 1.000 instâncias da classe negativa quando existem 500.000 é que o espaço do preditor será escasso e é possível que você não tenha uma representação dos possíveis valores / padrões do preditor. Ensacamento parece ajudar isso.
Eu olhei para o rpart e nada "quebra" quando uma das amostras não possui todos os valores de um preditor (não quebra ao prever as instâncias com esses valores do preditor:
library(rpart)
tree<-rpart(skips ~ PadType,data=solder[solder$PadType !='D6',], method="anova")
predict(tree,newdata=subset(solder,PadType =='D6'))
Alguma ideia?
ATUALIZAÇÃO: Peguei um conjunto de dados do mundo real (dados de resposta de mala direta de marketing) e o particionei aleatoriamente em treinamento e validação. Existem 618 preditores e 1 alvo binário (muito raro).
Training:
Total Cases: 167,923
Cases with Y=1: 521
Validation:
Total Cases: 141,755
Cases with Y=1: 410
Tirei todos os exemplos positivos (521) do conjunto de treinamento e uma amostra aleatória de exemplos negativos do mesmo tamanho para uma amostra equilibrada. Eu encaixo uma árvore rpart:
models[[length(models)+1]]<-rpart(Y~.,data=trainSample,method="class")
Repeti esse processo 100 vezes. Em seguida, previu a probabilidade de Y = 1 nos casos da amostra de validação para cada um desses 100 modelos. Simplesmente calculei a média das 100 probabilidades para uma estimativa final. Decililei as probabilidades no conjunto de validação e, em cada decil, calculei a porcentagem de casos em que Y = 1 (o método tradicional para estimar a capacidade de classificação do modelo).
Result$decile<-as.numeric(cut(Result[,"Score"],breaks=10,labels=1:10))
Aqui está o desempenho:
Para ver como isso se comparava a não ensacamento, previ a amostra de validação apenas com a primeira amostra (todos os casos positivos e uma amostra aleatória do mesmo tamanho). Claramente, os dados amostrados eram muito escassos ou superestimados para serem eficazes na amostra de validação de espera.
Sugerir a eficácia da rotina de ensacamento quando houver um evento raro e grandes n e p.