2015-12-02 2 views
2

КороткийR tuneRF нестабильный, как оптимизировать?

Я пытаюсь использовать tuneRF, чтобы найти оптимальное mtry значения для моей randomForest функции, но я нахожу, что ответ крайне неустойчив и изменения с запуском для запуска/различные семян. Я бы запустил цикл, чтобы увидеть, как он изменяется в течение большого количества прогонов, но мне не удается извлечь, какая mtry имеет самую низкую ошибку OOB.

Долгий

У меня есть data.frame, который имеет восемь функций, но две из особенностей включительно означает всю информацию в одном является подмножеством другого. В качестве примера одной особенностью может быть фактор A ~ c("animal', "fish"), а другой - коэффициент B ~ c("dog", "cat", "salmon", "trout"). Следовательно, все собаки и кошки - животные, а все лосось и форель - рыба. Эти две переменные гораздо более значительны, чем любая другая из шести. Следовательно, если я запускаю 3 леса, один из которых использует A, тот, который использует B, и тот, который использует A & B, последний, кажется, делает все возможное. Я подозреваю, что это связано с тем, что A &/или B настолько значительны, что, включив оба варианта, у меня есть вероятность того, что они будут выбраны случайным образом в качестве начальной функции. Я также подозреваю, что я не должен позволять этому случиться, и что я должен выбросить А как фактор, но я не могу найти ни одной литературы, которая на самом деле говорит об этом.

В любом случае, возвращение на правильный путь. У меня есть два набора данных tRFx и tRFx2, первый из которых содержит 7 функций, включая B, но не A, а второй, который содержит 8 функций как с A, так и с B. Я пытаюсь понять, что оптимальный mtry для этих двух отдельных моделей и то как они действуют относительно друг друга. Проблема tuneRF кажется, по крайней мере в этом случае, очень неустойчивой.

Для первого набора данных (включает в себя Feature B, но не A)

> set.seed(1) 
> tuneRF(x = tRFx, y = tRFy, nTreeTry = 250, stepFactor = 1.5, improve = 0.01) 
mtry = 2 OOB error = 17.73% 
Searching left ... 
Searching right ... 
mtry = 3 OOB error = 17.28% 
0.02531646 0.01 
mtry = 4 OOB error = 18.41% 
-0.06493506 0.01 
     mtry OOBError 
2.OOB 2 0.1773288 
3.OOB 3 0.1728395 
4.OOB 4 0.1840629 
> set.seed(3) 
> tuneRF(x = tRFx, y = tRFy, nTreeTry = 250, stepFactor = 1.5, improve = 0.01) 
mtry = 2 OOB error = 18.07% 
Searching left ... 
Searching right ... 
mtry = 3 OOB error = 18.18% 
-0.00621118 0.01 
     mtry OOBError 
2.OOB 2 0.1806958 
3.OOB 3 0.1818182 

т.е. для семян 1 mtry=3 но семени = 3 mtry=2

А для второго набора данных (включает в себя как Черты & Б)

> set.seed(1) 
> tuneRF(x = tRFx2, y = tRFy, nTreeTry = 250, stepFactor = 1.5, improve = 0.01) 
mtry = 3 OOB error = 17.51% 
Searching left ... 
mtry = 2 OOB error = 16.61% 
0.05128205 0.01 
Searching right ... 
mtry = 4 OOB error = 16.72% 
-0.006756757 0.01 
     mtry OOBError 
2.OOB 2 0.1661055 
3.OOB 3 0.1750842 
4.OOB 4 0.1672278 
> set.seed(3) 
> tuneRF(x = tRFx2, y = tRFy, nTreeTry = 250, stepFactor = 1.5, improve = 0.01) 
mtry = 3 OOB error = 17.4% 
Searching left ... 
mtry = 2 OOB error = 18.74% 
-0.07741935 0.01 
Searching right ... 
mtry = 4 OOB error = 17.51% 
-0.006451613 0.01 
     mtry OOBError 
2.OOB 2 0.1874299 
3.OOB 3 0.1739618 
4.OOB 4 0.1750842 

т.е. для семян 1 mtry=2 но семени = 3 mtry=3

Я собирался запустить цикл, чтобы увидеть, какой mtry оптимален для большого количества симуляций, но не знает, как захватить оптимальный mtry с каждой итерации.

Я знаю, что я могу использовать

> set.seed(3) 
> min(tuneRF(x = tRFx2, y = tRFy, nTreeTry = 250, stepFactor = 1.5, improve = 0.01)) 
mtry = 3 OOB error = 17.4% 
Searching left ... 
mtry = 2 OOB error = 18.74% 
-0.07741935 0.01 
Searching right ... 
mtry = 4 OOB error = 17.51% 
-0.006451613 0.01 
[1] 0.1739618 

, но я не хочу, чтобы захватить ошибку OOB (0.1739618), но оптимальная mtry (3).

Любая помощь (или даже общие комментарии ко всему, что связано с tuneRF) очень ценится. Для кого-то еще, кто случайно наткнулся на это, ищет tuneRF help Я также нашел это сообщение полезным. R: unclear behaviour of tuneRF function (randomForest package)

Для чего это стоит, кажется, что оптимальный mtry для меньшего набора функций (с не включены признаками) является 3 и для большего набора функций только 2, которые изначально противопоказано интуитивный, но если учесть, инклюзивный характер A и B, он делает/может иметь смысл.

+1

У меня нет ответа на Ваш вопрос, но я могу сказать, что информация в 'Ā' не является истинно подмножество' b' как вы заявили. Например, «рыба» может быть эквивалентна «лососевой форели», но она не такая, как любая из них. Эффект модели не меньше, чем один из отдельных терминов в модели регрессии. Таким образом, у вас есть законная причина включать обе функции. –

+0

Благодаря @Special Sauce, высоко оценил ввод. Это имеет смысл для меня. –

ответ

3
  • В этом случае нет большой разницы в производительности (и других), на которые вы выбираете. Только если вы не выиграете конкурсы, где победитель получает все, а затем вы, вероятно, также будете смешивать многие другие алгоритмы обучения в одном огромном ансамбле. На практике вы получаете почти те же прогнозы.

  • Вам не нужна пошаговая оптимизация при проверке нескольких комбинаций параметров. Просто попробуйте их все и повторите много раз, чтобы выяснить, какой mtry немного лучше.

  • Все времена, которые я использовал tuneRF, я был разочарован. Каждый раз, когда я заканчивал тем, что писал свою собственную пошаговую оптимизацию, или просто пробовал все комбинации много раз.

  • Mtry vs. oob-err не обязательно должна быть гладкой кривой с одним минимумом, хотя следует соблюдать общую тенденцию. Мне сложно определить, является ли минимум из-за шума или общей тенденции.

Я написал пример, чтобы сделать сплошной скрининг. Вывод из этого скрининга был бы незначительным. mtry = 2 кажется лучшим, и было бы немного быстрее вычислить. Значение по умолчанию было mtry = floor (ncol (X)/3) в любом случае.

library(mlbench) 
library(randomForest) 
data(PimaIndiansDiabetes) 
y = PimaIndiansDiabetes$diabetes 
X = PimaIndiansDiabetes 
X = X[,!names(X)%in%"diabetes"] 
nvar = ncol(X) 
nrep = 25 
rf.list = lapply(1:nvar,function(i.mtry) { 
    oob.errs = replicate(nrep,{ 
    oob.err = tail(randomForest(X,y,mtry=i.mtry,ntree=2000)$err.rate[,1],1)}) 
}) 
plot(replicate(nrep,1:nvar),do.call(rbind,rf.list),col="#12345678", 
    xlab="mtry",ylab="oob.err",main="tuning mtry by oob.err") 
rep.mean = sapply(rf.list,mean) 
rep.sd = sapply(rf.list,sd) 
points(1:nvar,rep.mean,type="l",col=3) 
points(1:nvar,rep.mean+rep.sd,type="l",col=2) 
points(1:nvar,rep.mean-rep.sd,type="l",col=2) 

enter image description here

Смежные вопросы