Czy ktoś wie, czy opisano poniżej (i tak czy inaczej), czy brzmi to jak wiarygodna metoda uczenia się modelu predykcyjnego z bardzo niezrównoważoną zmienną docelową?
Często w aplikacjach CRM do eksploracji danych będziemy szukać modelu, w którym zdarzenie pozytywne (sukces) jest bardzo rzadkie w porównaniu do większości (klasa negatywna). Na przykład mogę mieć 500 000 przypadków, w których tylko 0,1% to dodatnia klasa zainteresowań (np. Kupiony klient). Tak więc, aby stworzyć model predykcyjny, jedną z metod jest próbkowanie danych, dzięki czemu zachowuje się wszystkie instancje klasy dodatniej i tylko próbkę instancji klasy ujemnej, aby stosunek klasy dodatniej do ujemnej był bliższy 1 (może 25% do 75% dodatnich na ujemne). Nadmierne pobieranie próbek, niepełne pobieranie próbek, SMOTE itp. To wszystkie metody w literaturze.
Interesuje mnie połączenie powyższej podstawowej strategii próbkowania, ale z zapakowaniem klasy negatywnej. Po prostu coś takiego:
- Zachowaj wszystkie pozytywne wystąpienia klasy (np. 1000)
- Próbkuj negatywne instancje klasy, aby utworzyć próbkę zrównoważoną (np. 1000).
- Dopasuj model
- Powtarzać
Czy ktoś słyszał o tym wcześniej? Problem, który wydaje się bez spakowania, polega na tym, że próbkowanie tylko 1000 instancji klasy negatywnej, gdy jest ich 500 000, polega na tym, że przestrzeń predyktora będzie rzadka i może nie być reprezentacji możliwych wartości / wzorców predykcyjnych. Wydaje się, że to pomaga w pakowaniu.
Spojrzałem na rpart i nic nie „pęka”, gdy jedna z próbek nie ma wszystkich wartości dla predyktora (nie psuje się, gdy następnie przewiduje wystąpienia z tymi wartościami predyktora:
library(rpart)
tree<-rpart(skips ~ PadType,data=solder[solder$PadType !='D6',], method="anova")
predict(tree,newdata=subset(solder,PadType =='D6'))
jakieś pomysły?
AKTUALIZACJA: Wziąłem zestaw danych ze świata rzeczywistego (dane marketingowe z odpowiedzią bezpośredniej poczty) i losowo podzieliłem go na szkolenie i sprawdzanie poprawności. Istnieje 618 predyktorów i 1 cel binarny (bardzo rzadko).
Training:
Total Cases: 167,923
Cases with Y=1: 521
Validation:
Total Cases: 141,755
Cases with Y=1: 410
Wziąłem wszystkie pozytywne przykłady (521) z zestawu treningowego i losową próbę negatywnych przykładów tego samego rozmiaru dla zrównoważonej próbki. Dopasowuję drzewo Rpart:
models[[length(models)+1]]<-rpart(Y~.,data=trainSample,method="class")
Powtórzyłem ten proces 100 razy. Następnie przewidział prawdopodobieństwo Y = 1 w przypadkach próby walidacji dla każdego z tych 100 modeli. Po prostu uśredniłem 100 prawdopodobieństw dla ostatecznego oszacowania. Decilowałem prawdopodobieństwa na zbiorze walidacyjnym i w każdym decylu obliczałem odsetek przypadków, w których Y = 1 (tradycyjna metoda szacowania zdolności rangowania modelu).
Result$decile<-as.numeric(cut(Result[,"Score"],breaks=10,labels=1:10))
Oto wydajność:
Aby zobaczyć, jak to się porównuje z brakiem spakowania, przewidziałem próbę walidacyjną tylko z pierwszą próbką (wszystkie przypadki dodatnie i losowa próbka tego samego rozmiaru). Oczywiste jest, że próbkowane dane były zbyt rzadkie lub nadmierne, aby mogły być skuteczne w próbie sprawdzania poprawności.
Sugerowanie skuteczności rutynowej procedury workowania, gdy występuje rzadkie zdarzenie i duże ni