Кто-нибудь получил библиотеку или предложения кода о том, как на самом деле построить пару образцов деревьев из:
getTree(rfobj, k, labelVar=TRUE)
(Да, я знаю, что вы не должны делать это оперативно, RF - это черный ящик и т. Д. И т. Д. Я хочу визуально проверить работоспособность дерева, чтобы убедиться, что какие-то переменные ведут себя нелогично, нужно настроить / объединить / дискретизировать / преобразовать, проверить насколько хорошо работают мои закодированные факторы и т. д.)
Предыдущие вопросы без достойного ответа:
Я на самом деле хочу построить образец дерева . Так что не спорьте со мной об этом, уже. Я не спрашиваю о varImpPlot
(График важности переменной) или partialPlot
или MDSPlot
, или эти другие графики , у меня уже есть, но они не являются заменой для просмотра образца дерева. Да, я могу визуально проверить вывод getTree(...,labelVar=TRUE)
.
(Я думаю, что plot.rf.tree()
вклад был бы очень хорошо принят.)
cforest
(в пакете для вечеринок ). В противном случае вам придется преобразоватьdata.frame
возвращаемый объектrandomForest::getTree
вtree
-подобный объект.Ответы:
Первое (и самое простое) решение: если вы не хотите придерживаться классической RF, как это реализовано в Andy Liaw
randomForest
, вы можете попробовать пакет party , который обеспечивает другую реализацию оригинального алгоритма RF ™ (использование условных деревьев и схемы агрегации на основе на единицу веса средний). Затем, как сообщается в этом посте R-help , вы можете нанести на карту одного члена списка деревьев. Кажется, все идет гладко, насколько я могу судить. Ниже приведен график одного дерева, созданногоcforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0))
.Во- вторых (почти так же легко) Решение: Большинство методов дерева на основе в R (
tree
,rpart
,TWIX
и т.д.) предлагаетtree
-like структуру для печати / прокладки одного дерева. Идея заключалась бы в том, чтобы преобразовать выходные данныеrandomForest::getTree
в такой объект R, даже если это бессмысленно со статистической точки зрения. По сути, легко получить доступ к древовидной структуреtree
объекта, как показано ниже. Обратите внимание, что он будет немного отличаться в зависимости от типа задачи - регрессия или классификация, - где в последнем случае он добавит специфичные для класса вероятности в качестве последнего столбцаobj$frame
(который являетсяdata.frame
).Затем есть методы для красивой печати и печати этих объектов. Ключевые функции - это общий
tree:::plot.tree
метод (я поставил тройку,:
которая позволяет вам просматривать код в R напрямую), опираясь наtree:::treepl
(графическое отображение) иtree:::treeco
(вычисление координат узлов). Эти функции ожидаютobj$frame
представления дерева. Другие тонкие вопросы: (1) аргументtype = c("proportional", "uniform")
в методе построения графиков по умолчанию,tree:::plot.tree
помогает управлять вертикальным расстоянием между узлами (proportional
означает, что оно пропорционально отклонению,uniform
значит, оно фиксировано); (2) вам нужно дополнитьplot(tr)
вызовом, чтобыtext(tr)
добавить текстовые метки к узлам и разбиениям, что в этом случае означает, что вам также придется взглянутьtree:::text.tree
.getTree
Метод изrandomForest
возвращений другой структуры, которая описана в интерактивной справке. Типичный вывод показан ниже, с терминальными узлами, обозначеннымиstatus
кодом (-1). (Опять же , выход будет отличаться в зависимости от типа задачи, но только наstatus
иprediction
столбцах.)Если вам удастся преобразовать таблицу выше в одной генерируемых
tree
, вы, вероятно , будете иметь возможность настроитьtree:::treepl
,tree:::treeco
иtree:::text.tree
в соответствии с вашими потребностями, хотя я не пример такого подхода. В частности, вы, вероятно, хотите избавиться от использования отклонений, вероятностей классов и т. Д., Которые не имеют смысла в РФ. Все, что вам нужно, это установить координаты узлов и разделить значения. Вы могли бы использоватьfixInNamespace()
это, но, честно говоря, я не уверен, что это правильный путь.Третье (и, конечно, умное) решение: напишите настоящую
as.tree
вспомогательную функцию, которая облегчит все вышеперечисленные «патчи». Затем вы можете использовать методы построения графиков R или, возможно, лучше, Klimt (непосредственно из R) для отображения отдельных деревьев.источник
Я опоздал на четыре года, но если вы действительно хотите придерживаться
randomForest
пакета (и для этого есть веские причины) и хотите реально визуализировать дерево, вы можете использовать пакет reprtree .Пакет не очень хорошо документирован (вы можете найти документы здесь ), но все довольно просто. Чтобы установить пакет, обратитесь к initialize.R в репозитории, поэтому просто выполните следующее:
Затем сделайте свою модель и дерево:
И вот, пожалуйста! Красиво и просто.
Вы можете проверить репозиторий github, чтобы узнать о других методах в пакете. На самом деле, если вы проверяете plot.getTree.R , вы заметите, что автор использует свою собственную реализацию, из
as.tree()
которой chl ♦ предложил вам построить себя в его ответе. Это означает, что вы можете сделать это:И затем потенциально использовать
realtree
с другими пакетами построения дерева, такими как дерево .источник
xgboost
.randomForest
пакета.plot.getTree()
строит отдельное дерево. Функцияplot.reprtree()
в этом пакете строит репрезентативное дерево.reprtree:::plot.getTree(mod_rf_1$finalModel)
, однако есть ошибка "data.frame (var = fr $ var, splits = as.character (gTree [," split point "]),: аргументы подразумевают разные количество строк: 2631, 0 "Я создал несколько функций для извлечения правил из дерева.
источник