2017-06-01 2 views
3

Ein einfaches BeispielPartei Regeln

>library(partykit) 
> partykit:::.list.rules.party(ctree(Petal.Length~.,data=iris)) 
                            2 
                        "Petal.Width <= 0.6" 
                            6 
        "Petal.Width > 0.6 & Sepal.Length <= 6.2 & Petal.Width <= 1.3 & Sepal.Length <= 5.5" 
                            7 
        "Petal.Width > 0.6 & Sepal.Length <= 6.2 & Petal.Width <= 1.3 & Sepal.Length > 5.5" 
                            .... 

Zum Beispiel in der zweiten Regel, die beiden Vorkommen von Sepal.Length können in Sepal.Length<=5.5

konsolidieren So ist es eine Möglichkeit, um die Regeln zu konsolidieren?

Antwort

1

In der Handlung des Baumes unten, auf dem Weg zum Knoten 6 (der Knoten, dessen Regeln Sie in Ihrer Frage verweisen) behalten wir zuerst nur Punkte mit Petal.Width> 0,6. Aber auch dann enthält der Knoten 6 keine alle restlichen Punkte mit Sepal.Length < = 5,5, sondern nur diejenigen, die auch Petal.Width < = 1.3 haben. Mit anderen Worten, es gibt eine intervenierende Petal.Width Aufteilung zwischen den zwei Sepal.Length Splits, so dass die erste Sepal.Length Split nicht redundant ist.

m1 = ctree(Petal.Length~.,data=iris) 
plot(m1) 

enter image description here

+0

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

1

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.

Verwandte Themen