Найкращий спосіб представити випадковий ліс у публікації?


75

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

  • Який найкращий спосіб представити випадковий ліс, щоб було достатньо інформації для його відтворення на папері?
  • Чи є метод R в R фактично побудувати дерево, якщо є невелика кількість особливостей?
  • Чи є оцінка OOB рівня помилок найкращою статистикою для цитування?

2
Немає жодного дерева ... Але дивіться у відповідь @ Shane, щоб побудувати одну з них для ілюстративних цілей.
chl

Я, безумовно, варто розглянути randomForest :: parcialPlot, stats.stackexchange.com/questions/92150/…
Soren Havelund Welling

1
ви можете спробувати мій випадковий пакет візуалізації лісу, ForestFloor - forestfloor.dk
Soren Havelund Welling

Відповіді:


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)

У презентації Стробля / Зейле на тему "Чому і як використовувати випадкові лісові мінливі значення (і як не слід)" є приклади дерев, які повинні бути вироблені таким чином. У цій публікації в блозі про моделі дерев є кілька приємних прикладів графіків дерев CART, які ви можете використовувати, наприклад.

Як зауважив @chl, одне дерево не має особливого значення в цьому контексті, тому його не вистачає для пояснення, що таке випадковий ліс, я б не включав це в документ.


4
Невелике розширення щодо сюжетів: plot.randomForestпоказує, як помилка OOB та помилка OOB в класі розвивалися зі збільшенням кількості дерев; varImpPlotпоказує заходи важливості атрибутів для основних атрибутів та MDSplotвсіх об'єктів, побудованих на 2D-проекції міри близькості об'єкта РФ.

+1 для цитування MDSplot()функції. Потрібно визнати, що я часто використовую радіочастотні сигнали як спосіб виділити скупчення осіб (на основі міри близькості РФ), а не для вибору найкращих функцій. Клініки часто читають такі сюжети набагато легше, ніж крапка вар. важливість ...
chl

18
  1. Як писав Шейн; зробити його відтворюваним дослідженням + включити випадкові насіння, оскільки РФ є стохастичним.
  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 із найкращими чинами та назвіть їх ваші маркери. Потім використовуйте резюме (LOO, 10-кратний або бажано випадковий вибірки), щоб отримати апроксимацію помилок RF за допомогою ваших маркерів. tbc.

2
Повідомте про ранги (сподіваємось, вони мають бути майже біля 1,2,3 ...), помилку CV з його відхиленням (просто порахуйте стандартне відхилення результатів кожного раунду CV) та помилку OOB (ймовірно, буде ідентичною помилці CV). ВІДМОВА: Це не метод вибору оптимальної кількості атрибутів - для цього вам потрібен RFE та вкладений CV. ВІДМОВА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) оператора.
rnso
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.