Лучший способ представить случайный лес в публикации?

75

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

  • Каков наилучший способ представить случайный лес, чтобы в нем было достаточно информации, чтобы сделать его воспроизводимым на бумаге?
  • Есть ли в R метод заговора для фактического построения дерева, если имеется небольшое количество объектов?
  • Является ли оценка вероятности ошибок OOB лучшей статистикой для цитирования?
danielsbrewer
источник
2
Там нет ни одного дерева ... Но посмотрите ответ @ Шейна за написание одного из них в иллюстративных целях.
ЧЛ
Мне, безусловно, стоит подумать о randomForest ::partPlot, stats.stackexchange.com/questions/92150/…
Сорен Хавелунд Уэллинг,
1
Вы можете попробовать мой пакет визуализации случайных лесов, forestFloor - forestfloor.dk
Сорен Хавелунд Веллинг

Ответы:

48

Что касается того, чтобы сделать его воспроизводимым, лучший способ - это предоставить воспроизводимые исследования (т.е. код и данные) вместе с документом. Сделайте его доступным на вашем веб-сайте или на хостинг-сайте (например, на github).

Что касается визуализации, Лео Брейман проделал некоторую интересную работу над этим (см. Его домашнюю страницу , в частности, раздел о графике ).

Но если вы используете R, то randomForestпакет имеет несколько полезных функций:

data(mtcars)
mtcars.rf <- randomForest(mpg ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                           importance=TRUE)
plot(mtcars.rf, log="y")
varImpPlot(mtcars.rf)

А также

set.seed(1)
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
                        keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

Я не знаю простого способа на самом деле построить дерево, но вы можете использовать getTreeфункцию, чтобы получить дерево и построить его отдельно.

getTree(randomForest(iris[,-5], iris[,5], ntree=10), 3, labelVar=TRUE)

В презентации Strobl / Zeileis «Почему и как использовать меры важности случайных лесных переменных (и как не следует)» приводятся примеры деревьев, которые должны были быть получены таким образом. Этот пост в блоге о древовидных моделях содержит несколько хороших примеров диаграмм дерева CART, которые вы можете использовать, например.

Как прокомментировал @chl, одно дерево не имеет особого смысла в этом контексте, поэтому если не использовать его для объяснения того, что такое случайный лес, я бы не стал включать это в статью.

Шейн
источник
4
Небольшое расширение о графиках: plot.randomForestпоказывает, как развивалась ошибка OOB и ошибка OOB в классе с увеличением количества деревьев; varImpPlotпоказывает показатели важности атрибутов для верхних атрибутов и MDSplotвсех объектов, нанесенных на 2D-проекцию меры близости радиочастотного объекта.
+1 за цитирование MDSplot()функции. Я должен признать, что я часто использую RF как способ выделить группы людей (на основе меры близости RF), а не выбирать лучшие функции. Клиницисты часто читают такие графики гораздо легче, чем точечные. Важность ...
ЧЛ
18
  1. Как писал Шейн; сделайте это воспроизводимым исследованием + включите случайные семена, потому что RF - стохастик.
  2. Прежде всего, построение отдельных деревьев, образующих РФ, - это нонсенс; это ансамблевый классификатор, имеет смысл только в целом. Но даже рисование всего леса - это чепуха - это классификатор черного ящика, поэтому он не предназначен для объяснения данных с их структурой, а скорее для того, чтобы воспроизвести исходный процесс. Вместо этого сделайте несколько сюжетов, предложенных Шейном.
  3. На практике OOB является очень хорошим приближением ошибки; тем не менее, это не общепризнанный факт, поэтому для публикации лучше также составить резюме, чтобы подтвердить это.

источник
Таким образом, @mbq при составлении резюме допустимо сначала создать случайный лес со всеми выбранными образцами; делать это дважды, один раз со всеми, а во-вторых, с 10 лучшими переменными (которые можно процитировать в статье). Затем проведите перекрестную валидацию (выбрав 10 лучших генов для каждой попытки) и процитируйте ошибку CV из этого?
danielsbrewer
1
@danielsbrewer Я бы сделал это другим способом (обращая больше внимания на выбор функций), но это правильно; Тем не менее, речь идет не столько о выборе лучших маркеров для вашей биологической проблемы, сколько о том, как сравнивать характеристики RF
2
Основная проблема заключается в том, что действительно трудно сравнить две модели (модель = метод обучения + метод выбора функции), но для простоты вы можете просто предположить что-то (например, я буду использовать RF и выбрать 10 лучших атрибутов) и признать, что вы знаете что это может быть неоптимальным, но вы согласны с этим, в то время как, например, вы удовлетворены точностью. В этом случае ваша единственная проблема состоит в том, чтобы удалить смещение выбора атрибута. TBC.
2
Итак, я бы сделал простую упаковку: вы создаете 10 (или 30, если у вас хороший компьютер) случайных подвыборок объектов (скажем, случайным выбором с заменой), обучаете RF каждому, получаете его важность и возвращаете ранг каждого атрибут, усредненный по всем повторениям (лучший атрибут получает ранг 1, второй лучший 2 и т. д .; его можно усреднить, чтобы атрибут, который был 12 раз 1-м и 18-м 2-м, имел ранг 1,6), наконец, выбирает 10 с лучшими рангами и вызывает их ваши маркеры. Затем используйте CV (LOO, 10-кратная или предпочтительно случайная выборка), чтобы получить приблизительную погрешность RF, используя ваши маркеры. TBC.
2
Сообщите о рангах (надеюсь, их должно быть около 1,2,3 ...), ошибку CV с ее отклонением (просто посчитайте стандартное отклонение результатов каждого раунда CV) и ошибку OOB (вероятно, будет идентичной ошибке CV). ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это не метод выбора оптимального количества атрибутов - для этого вам нужно RFE и вложенное резюме. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ 2: Я не работал с такими данными, поэтому я не гарантирую, что ваши судьи будут довольны (хотя я считаю, что они должны).
13

Имейте в виду, предостережения в других ответах о сюжете обязательно должны быть значимыми. Но если вам нужен сюжет для иллюстративных / педагогических целей, следующий фрагмент кода R может быть полезен. Не сложно добавить «точку разделения» к краю текста, если вам это нужно.

to.dendrogram <- function(dfrep,rownum=1,height.increment=0.1){

  if(dfrep[rownum,'status'] == -1){
    rval <- list()

    attr(rval,"members") <- 1
    attr(rval,"height") <- 0.0
    attr(rval,"label") <- dfrep[rownum,'prediction']
    attr(rval,"leaf") <- TRUE

  }else{##note the change "to.dendrogram" and not "to.dendogram"
    left <- to.dendrogram(dfrep,dfrep[rownum,'left daughter'],height.increment)
    right <- to.dendrogram(dfrep,dfrep[rownum,'right daughter'],height.increment)
    rval <- list(left,right)

    attr(rval,"members") <- attr(left,"members") + attr(right,"members")
    attr(rval,"height") <- max(attr(left,"height"),attr(right,"height")) + height.increment
    attr(rval,"leaf") <- FALSE
    attr(rval,"edgetext") <- dfrep[rownum,'split var']
    #To add Split Point in Dendrogram
    #attr(rval,"edgetext") <- paste(dfrep[rownum,'split var'],"\n<",round(dfrep[rownum,'split point'], digits = 2),"=>", sep = " ")
  }

  class(rval) <- "dendrogram"

  return(rval)
}

mod <- randomForest(Species ~ .,data=iris)
tree <- getTree(mod,1,labelVar=TRUE)

d <- to.dendrogram(tree)
str(d)
plot(d,center=TRUE,leaflab='none',edgePar=list(t.cex=1,p.col=NA,p.lty=0))
Патрик Калдон
источник
1
Код выдает очень хороший древовидный график. Но значения не отображаются. Возможно, функцию text () необходимо добавить после последнего оператора (plot).
15