Я заметил, что это старый вопрос, но я думаю, что следует добавить еще. Как сказал @Manoel Galdino в комментариях, обычно вас интересуют прогнозы по невидимым данным. Но этот вопрос касается производительности на тренировочных данных и вопрос, почему случайный лес плохо работает с тренировочными данными ? Ответ подчеркивает интересную проблему с мешочными классификаторами, которая часто доставляла мне неприятности: регрессия к среднему значению.
Проблема заключается в том, что классификаторы в пакетном режиме, такие как случайный лес, которые создаются путем взятия образцов начальной загрузки из вашего набора данных, как правило, плохо работают в крайних случаях. Поскольку крайних данных немного, они, как правило, сглаживаются.
Более подробно, напомним, что случайный лес для регрессии усредняет прогнозы большого количества классификаторов. Если у вас есть одна точка, которая далека от других, многие из классификаторов не увидят ее, и они, по сути, сделают прогноз вне выборки, что может быть не очень хорошо. Фактически, эти прогнозы вне выборки будут стремиться подтянуть прогноз для точки данных к общему среднему значению.
Если вы используете одно дерево решений, у вас не будет той же проблемы с экстремальными значениями, но подогнанная регрессия также не будет очень линейной.
Вот иллюстрация на R. Получены некоторые данные, в которых y
представлена идеальная линейная комбинация из пяти x
переменных. Затем делаются прогнозы с использованием линейной модели и случайного леса. Затем значения y
обучающих данных наносятся на график против прогнозов. Вы можете ясно видеть, что случайный лес плохо работает в крайних случаях, потому что точки данных с очень большими или очень маленькими значениями y
редки.
Вы увидите ту же схему для прогнозов невидимых данных, когда для регрессии используются случайные леса. Я не уверен, как этого избежать. randomForest
Функция R имеет опцию коррекции смещения сырой , corr.bias
которая использует линейную регрессию по косой, но это действительно не работает.
Предложения приветствуются!
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")