распечатать дерево решений в тексте красиво / с пользовательским контролем [r] - PullRequest
0 голосов
/ 12 июня 2018

Я хотел бы красиво напечатать дерево решений в тексте.Например, я могу напечатать сам объект дерева:

library(rpart)

f = as.formula('Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width + Species')
fit = rpart(f, data = iris, control = rpart.control(xval = 3))

fit

дает

n= 150 

node), split, n, deviance, yval
      * denotes terminal node

 1) root 150 102.1683000 5.843333  
   2) Petal.Length< 4.25 73  13.1391800 5.179452  
     4) Petal.Length< 3.4 53   6.1083020 5.005660  
       8) Sepal.Width< 3.25 20   1.0855000 4.735000 *
       9) Sepal.Width>=3.25 33   2.6696970 5.169697 *
... # omitted

partykit печатает его аккуратно:

library(partykit)

as.party(fit)

дает

Model formula:
Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width + Species

Fitted party:
[1] root
|   [2] Petal.Length < 4.25
|   |   [3] Petal.Length < 3.4
|   |   |   [4] Sepal.Width < 3.25: 4.735 (n = 20, err = 1.1)
|   |   |   [5] Sepal.Width >= 3.25: 5.170 (n = 33, err = 2.7)
|   |   [6] Petal.Length >= 3.4: 5.640 (n = 20, err = 1.2)
...# omitted

Number of inner nodes:    6
Number of terminal nodes: 7

Есть ли способ у меня больше контроля?Например, я не хочу печатать n и err, или хочу печатать стандартное отклонение вместо err.

Ответы [ 2 ]

0 голосов
/ 21 августа 2018

Метод print() для party объектов довольно гибок и может управляться с помощью различных функций панели и настроек.Смотрите ?print.party для обзора.Тем не менее, документация несколько краткая и техническая.

В вашем случае самое простое решение - настроить функцию ответа y, весовые коэффициенты w (по умолчанию все 1 в вашем случае) и желаемое число digits:

myfun <- function(y, w, digits = 2) {
  n <- sum(w)
  m <- weighted.mean(y, w)
  s <- sqrt(weighted.mean((y - m)^2, w) * n/(n - 1))
  sprintf("%s (serr = %s)",
    round(m, digits = digits),
    round(s, digits = digits))
}

И затем вы можете передать его на ваш print() вызов:

p <- as.party(fit)
print(p, FUN = myfun)
## Model formula:
## Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width + Species
## 
## Fitted party:
## [1] root
## |   [2] Petal.Length < 4.25
## |   |   [3] Petal.Length < 3.4
## |   |   |   [4] Sepal.Width < 3.25: 4.735 (serr = 0.239)
## |   |   |   [5] Sepal.Width >= 3.25: 5.17 (serr = 0.289) 
## |   |   [6] Petal.Length >= 3.4: 5.64 (serr = 0.25)  
## |   [7] Petal.Length >= 4.25
## |   |   [8] Petal.Length < 6.05
## |   |   |   [9] Petal.Length < 5.15
## |   |   |   |   [10] Sepal.Width < 3.05: 6.055 (serr = 0.404)
## |   |   |   |   [11] Sepal.Width >= 3.05: 6.53 (serr = 0.38)  
## |   |   |   [12] Petal.Length >= 5.15: 6.604 (serr = 0.302)
## |   |   [13] Petal.Length >= 6.05: 7.578 (serr = 0.228)
## 
## Number of inner nodes:    6
## Number of terminal nodes: 7
0 голосов
/ 12 июня 2018

Не очень элегантный ответ, но если вы просто хотите избавиться от n= и err=, вы можете захватить вывод и отредактировать его.

CO = capture.output(print(as.party(fit)))
CO2 = sub("\\(.*\\)", "", CO)
cat(paste(CO2, collapse="\n"))

Model formula:
Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width + Species

Fitted party:
[1] root
|   [2] Petal.Length < 4.25
|   |   [3] Petal.Length < 3.4
|   |   |   [4] Sepal.Width < 3.25: 4.735 
|   |   |   [5] Sepal.Width >= 3.25: 5.170 
|   |   [6] Petal.Length >= 3.4: 5.640 
|   [7] Petal.Length >= 4.25

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...