Я зауважую, що це старе питання, але я думаю, що слід додати більше. Як сказав @Manoel Galdino у коментарях, зазвичай вас цікавлять прогнози щодо небачених даних. Але це питання стосується ефективності даних тренінгу, і питання полягає в тому, чому випадковий ліс погано справляється з даними тренінгу ? Відповідь підкреслює цікаву проблему з мішковими класифікаторами, яка часто викликала у мене проблеми: регресія до середнього рівня.
Проблема полягає в тому, що мішені класифікатори на кшталт випадкових лісів, які зроблені шляхом взяття зразків завантажувального завантаження з вашого набору даних, як правило, погано працюють у крайніх межах. Оскільки в крайнощі даних не так багато, вони, як правило, згладжуються.
Більш детально згадаймо, що випадковий ліс для регресії в середньому передбачає прогнози великої кількості класифікаторів. Якщо у вас є одна точка, яка далека від інших, багато класифікаторів її не побачать, і це, по суті, буде робити позапробне передбачення, що може бути не дуже добре. Фактично, ці позапробні прогнози, як правило, тягнуть прогноз для точки даних до загальної середньої величини.
Якщо ви використовуєте одне дерево рішень, у вас не буде такої ж проблеми з екстремальними значеннями, але пристосована регресія також не буде дуже лінійною.
Ось ілюстрація в Р. Створюються деякі дані, в яких 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")