2013-05-23 16 views
5

W zadaniu, jesteśmy proszeni o wykonanie sprawdzenia krzyżowego w modelu CART. Próbowałem używać funkcji cvFit z cvTools, ale otrzymałem dziwny komunikat o błędzie. Oto minimalne przykład:Cross-validating a CART model

library(rpart) 
library(cvTools) 
data(iris) 
cvFit(rpart(formula=Species~., data=iris)) 

Błąd widzę jest:

Error in nobs(y) : argument "y" is missing, with no default 

a traceback():

5: nobs(y) 
4: cvFit.call(call, data = data, x = x, y = y, cost = cost, K = K, 
     R = R, foldType = foldType, folds = folds, names = names, 
     predictArgs = predictArgs, costArgs = costArgs, envir = envir, 
     seed = seed) 
3: cvFit(call, data = data, x = x, y = y, cost = cost, K = K, R = R, 
     foldType = foldType, folds = folds, names = names, predictArgs = predictArgs, 
     costArgs = costArgs, envir = envir, seed = seed) 
2: cvFit.default(rpart(formula = Species ~ ., data = iris)) 
1: cvFit(rpart(formula = Species ~ ., data = iris)) 

Wygląda że y jest obowiązkowe dla cvFit.default. Ale:

> cvFit(rpart(formula=Species~., data=iris), y=iris$Species) 
Error in cvFit.call(call, data = data, x = x, y = y, cost = cost, K = K, : 
    'x' must have 0 observations 

Co robię źle? Który pakiet pozwoliłby mi przeprowadzić walidację krzyżową z drzewem CART bez konieczności samodzielnego kodowania? (Jestem leniwy taaak ...)

+3

Jeśli kopać w dokumentacji ** ** wydaje cvTools większość narzędzi została zbudowana z myślą o ciągłych zmiennych odpowiedzi, a nie dyskretnych. Prawdopodobnie mógłbyś sprawić, żeby działało, ale wygląda na to, że musisz podać swoją własną funkcję "kosztu", aby obliczyć błąd klasyfikacji. – joran

+0

@joran: Dokładnie - dziękuję! Zobacz [moja własna odpowiedź] (http://stackoverflow.com/a/16724706/946850). – krlmlr

Odpowiedz

15

Pakiet daszek sprawia walidacji krzyżowej przystawki:

> library(caret) 
> data(iris) 
> tc <- trainControl("cv",10) 
> rpart.grid <- expand.grid(.cp=0.2) 
> 
> (train.rpart <- train(Species ~., data=iris, method="rpart",trControl=tc,tuneGrid=rpart.grid)) 
150 samples 
    4 predictors 
    3 classes: 'setosa', 'versicolor', 'virginica' 

No pre-processing 
Resampling: Cross-Validation (10 fold) 

Summary of sample sizes: 135, 135, 135, 135, 135, 135, ... 

Resampling results 

    Accuracy Kappa Accuracy SD Kappa SD 
    0.94  0.91 0.0798  0.12  

Tuning parameter 'cp' was held constant at a value of 0.2 
+1

Wow. Spójrz tylko na listę obsługiwanych metod w 'train'. To, co nazywam wszechstronnym ... Jest tu dużo "magii". Czy możliwy jest dostęp tylko do procedury sprawdzania krzyżowego, bez faktycznej optymalizacji parametrów modelu? – krlmlr

+0

Nie sądzę, ale można zdefiniować własną siatkę parametrów. Jeśli nie chcesz testować wielu modeli, mogą one po prostu zostać ustawione na wartości statyczne. Zilustruję to, edytując powyższy przykład. – David

+0

Co to jest daszek? Nie widzę, by było to używane w twojej odpowiedzi. – stackoverflowuser2010

4

Wreszcie udało mi się zmusić go do pracy. Jak zauważył Joran, należy dostosować parametr cost. W moim przypadku używam utraty 0/1, co oznacza, że ​​używam prostej funkcji, która ocenia != zamiast - między y i yHat. Ponadto, predictArgs musi zawierać c(type='class'), w przeciwnym razie wywołanie predict używane wewnętrznie zwróci wektor prawdopodobieństw zamiast najbardziej prawdopodobnej klasyfikacji. Podsumowując:

library(rpart) 
library(cvTools) 
data(iris) 
cvFit(rpart, formula=Species~., data=iris, 
     cost=function(y, yHat) (y != yHat) + 0, predictArgs=c(type='class')) 

(ta wykorzystuje inny wariant cvFit dodatkowe argumenty do rpart mogą być przekazywane poprzez ustawienie parametru args=.).