2015-09-21 2 views
1

Если я строй J48 древа:Как получить размер J48 и количество листьев

library(RWeka) 

fit <- J48(Species~., data=iris) 

я получаю следующий результат:

> fit 
J48 pruned tree 
------------------ 

Petal.Width <= 0.6: setosa (50.0) 
Petal.Width > 0.6 
| Petal.Width <= 1.7 
| | Petal.Length <= 4.9: versicolor (48.0/1.0) 
| | Petal.Length > 4.9 
| | | Petal.Width <= 1.5: virginica (3.0) 
| | | Petal.Width > 1.5: versicolor (3.0/1.0) 
| Petal.Width > 1.7: virginica (46.0/1.0) 

Number of Leaves :  5 

Size of the tree : 9 

Я хотел бы получить Number of Leaves в переменный N (так N получит 5) и Size of the tree до S (так S получит 9).

Есть ли способ получить эту информацию непосредственно из дерева J48?

+0

это тоже может быть чем-то вроде Data Science SO или Cross Validated, поскольку может быть лучший вариант, чем «механический» – hrbrmstr

ответ

2

Как ранее указывал @LyzandeR это не так легко сделать это на объект J48 напрямую. Как правило, объекты, возвращаемые функциями фитинга в RWeka, обычно содержат относительно немного информации на стороне R (например, только вызов и установленные предсказания). Основным ингредиентом обычно является ссылка на объект Java, построенный Weka, к которому собственные методы Weka могут быть применены на стороне Java через .jcall, а затем возвращены в R.

Однако для деревьев J48 легко преобразовать информацию со стороны Java в объект R, для которого доступны стандартные функции и методы. Пакет partykit обеспечивает функцию принуждения, которая преобразует J48 деревьев в объекты constparty (рекурсивные перегородки с постоянными вставками в листьях). Затем такие методы, как length(), width(), или depth(), могут использоваться для запроса количества узлов, листьев и глубины дерева соответственно.

library("RWeka") 
fit <- J48(Species ~ ., data = iris) 
library("partykit") 
p <- as.party(fit) 
length(p) 
## [1] 9 
width(p) 
## [1] 5 
depth(p) 
## [1] 4 

Кроме того, predict(), plot(), print() и многие другие инструменты доступны для party объекта.

Я бы рекомендовал использовать этот подход для синтаксического анализа текста, предложенного @LyzandeR, потому что преобразование as.party не полагается на потенциально подверженные ошибкам вычисления текста. Вместо этого он внутренне вызывает собственный генератор Weka (через .jcall), а затем анализирует его на структуру constparty.

2

Интересно, что результат fit создан в рамках функции .jcall в print.Weka_classifier, как видно из getAnywhere(print.Weka_classifier). Это затрудняет (но не невозможно) извлечение значений из вывода печати.

Для того, чтобы сохранить эти два значения, которые вы можете сделать:

library(RWeka) 

fit <- J48(Species~., data=iris) 

#store the print output in a 
a <- capture.output(fit) 

> a 
[1] "J48 pruned tree"          "------------------"         
[3] ""             "Petal.Width <= 0.6: setosa (50.0)"     
[5] "Petal.Width > 0.6"         "| Petal.Width <= 1.7"        
[7] "| | Petal.Length <= 4.9: versicolor (48.0/1.0)" "| | Petal.Length > 4.9"       
[9] "| | | Petal.Width <= 1.5: virginica (3.0)"  "| | | Petal.Width > 1.5: versicolor (3.0/1.0)" 
[11] "| Petal.Width > 1.7: virginica (46.0/1.0)"   ""             
[13] "Number of Leaves : \t5"        ""             
[15] "Size of the tree : \t9"  

# get the output length, so that this can work for a tree 
# with any size/number of leaves 
out_length = length(a) 

# then save the number from the fourth to last element to N 
N <- as.numeric(gsub('\\D', '', a[out_length - 3])) 

#then save the number from second to last element to S 
S <- as.numeric(gsub('\\D', '', a[out_length - 1])) 

А что у вас есть:

> N 
[1] 5 
> S 
[1] 9 
+1

, и это, по-видимому, является наименее обремененным вариантом, так как я не могу понять, где 'partykit' (вы можете конвертировать объект J48 в объект partykit или сторонний объект) сделает информацию легко доступной и конвертируется в файл DOT, а использование igraph кажется излишним (по крайней мере для меня). – hrbrmstr

+0

@hrbrmstr Я даже не знал, что есть пакет, который делает это. Полезно знать спасибо.Если вы скажете, что это слишком сложно сделать, я возьму ваше слово за это :) – LyzandeR

+0

hrbrmstr, Как я могу получить его с помощью partykit? – Avi

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