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 xvariáveis. Em seguida, são feitas previsões com um modelo linear e uma floresta aleatória. Em seguida, os valores dos ydados 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 ysã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 randomForestfunção em R tem uma opção de correção de viés bruto corr.biasque 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")
