dort meine eine effizientere Art und Weise sein, aber diese Funktionen können Sie geben, was Sie wollen:
consolidate_rules <- function(tree){
split.vars <- colnames(tree$node$info$criterion)
split <- partykit:::.list.rules.party(tree)
new.split <- c()
for(i.split in seq_along(split)) {
for (i.split.var in split.vars) {
x0 <- split[i.split]
x1 <- strsplit(x0, " & ")
x2 <- grep(i.split.var, x1[[1]], value = TRUE)
x3l <- strsplit(grep("<=", x2, value = TRUE), " <= ") # lower than
x3g <- strsplit(grep(">", x2, value = TRUE), " > ") # greater
x3e <- strsplit(grep(" %in% ", x2, value = TRUE), "%in%") # elements
x4 <- c()
if (length(x3e) != 0) {
b <- sapply(x3e, "[[", 2)
b1 <- gsub('"', '', b)
b2 <- gsub("[c()]", "", b1)
b3 <- gsub("(NA,)|(,NA)", "", b2)
b4 <- unique(strsplit(paste0(b3, collapse = ","), ",")[[1]])
x4 <- paste0(i.split.var, ' %in% c("',
paste0(b4, collapse = '", "'),'")')
}
if (length(x3l) != 0) {
x4 <- paste0(i.split.var, " <= ",
min(as.numeric(sapply(x3l, "[[", 2))))
}
if (length(x3g) != 0) {
x4 <- paste0(x4, ifelse(length(x4) > 0 ," & ",""),
i.split.var, " > ",
max(as.numeric(sapply(x3g, "[[", 2))))
}
tmp <- paste0(if(!is.null(new.split[i.split]) &&
!is.na(new.split[i.split]) &
length(x4) >0) {" & "}, x4)
new.split[i.split] <-
paste0(if(!is.null(new.split[i.split]) &&
!is.na(new.split[i.split])) {new.split[i.split]},
tmp)
rm(x0, x1, x2, x3l, x3g, x3e, x4)
}
}
names(new.split) <- names(split)
return(new.split)
}
Sie können die Funktion mit rufen:
ct <- ctree(Petal.Length~.,data=iris)
consolidate_rules(ct)
Für den Knoten 6 sieht das Ergebnis so aus:
6
"Sepal.Length <= 5.5 & Petal.Width <= 1.3 & Petal.Width > 0.6"
Da das Ergebnis "nur" eine Zeichenfolge mit den Regeln ist, weiß ich nicht, ob Sie es auf die gleiche Weise wie ein .list.rules.party
Objekt verwenden können. Aber ich hoffe, dass dieser mioght dir hilft.
Danke für die Antwort. Was Sie sagen, ist sicherlich wahr, und ich sage nicht, dass der Baum vereinfacht werden kann. Wenn der Baum jedoch in Regeln umgewandelt wird, wird "Sepal.Length <= 6.2" überflüssig. Das heißt, "Teilmenge (Iris, Kelchblattlänge <= 5.5 & Blütenblattbreite> 0.6 & Blütenblattbreite <= 1.3)" stellt die 9 Fälle in Knoten 6 wieder her, ohne die Klausel "Kelchblattlänge <= 6.2" zu benötigen. In diesem Sinne versuche ich, die Regeln zu konsolidieren. – qoheleth