Найдите максимальное значение в дереве решений

Я создал дерево решений с пакетом Party в R. Я пытаюсь получить маршрут/ветвь с максимальным значением.

Это может быть среднее значение, полученное из блочного графика Изображение 1

и это может быть значение вероятности, полученное из бинарного дерева Изображение 2
(источник: rdatamining.com)


person AsSAASA    schedule 24.02.2016    source источник
comment
Максимальное значение в первом дереве будет в узле 8. Максимальное значение во втором дереве будет в узле 5[2]. Как мы распознаем его автоматически?   -  person AsSAASA    schedule 24.02.2016
comment
перебрать листья и выбрать то, что вас интересует?   -  person lejlot    schedule 25.02.2016
comment
Да. Я хочу знать, какие решения мне нужно принять, если я хочу получить максимальное среднее значение (рис. 1)   -  person AsSAASA    schedule 25.02.2016
comment
Вам нужно пройтись по рекурсивной структуре выходного объекта от party. Вероятно, проще будет ответить на этот вопрос в качестве отправной точки, и из формата вывода вы выбираете нужную информацию. Если у вас есть еще сомнения, просто напишите их в своем вопросе.   -  person lrnzcig    schedule 26.02.2016


Ответы (1)


На самом деле это можно сделать довольно легко, хотя ваше определение максимального значения понятно для дерева регрессии, но не очень ясно для дерева классификации, так как в каждом узле разный уровень может иметь свой максимум

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

GetPredicts <- function(ct){
      f <- function(ct, i) nodes(ct, i)[[1]]$prediction
      Terminals <- unique(where(ct))
      Predictions <- sapply(Terminals, f, ct = ct)
      if(is.matrix(Predictions)){
        colnames(Predictions) <- Terminals
        return(Predictions)
       } else {
        return(setNames(Predictions, Terminals))
       }
}

Теперь, к счастью, вы взяли свои деревья из примеров ?ctree, чтобы мы могли их протестировать (в следующий раз, пожалуйста, предоставьте код, который вы использовали сами)


Дерево регрессии (ваше первое дерево)

## load the package and create the tree
library(party)
airq <- subset(airquality, !is.na(Ozone))
airct <- ctree(Ozone ~ ., data = airq, 
               controls = ctree_control(maxsurrogate = 3))
plot(airct)

Теперь проверьте функцию

res <- GetPredicts(airct)
res
#        5        3        6        9        8 
# 18.47917 55.60000 31.14286 48.71429 81.63333 

Итак, у нас есть прогнозы для каждого конечного узла. Вы можете легко перейти к which.max(res) отсюда (я оставлю это на ваше усмотрение)


Дерево классификации (ваше второе дерево)

irisct <- ctree(Species ~ .,data = iris)
plot(irisct, type = "simple")

Запустить функцию

res <- GetPredicts(irisct)
res
#      2          5   6          7
# [1,] 1 0.00000000 0.0 0.00000000
# [2,] 0 0.97826087 0.5 0.02173913
# [3,] 0 0.02173913 0.5 0.97826087

Теперь вывод немного сложнее читать, потому что у каждого класса есть свои вероятности. Вы можете сделать это немного более читабельным, используя

row.names(res) <- levels(iris$Species)
res
#            2          5   6          7
# setosa     1 0.00000000 0.0 0.00000000
# versicolor 0 0.97826087 0.5 0.02173913
# virginica  0 0.02173913 0.5 0.97826087

Вы можете сделать что-то вроде следующего, чтобы получить общее максимальное значение

which(res == max(res), arr.ind = TRUE)
#        row col
# setosa   1   1

Для максимального количества столбцов/строк вы можете сделать

matrixStats::colMaxs(res)
# [1] 1.0000000 0.9782609 0.5000000 0.9782609
matrixStats::rowMaxs(res)
# [1] 1.0000000 0.9782609 0.9782609

Но, опять же, я оставляю вам решать, как действовать дальше.

person David Arenburg    schedule 14.03.2016
comment
Привет Дэвид, это именно то, что я имел в виду. - person AsSAASA; 23.03.2016
comment
Есть способ вытащить из дерева маршрут наибольшего значения? Например, в дереве регрессии я задам маршрут узла 8 (темп › 82, ветер ‹10,3) Спасибо!!! - person AsSAASA; 23.03.2016