Percebo que essa é uma pergunta antiga, mas acho que mais deve ser acrescentado. Como @Manoel Galdino disse nos comentários, geralmente você está interessado em previsões de dados invisíveis. Mas essa pergunta é sobre desempenho nos dados de treinamento e a pergunta é por que a floresta aleatória tem um desempenho ruim nos dados de treinamento ? A resposta destaca um problema interessante com classificadores ensacados, que muitas vezes me causou problemas: regressão à média.
O problema é que classificadores agrupados, como floresta aleatória, feitos com amostras de autoinicialização do conjunto de dados, tendem a apresentar um desempenho ruim nos extremos. Como não há muitos dados extremos, eles tendem a ser suavizados.
Mais detalhadamente, lembre-se de que uma floresta aleatória para regressão calcula a média das previsões de um grande número de classificadores. Se você tem um único ponto que está longe dos outros, muitos dos classificadores não o veem e, essencialmente, eles fazem uma previsão fora da amostra, o que pode não ser muito bom. De fato, essas previsões fora da amostra tenderão a puxar a previsão para o ponto de dados em direção à média geral.
Se você usar uma única árvore de decisão, não terá o mesmo problema com valores extremos, mas a regressão ajustada também não será muito linear.
Aqui está uma ilustração em R. Alguns dados são gerados em que y
é uma combinação perfeita de liner de cinco x
variáveis. Em seguida, são feitas previsões com um modelo linear e uma floresta aleatória. Em seguida, os valores dos y
dados de treinamento são plotados em relação às previsões. Você pode ver claramente que a floresta aleatória está se saindo mal nos extremos porque pontos de dados com valores muito grandes ou muito pequenos y
são raros.
Você verá o mesmo padrão para previsões em dados invisíveis quando florestas aleatórias forem usadas para regressão. Não sei como evitá-lo. A randomForest
função em R tem uma opção de correção de viés bruto corr.bias
que usa regressão linear no viés, mas na verdade não funciona.
Sugestões são bem-vindas!
beta <- runif(5)
x <- matrix(rnorm(500), nc=5)
y <- drop(x %*% beta)
dat <- data.frame(y=y, x1=x[,1], x2=x[,2], x3=x[,3], x4=x[,4], x5=x[,5])
model1 <- lm(y~., data=dat)
model2 <- randomForest(y ~., data=dat)
pred1 <- predict(model1 ,dat)
pred2 <- predict(model2 ,dat)
plot(y, pred1)
points(y, pred2, col="blue")