Uma floresta aleatória executada corretamente aplicada a um problema que é mais "apropriado para a floresta aleatória" pode funcionar como um filtro para remover o ruído e gerar resultados mais úteis como entradas para outras ferramentas de análise.
Isenções de responsabilidade:
- É uma "bala de prata"? De jeito nenhum. A quilometragem varia. Funciona onde funciona, e não em outro lugar.
- Existem maneiras pelas quais você pode usá-lo de maneira incorreta e obter respostas que estão no domínio do lixo para o vodu? pode apostar. Como toda ferramenta analítica, ela tem limites.
- Se você lamber um sapo, sua respiração cheira a sapo? provável. Eu não tenho experiência lá.
Eu tenho que dar um "grito" aos meus "espreitadelas" que fizeram "Aranha". ( link ) O problema de exemplo deles informou minha abordagem. ( link ) Eu também amo estimadores de Theil-Sen, e gostaria de poder dar apoio a Theil e Sen.
Minha resposta não é sobre como errar, mas sobre como pode funcionar se você acertar. Enquanto eu uso ruído "trivial", quero que você pense em ruído "não trivial" ou "estruturado".
Um dos pontos fortes de uma floresta aleatória é o quão bem ela se aplica a problemas de alta dimensão. Não consigo mostrar 20k colunas (também conhecido como espaço dimensional de 20k) de uma maneira visual limpa. Não é uma tarefa fácil. No entanto, se você tiver um problema dimensional de 20k, uma floresta aleatória pode ser uma boa ferramenta quando a maioria das pessoas cai de cara no chão.
Este é um exemplo de remoção de ruído do sinal usando uma floresta aleatória.
#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))
Deixe-me descrever o que está acontecendo aqui. Esta imagem abaixo mostra os dados de treinamento para a classe "1". A classe "2" é aleatória uniforme no mesmo domínio e intervalo. Você pode ver que as "informações" de "1" são principalmente uma espiral, mas foram corrompidas pelo material de "2". Ter 33% dos seus dados corrompidos pode ser um problema para muitas ferramentas de ajuste. Theil-Sen começa a se degradar em cerca de 29%. ( link )
![insira a descrição da imagem aqui](https://i.stack.imgur.com/SaWeI.png)
Agora separamos as informações, apenas tendo uma idéia do que é ruído.
#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")
Aqui está o resultado apropriado:
![insira a descrição da imagem aqui](https://i.stack.imgur.com/Ii4MN.png)
Eu realmente gosto disso porque pode mostrar os pontos fortes e fracos de um método decente para um problema difícil ao mesmo tempo. Se você olhar perto do centro, poderá ver como há menos filtragem. A escala geométrica da informação é pequena e a floresta aleatória está ausente. Diz algo sobre o número de nós, o número de árvores e a densidade da amostra para a classe 2. Há também uma "lacuna" próxima (-50, -50) e "jatos" em vários locais. Em geral, no entanto, a filtragem é decente.
Compare vs. SVM
Aqui está o código para permitir uma comparação com o 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))
Isso resulta na imagem a seguir.
![insira a descrição da imagem aqui](https://i.stack.imgur.com/NIRTm.png)
Este é um SVM decente. O cinza é o domínio associado à classe "1" pelo SVM. Os pontos azuis são as amostras associadas à classe "1" pela RF. O filtro baseado em RF funciona comparativamente ao SVM sem uma base explicitamente imposta. Pode-se ver que os "dados restritos" próximos ao centro da espiral são muito mais "rigorosamente" resolvidos pelo RF. Também existem "ilhas" em direção à "cauda", onde o RF encontra associação que o SVM não encontra.
Estou entretido. Sem ter experiência, fiz uma das primeiras coisas também feitas por um colaborador muito bom em campo. O autor original usou "distribuição de referência" ( link , link ).
EDITAR:
Aplique o FOREST aleatório neste modelo:
Embora o usuário777 tenha uma idéia interessante de um CART sendo o elemento de uma floresta aleatória, a premissa da floresta aleatória é "agregação de grupos de alunos fracos". O CART é um aprendiz fraco conhecido, mas não é nada remotamente próximo de um "conjunto". O "conjunto" embora em uma floresta aleatória é destinado "no limite de um grande número de amostras". A resposta do usuário777, no gráfico de dispersão, usa pelo menos 500 amostras e isso diz algo sobre a legibilidade humana e o tamanho das amostras nesse caso. O sistema visual humano (em si um conjunto de alunos) é um incrível sensor e processador de dados e considera esse valor suficiente para facilitar o processamento.
Se tomarmos as configurações padrão em uma ferramenta de floresta aleatória, podemos observar o comportamento do erro de classificação para as primeiras várias árvores e não atingir o nível de uma árvore até que haja cerca de 10 árvores. Inicialmente o erro cresce, a redução do erro se torna estável em torno de 60 árvores. Por estável, quero dizer
x <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()
Qual produz:
![insira a descrição da imagem aqui](https://i.stack.imgur.com/IQo1S.png)
Se, em vez de olharmos para o "aprendiz fraco mínimo", olharmos para o "conjunto mínimo fraco" sugerido por uma breve heurística para a configuração padrão da ferramenta, os resultados são um pouco diferentes.
Note que usei "linhas" para desenhar o círculo indicando a aresta sobre a aproximação. Você pode ver que é imperfeito, mas muito melhor do que a qualidade de um único aluno.
![insira a descrição da imagem aqui](https://i.stack.imgur.com/fiCVN.png)
A amostragem original possui 88 amostras "interiores". Se o tamanho da amostra for aumentado (permitindo a aplicação do conjunto), a qualidade da aproximação também melhora. O mesmo número de alunos com 20.000 amostras se encaixa incrivelmente melhor.
![insira a descrição da imagem aqui](https://i.stack.imgur.com/HKab2.png)
As informações de entrada de qualidade muito mais alta também permitem avaliar o número apropriado de árvores. A inspeção da convergência sugere que 20 árvores é o número mínimo suficiente nesse caso específico para representar bem os dados.
![insira a descrição da imagem aqui](https://i.stack.imgur.com/yDidD.png)