2015-07-31 12 views
5

To pytanie jest podobne do innych pytań na temat Stackoverflow (here, here i here), ale na tyle różne, że Nie mogę ekstrapolować tych odpowiedzi na moją sprawę.in R: Błąd w is.data.frame (dane): obiekt "nie został znaleziony, C5.0 działka

Mam funkcję, w której pasuję do modelu C5.0, a następnie spróbuj wykreślić model.

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

binclass to nazwa kolumny w moich danych szkolenia/testowych (globald jest dataframe z którego podzbiór wierszy z _ind indeksów i kolumn c(3:12,21), gdzie kolumna 21 jest nazwanych binclass). Dopasowanie działa dobrze. Jednak, kiedy również dodać linię

plot(model,trial=0) 

następnie pojawia się następujący błąd: Error in is.data.frame(data) : object 'train_d' not found.

Jak to jest możliwe, że po zainstalowaniu modelu, train_d został znaleziony i użyty poprawnie, ale podczas kreślenia, nigdzie nie można znaleźć train_d? I wszelkie sugestie, jak rozwiązać ten problem. Przestrzenie nazw w [r] pozostają dla mnie zagadką.

minimalnym systemem przykład jest następujący:

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) 
} 

Wywołanie f() wyniki w następujący błąd: Error in is.data.frame(data) : object 'd' not found

Edit: Jak na odpowiedź od MrFlick, wydaje się, że przyczyną tego problemu to błąd w kodzie C5.0. Istnieje kilka obejść wskazanych przez Pascal i MrFlick.

+3

Jakie "inne pytania"? Bez powtarzalnego przykładu, uzyskanie odpowiedzi będzie skomplikowane. –

+1

To nie brzmi jak problem przestrzeni nazw, tak bardzo jak możliwy problem z zasięgiem. Jednak z podanych informacji nie wynika jasno. Powinieneś dołączyć [przykład odtwarzalny] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), wyjaśniając dokładnie, co robisz. – MrFlick

+0

@Pascal: podany jest minimalny przykład pracy. Nie wiem, czy jest to obszar nazw dotyczący zakresu. To problem, który chcę rozwiązać ... – user989762

Odpowiedz

3

Występuje błąd w kodzie, jeśli chodzi o ocenę polecenia w odpowiednim środowisku. Problem pojawia się w funkcji C50::model.frame.C5.0. Najczystsza praca, jaką mogłem znaleźć, polegała na dodaniu do twojego modelu właściwości terms. Pomoże to w enkapsulacji środowiska funkcji.

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. Więc wydaje się, że jest to błąd w C5.0? Sposób obejścia problemu działa, a przynajmniej łagodzi problem. – user989762

0

@MrFlick prawie go miał, ale nie do końca. Ten problem z wykreślaniem jest szczególnie irytujący, gdy próbuje się przekazać dowolne dane i funkcje docelowe do metody C50. Jak zauważył MrFick, chodziło o zmianę warunków. Zmieniając nazwy terminów x i y w wywołaniu metody, funkcja kreślenia nie zostanie zdezorientowana.

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

Przykładowo, poniżej znajduje się metodą przepuszczania dowolnych danych i funkcji docelowego i jednocześnie jest w stanie wykreślić wynik:

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) 

} 

Model obiektu zwróconego w powyższym sposobie mogą być przedstawione jak normalnie.

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