На самом деле это можно сделать довольно легко, хотя ваше определение максимального значения понятно для дерева регрессии, но не очень ясно для дерева классификации, так как в каждом узле разный уровень может иметь свой максимум
В любом случае, вот довольно простая вспомогательная функция, которая вернет вам прогнозы для каждого типа дерева.
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