2015-07-31 32 views
5

Questa domanda è simile a qualche altra domanda su Stackoverflow (here, here e here), ma abbastanza diversa in modo che Non posso estrapolare quelle risposte al mio caso.in R: Errore in is.data.frame (dati): oggetto "non trovato, plot C5.0

Ho una funzione in cui mi adatto a un modello C5.0 e di provare a tracciare il modello.

train_d <- globald[train_ind,c(features,21)] 
model <- C5.0(binclass ~ .,data=train_d,trials=10) 

binclass è un nome di colonna in miei dati formazione/prova (globald è un dataframe da cui ho sottoinsieme righe con _ind indici e colonne c(3:12,21), dove la colonna 21 è chiamato binclass). Il raccordo funziona bene. Tuttavia, quando ho anche aggiungere la linea

plot(model,trial=0) 

allora ottengo il seguente errore: Error in is.data.frame(data) : object 'train_d' not found.

Come è possibile che durante il montaggio del modello, train_d venga trovato e utilizzato correttamente, ma durante il plottaggio, train_d non si trova da nessuna parte? E qualsiasi suggerimento su come risolvere questo problema. Namespace in [r] rimane un mistero per me.

Un esempio in esecuzione minimo è il seguente:

f <- function(){ 
    library(C50) 
    set.seed(1) 
    class = c(1,2) 
    d <- data.frame(feature1 = sample(1:10,10,replace=TRUE), feature2 = 1:10, binclass = class) 
    d$binclass <- as.factor(d$binclass) 
    model <- C5.0(binclass ~ ., data=d) 
    plot(model) 
} 

Calling f() risultati nella seguente errore: Error in is.data.frame(data) : object 'd' not found

Edit: Come per la risposta da MrFlick, sembra che la causa di questo problema è un bug nel codice C5.0. Ci sono alcune soluzioni alternative indicate da Pascal e MrFlick.

+3

Quali "altre domande"? E senza un esempio riproducibile, sarà complicato ottenere una risposta. –

+1

Questo non suona come un problema di spazio dei nomi tanto quanto un possibile problema di ambito. Tuttavia non è molto chiaro dalle informazioni che hai fornito. Dovresti includere un [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) per chiarire esattamente cosa stai facendo. – MrFlick

+0

@Pascal: viene fornito un esempio di lavoro minimo. Non so se si tratta di uno spazio dei nomi di un problema di ambito. È un problema che voglio vedere risolto ... – user989762

risposta

3

Sembra che ci sia un errore nel codice quando si tratta di valutare il comando nell'ambiente appropriato. Il problema sembra essere nella funzione C50::model.frame.C5.0. Il lavoro "più pulito" che ho trovato è stato quello di aggiungere una proprietà terms al modello. Ciò contribuirà a incapsulare l'ambiente della funzione.

f <- function(){ 
    library(C50) 
    set.seed(1) 
    class = c(1,2) 
    d <- data.frame(feature1 = sample(1:10,10,replace=TRUE), feature2 = 1:10, binclass = class) 
    d$binclass <- as.factor(d$binclass) 
    model <- C5.0(binclass ~ ., data=d) 
    model$terms <- eval(model$call$formula) #<---- Added line 
    plot(model) 
} 
+0

Ok. Quindi sembra essere un bug in C5.0? La soluzione alternativa però funziona e almeno attenua il problema. – user989762

0

@MrFlick quasi l'aveva, ma non del tutto. Questo problema per il tracciamento è particolarmente fastidioso quando si tenta di passare dati arbitrari e funzionalità di destinazione al metodo C50. Come sottolineato da MrFlick, si trattava di termini di ridenominazione. Rinominando i termini xey nel richiamo del metodo, la funzione di tracciamento non verrà confusa.

tree_model$call$x <- data_train[, -target_index] 
tree_model$call$y <- data_train[[target_feature]] 

Ad esempio, ecco un metodo per passare nei dati arbitrari e una funzione obiettivo e ancora in grado di tracciare il risultato:

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) 

} 

L'oggetto modello restituito dal metodo di cui sopra possono essere tracciati come normale.

model <- boosted_trees(data_train, 'my_target', 10) 
plot(model)