RandomForest для регрессии в R - PullRequest
8 голосов
/ 13 февраля 2012

Я экспериментирую с R и пакетом randomForest, у меня есть некоторый опыт работы с SVM и нейронными сетями.Мой первый тест - попытаться регрессировать: sin (x) + гауссовский шум.С помощью Neural Nets и svm я получаю «относительно» хорошее приближение sin (x), поэтому шум отфильтровывается и алгоритм обучения не подходит.(для достойных параметров) Когда я делаю то же самое на randomForest, у меня есть полностью переоборудованное решение.Я просто использую (R 2.14.0, пробовал тоже на 2.14.1, на всякий случай):

library("randomForest")
x<-seq(-3.14,3.14,by=0.00628)
noise<-rnorm(1001)
y<-sin(x)+noise/4
mat<-matrix(c(x,y),ncol=2,dimnames=list(NULL,c("X","Y")))
plot(x,predict(randomForest(Y~.,data=mat),mat),col="green")
points(x,y)

Полагаю, в randomForest есть волшебная опция, чтобы она работала правильно, я пробовал несколько, ноЯ не нашел правый рычаг, чтобы тянуть ...

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

Вы можете использовать maxnodes, чтобы ограничить размер деревьев, как в примерах в руководстве.

r <- randomForest(Y~.,data=mat, maxnodes=10)
plot(x,predict(r,mat),col="green")
points(x,y)
1 голос
/ 30 марта 2016

Вы можете сделать намного лучше (rmse ~ 0,04, $ R ^ 2 $> 0,99), обучая отдельные деревья на небольших выборках или укусы , как их называл Брейман

Поскольку существуетПри значительном количестве шума в обучающих данных эта проблема на самом деле касается сглаживания, а не обобщения.В общих чертах машинное обучение требует увеличения регуляризации.Для учеников ансамбля это означает торговую силу для разнообразия.

Разнообразие randomForests может увеличиваться за счет уменьшения количества объектов-кандидатов на разделение (mtry в R) или обучающего набора каждого дерева (sampsize вР).Поскольку есть только 1 входной размер, mtry не помогает, оставляя sampsize.Это приводит к 3,5-кратному улучшению RMSE по сравнению с настройками по умолчанию и> 6-кратному улучшению по отношению к самим шумным тренировочным данным.Поскольку увеличение диверсификации означает увеличение дисперсии в прогнозировании отдельных учеников, нам также необходимо увеличить количество деревьев, чтобы стабилизировать ансамблевое прогнозирование.

маленькие сумки, больше деревьев :: rmse = 0,04 :

>sd(predict(randomForest(Y~.,data=mat, sampsize=60, nodesize=2,
                         replace=FALSE, ntree=5000),
            mat)
    - sin(x))
[1] 0.03912643

настройки по умолчанию :: rmse = 0,14 :

> sd(predict(randomForest(Y~.,data=mat),mat) - sin(x))
[1] 0.1413018

ошибкаиз-за шума в тренировочном наборе :: rmse = 0,25

> sd(y - sin(x))
[1] 0.2548882

Ошибка из-за шума, конечно, очевидна из

noise<-rnorm(1001)
y<-sin(x)+noise/4

Ввыше оценка проводится в отношении учебного набора, как и в первоначальном вопросе.Поскольку проблема заключается скорее в сглаживании, чем в обобщении, это не так вопиюще, как может показаться, но обнадеживает тот факт, что оценка «вне сумки» показывает схожую точность:

> sd(predict(randomForest(Y~.,data=mat, sampsize=60, nodesize=2,
                          replace=FALSE, ntree=5000))
     - sin(x))
[1] 0.04059679
0 голосов
/ 13 октября 2017

Моя интуиция заключается в том, что:

  • , если бы у вас было простое дерево решений, подходящее для одномерной кривой f (x), это было бы эквивалентно соответствию функции лестницы (не обязательно с одинаковопрыжки с интервалом)
  • со случайными лесами вы создадите линейную комбинацию лестничных функций

Чтобы лестничная функция была хорошим аппроксиматором f (x), вам нужно достаточно шагов наось x, но каждый шаг должен содержать достаточно точек, чтобы их среднее значение было хорошим приближением к f (x) и в меньшей степени зависело от шума.

Поэтому я предлагаю вам настроить параметр nodeize.Если у вас есть 1 дерево решений и N точек, а nodeize = n, то ваша лестничная функция будет иметь N / n шагов.Слишком маленькое приводит к переоснащению.Я получил хорошие результаты с n ~ 30 (RMSE ~ 0,07):

r <- randomForest(Y~.,data=mat, nodesize=30)
plot(x,predict(r,mat),col="green")
points(x,y)

Обратите внимание, что RMSE становится меньше, если вы берете N '= 10 * N и n' = 10 * n.

...