2013-05-23 3 views
5

В задании нам предлагается выполнить кросс-проверку на модели CART. Я пробовал использовать функцию cvFit от cvTools, но получил странное сообщение об ошибке. Вот минимальный пример:Перекрестная проверка модели CART

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

Ошибка Я вижу это:

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

И в 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)) 

Похоже, что y является обязательным для cvFit.default. Но:

> 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 

Что я делаю неправильно? Какой пакет позволил бы мне сделать кросс-валидацию с деревом CART без необходимости самостоятельно ее кодировать? (Я ооочень ленивый ...)

+3

Если порыться в документации ** cvTools ** оказывается что большинство этих инструментов были построены с учетом переменных непрерывного ответа, а не дискретных. Возможно, вы можете заставить его работать, но похоже, что вам нужно будет предоставить свою собственную функцию «cost» для вычисления ошибки классификации. – joran

+0

@joran: Именно - спасибо! См. [Мой собственный ответ] (http://stackoverflow.com/a/16724706/946850). – krlmlr

ответ

15

Каретка пакет делает Перекрестная проверка оснастки:

> 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

Ничего себе. Посмотрите список поддерживаемых методов в 'train'. Это то, что я называю всеобъемлющим ... Здесь много «волшебства». Возможно ли получить доступ только к процедуре перекрестной проверки, без фактической оптимизации параметров модели? – krlmlr

+0

Я так не думаю, но вы можете определить свою собственную сетку параметров. Если вы не хотите тестировать несколько моделей, их можно просто установить на статические значения. Я проиллюстрирую это, отредактировав мой вышеприведенный пример. – David

+0

Что такое карет? Я не вижу, чтобы это использовалось в вашем ответе. – stackoverflowuser2010

4

Наконец, я был в состоянии заставить его работать. Как отметил Йоран, параметр cost необходимо адаптировать. В моем случае я использую 0/1 loss, а это означает, что я использую простую функцию, которая вычисляет != вместо - между y и yHat. Кроме того, predictArgs должен включать c(type='class'), в противном случае вызов, используемый внутри, возвращает вектор вероятностей вместо наиболее вероятной классификации. Подводя итог:

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

(При этом используется другой вариант cvFit Дополнительные аргументы для rpart могут быть переданы с помощью параметра args=.).

Смежные вопросы