Prawidłowo wykonany losowy las zastosowany do problemu, który jest bardziej „losowy odpowiedni dla lasu”, może działać jako filtr do usuwania szumu i uzyskiwania wyników, które są bardziej przydatne jako dane wejściowe do innych narzędzi analitycznych.
Zastrzeżenia:
- Czy to „srebrna kula”? Nie ma mowy. Przebieg będzie się różnić. Działa tam, gdzie działa, a nie gdzie indziej.
- Czy istnieją sposoby, w jakie można błędnie i rażąco użyć go i uzyskać odpowiedzi, które znajdują się w domenie śmieci-do-voodoo? youbetcha. Jak każde narzędzie analityczne ma ograniczenia.
- Jeśli polizasz żabę, czy twój oddech będzie pachniał jak żaba? prawdopodobne. Nie mam tam doświadczenia.
Muszę „wykrzyczeć” moim „podglądaczom”, którzy stworzyli „Pająka”. ( link ) Ich przykładowy problem świadczył o moim podejściu. ( link ) Uwielbiam także estymatory Theil-Sen i chciałbym dać rekwizyty Theilowi i Senowi.
Moja odpowiedź nie dotyczy tego, jak to zrobić źle, ale tego, jak może działać, jeśli masz rację. Chociaż używam „trywialnego” hałasu, chcę, abyś pomyślał o „nietrywialnym” lub „ustrukturyzowanym” hałasie.
Jedną z mocnych stron losowego lasu jest to, jak dobrze stosuje się do problemów wielowymiarowych. Nie mogę pokazać 20 tys. Kolumn (czyli przestrzeni 20 tys. Wymiarów) w przejrzysty sposób. To nie jest łatwe zadanie. Jeśli jednak masz problem z wymiarami 20k, losowy las może być dobrym narzędziem, gdy większość innych pada płasko na swoje „twarze”.
Jest to przykład usuwania szumu z sygnału za pomocą losowego lasu.
#housekeeping
rm(list=ls())
#library
library(randomForest)
#for reproducibility
set.seed(08012015)
#basic
n <- 1:2000
r <- 0.05*n +1
th <- n*(4*pi)/max(n)
#polar to cartesian
x1=r*cos(th)
y1=r*sin(th)
#add noise
x2 <- x1+0.1*r*runif(min = -1,max = 1,n=length(n))
y2 <- y1+0.1*r*runif(min = -1,max = 1,n=length(n))
#append salt and pepper
x3 <- runif(min = min(x2),max = max(x2),n=length(n)/2)
y3 <- runif(min = min(y2),max = max(y2),n=length(n)/2)
x4 <- c(x2,x3)
y4 <- c(y2,y3)
z4 <- as.vector(matrix(1,nrow=length(x4)))
#plot class "A" derivation
plot(x1,y1,pch=18,type="l",col="Red", lwd=2)
points(x2,y2)
points(x3,y3,pch=18,col="Blue")
legend(x = 65,y=65,legend = c("true","sampled","false"),
col = c("Red","Black","Blue"),lty = c(1,-1,-1),pch=c(-1,1,18))
Pozwól mi opisać, co się tutaj dzieje. Poniższy obraz pokazuje dane treningowe dla klasy „1”. Klasa „2” jest jednolita losowo w tej samej dziedzinie i zakresie. Widać, że „informacja” z „1” jest głównie spiralą, ale została zepsuta materiałem z „2”. Uszkodzenie 33% danych może stanowić problem dla wielu narzędzi do dopasowania. Theil-Sen zaczyna degradować się o około 29%. ( link )
Teraz rozdzielamy informacje, mając jedynie pojęcie, czym jest hałas.
#Create "B" class of uniform noise
x5 <- runif(min = min(x4),max = max(x4),n=length(x4))
y5 <- runif(min = min(y4),max = max(y4),n=length(x4))
z5 <- 2*z4
#assemble data into frame
data <- data.frame(c(x4,x5),c(y4,y5),as.factor(c(z4,z5)))
names(data) <- c("x","y","z")
#train random forest - I like h2o, but this is textbook Breimann
fit.rf <- randomForest(z~.,data=data,
ntree = 1000, replace=TRUE, nodesize = 20)
data2 <- predict(fit.rf,newdata=data[data$z==1,c(1,2)],type="response")
#separate class "1" from training data
idx1a <- which(data[,3]==1)
#separate class "1" from the predicted data
idx1b <- which(data2==1)
#show the difference in classes before and after RF based filter
plot(data[idx1a,1],data[idx1a,2])
points(data[idx1b,1],data[idx1b,2],col="Red")
Oto wynik dopasowania:
Naprawdę podoba mi się to, ponieważ może jednocześnie pokazać mocne i słabe strony przyzwoitej metody na trudny problem. Jeśli spojrzysz w pobliżu centrum, zobaczysz mniej filtrowania. Geometryczna skala informacji jest niewielka, a losowy las tego brakuje. Mówi coś o liczbie węzłów, liczbie drzew i gęstości próbki dla klasy 2. Istnieje również „przerwa” w pobliżu (-50, -50) i „dysze” w kilku lokalizacjach. Ogólnie jednak filtrowanie jest przyzwoite.
Porównaj vs. SVM
Oto kod umożliwiający porównanie z SVM:
#now to fit to svm
fit.svm <- svm(z~., data=data, kernel="radial",gamma=10,type = "C")
x5 <- seq(from=min(x2),to=max(x2),by=1)
y5 <- seq(from=min(y2),to=max(y2),by=1)
count <- 1
x6 <- numeric()
y6 <- numeric()
for (i in 1:length(x5)){
for (j in 1:length(y5)){
x6[count]<-x5[i]
y6[count]<-y5[j]
count <- count+1
}
}
data4 <- data.frame(x6,y6)
names(data4) <- c("x","y")
data4$z <- predict(fit.svm,newdata=data4)
idx4 <- which(data4$z==1,arr.ind=TRUE)
plot(data4[idx4,1],data4[idx4,2],col="Gray",pch=20)
points(data[idx1b,1],data[idx1b,2],col="Blue",pch=20)
lines(x1,y1,pch=18,col="Green", lwd=2)
grid()
legend(x = 65,y=65,
legend = c("true","from RF","From SVM"),
col = c("Green","Blue","Gray"),lty = c(1,-1,-1),pch=c(-1,20,15),pt.cex=c(1,1,2.25))
Daje to następujący obraz.
To przyzwoity SVM. Szary jest domeną skojarzoną przez SVM z klasą „1”. Niebieskie kropki to próbki skojarzone przez RF z klasą „1”. Filtr oparty na częstotliwości radiowej działa porównywalnie z SVM bez wyraźnie narzuconej podstawy. Można zauważyć, że „ścisłe dane” w pobliżu środka spirali są znacznie bardziej „ściśle” rozwiązywane przez RF. Istnieją również „wyspy” w kierunku „ogona”, w których RF znajduje skojarzenie, którego nie ma SVM.
Jestem rozrywką. Nie mając doświadczenia, zrobiłem jedną z pierwszych rzeczy, które wykonałem również bardzo dobry współpracownik w tej dziedzinie. Oryginalny autor użył „dystrybucji odniesienia” ( link , link ).
EDYTOWAĆ:
Zastosuj losowy FOREST do tego modelu:
Podczas gdy użytkownik777 ma fajną myśl o tym, że KOSZYK jest elementem losowego lasu, założeniem losowego lasu jest „zbiór agregacji słabych uczniów”. KOSZYK jest znanym słabym uczniem, ale nie jest niczym w pobliżu „zespołu”. „Zespół”, choć w losowym lesie, jest przeznaczony „na granicy dużej liczby próbek”. Odpowiedź użytkownika777 na wykresie rozrzutu wykorzystuje co najmniej 500 próbek, co w tym przypadku mówi coś o czytelności człowieka i rozmiarach próbek. Ludzki system wizualny (sam zespół uczniów) jest niesamowitym czujnikiem i procesorem danych i uznaje tę wartość za wystarczającą do łatwego przetwarzania.
Jeśli weźmiemy nawet domyślne ustawienia narzędzia losowego lasu, możemy zaobserwować zachowanie wzrostu błędu klasyfikacji dla pierwszych kilku drzew i nie osiągnie poziomu jednego drzewa, dopóki nie będzie około 10 drzew. Początkowo rośnie błąd redukcja błędu staje się stabilna około 60 drzew. Mam na myśli stajnię
x <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()
Co daje:
Jeśli zamiast patrzeć na „minimum słabego ucznia”, patrzymy na „minimum słaby zespół” sugerowany przez bardzo krótką heurystykę dla domyślnego ustawienia narzędzia, wyniki są nieco inne.
Uwaga: użyłem „linii”, aby narysować okrąg wskazujący krawędź ponad przybliżeniem. Widać, że jest niedoskonały, ale znacznie lepszy niż jakość jednego ucznia.
Oryginalne próbkowanie zawiera 88 próbek „wewnętrznych”. Jeśli rozmiary próbek zostaną zwiększone (umożliwiając zastosowanie zestawu), poprawi się również jakość aproksymacji. Ta sama liczba uczniów z 20 000 próbek zapewnia oszałamiająco lepsze dopasowanie.
Znacznie lepsza jakość danych wejściowych umożliwia również ocenę odpowiedniej liczby drzew. Kontrola konwergencji sugeruje, że 20 drzew to minimalna wystarczająca liczba w tym konkretnym przypadku, aby dobrze przedstawić dane.