2016-05-11 6 views
-2

Wenn ein Entscheidungsbaum läuft verwende ich:Get Name in der Formel dynamisch in R

mod1 <- C5.0(Species ~ ., data = iris) 

Wenn ich in einem Datenrahmen übergeben wollen und das Ziel-Feature-Namen in der Formel (etwas anderes als „Species“ gesetzt) Wie würde ich das machen?

Zum Beispiel

mod1 <- C5.0(other_data[,target_column] ~ ., data = other_data) 

, die offensichtlich nicht funktioniert.

Antwort

3

1) Paste zusammen die Formel:

fun <- function(resp, data) C5.0(as.formula(paste(resp, "~ .")), data = data) 

# test 
library(C50) 
fun("Species", iris) 

geben:

Call: 
C5.0.formula(formula = as.formula(paste(resp, "~ .")), data = data) 

Classification Tree 
Number of samples: 150 
Number of predictors: 4 

Tree size: 4 

Non-standard options: attempt to group attributes 

2) Oder diese Variante, die auf der Linie nach Anruf schönere Wiedergabe des Anrufs gibt: in die Ausgabe:

fun <- function(resp, data) 
    do.call(C5.0, list(as.formula(paste(resp, "~ .")), data = substitute(data))) 
fun("Species", iris) 

geben:

Call: 
C5.0.formula(formula = Species ~ ., data = iris) 

Classification Tree 
Number of samples: 150 
Number of predictors: 4 

Tree size: 4 

ist hier ein zweiter Test dieser Version von fun den eingebauten Datenrahmen mit CO2:

fun("Plant", CO2) 

geben:

Call: 
C5.0.formula(formula = Plant ~ ., data = CO2) 

Classification Tree 
Number of samples: 84 
Number of predictors: 4 

Tree size: 7 

Non-standard options: attempt to group attributes 
+0

es sagt Objekt "resp" nicht gefunden – Cybernetic

+0

Die Ausgabe ist oben gezeigt und es gibt diesen Fehler nicht für mich. Ich benutze C50 Version '0.1.0.24' und 'R Version 3.3.0 gepatcht (2016-05-03 r70575) " auf Windows. –

+0

Ich sehe, Sie verwenden "Arten" explizit, und auch die Iris-Datensatz. Ich kann das nicht mit einem beliebigen Zielmerkmalsnamen oder einem beliebigen Dataset arbeiten ... wie in meiner Frage – Cybernetic

0

eine Alternative, die bevorzugt sein kann, ist Überschreiben des Symbols innerhalb des Syntaxbaums nach dem Erstellen der Formel:

x <- Species~.; 
x; 
## Species ~ . 
x[[2L]] <- as.symbol('Blah'); 
x; 
## Blah ~ . 

Die oben genannten Arbeiten, da Formeln werden als normale Parse-Bäumen codiert werden, mit einem Top-Level-Knoten, der von einem Anruf aus (typeof 'language', Modus 'call') der `~`() Funktion und klassifiziert als 'formula':

(function(x) c(typeof(x),mode(x),class(x)))(.~.); 
## [1] "language" "call"  "formula" 

Alle Syntaxbäume können als rekursive Listenstruktur gelesen und geschrieben werden. Hier werde ich zeigen, dass eine nette kleine rekursive Funktion ich ursprünglich für this answer schrieb:

unwrap <- function(x) if (typeof(x) == 'language') lapply(as.list(x),unwrap) else x; 
unwrap(Species~.); 
## [[1]] 
## `~` 
## 
## [[2]] 
## Species 
## 
## [[3]] 
## . 
## 

Mit anderen Worten, analysieren Bäume repräsentieren Funktion ruft die Funktion Symbol als erstes Listenkomponente, und dann alle Funktionsargumente als die nachfolgenden Listenkomponenten. Der Sonderfall einer normalen Formel erfasst die LHS als erstes Funktionsargument und die RHS als zweite. Daher steht x[[2L]] für das LHS-Symbol Ihrer Formel, das Sie direkt mit einer normalen Zuordnung zu Ihrem bevorzugten Symbol überschreiben können.

0

Im Folgenden kann in beliebigen Daten und ein Ziel-Feature zu der C50-Methode zur Weiterleitung:

boosted_trees <- function(data_train, target_feature, iter_choice) { 

    target_index <- grep(target_feature, colnames(data_train)) 
    model_boosted <- C5.0(x = data_train[, -target_index], y = data_train[[target_feature]], trial=iter_choice) 
    model_boosted$call$x <- data_train[, -target_index] 
    model_boosted$call$y <- data_train[[target_feature]] 
    return(model_boosted) 

} 

Der Trick ist, die Bedingungen in dem Methodenaufruf nach Aufbau das Modells zu benennen, so dass sie aufgetragen werden können.