2013-05-23 18 views
5

Bir ödevde, bir CART modelinde çapraz doğrulama yapmamız istenir. cvFit işlevini cvTools numaralı telefondan kullanmayı denedim ancak garip bir hata mesajı aldım. İşte minimal örnek:Bir CART modelinin çapraz doğrulanması

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

görüyorum hatadır:

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

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

O ycvFit.default için zorunlu olduğunu görünüyor. Ancak: Neyi yanlış yapıyorum? Hangi paket kendim kodlamak zorunda kalmadan bir CART ağacıyla çapraz doğrulama yapmamı sağlar? (Ben ... sooo tembelim)

+3

Eğer ** cvTools belgelerine içine kazmak ise ** göründüğü Bu araçların çoğunun ayrık değil, sürekli tepki değişkenleri ile oluşturulduğunu. Muhtemelen işe yarayabilir, ancak sınıflandırma hatasını hesaplamak için kendi fonksiyonunuzu "maliyet" olarak karşılamanız gerekir. – joran

+0

@joran: Kesinlikle - teşekkürler! Bakınız [kendi yanıtım] (http://stackoverflow.com/a/16724706/946850). – krlmlr

cevap

15

şapka paket çapraz doğrulama bir çırpıda yapar:

> 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

Vay. Sadece 'trende' desteklenen yöntemlerin listesine bakın. Ben kapsamlı dediğim şey ... Burada bir sürü "büyü" oluyor. Model parametrelerini gerçekten optimize etmeden sadece çapraz doğrulama rutinine erişmek mümkün mü? – krlmlr

+0

Sanmıyorum, ama kendi parametrelerinizi tanımlayabilirsiniz. Birden fazla modeli test etmek istemiyorsanız, bunlar sadece statik değerlere ayarlanmış olabilir. Yukarıdaki örneğimi düzenleyerek bunu açıklayacağım. – David

+0

Piyano nedir? Cevabınızda kullanıldığını görmüyorum. – stackoverflowuser2010

4

Son olarak, işe almak başardı. Joran'ın belirttiği gibi, cost parametresinin uyarlanması gerekiyor. Benim durumumda 0/1 kaybı kullanıyorum, yani y ve yHat arasında - yerine != değerlendiren basit bir işlev kullandığımı gösterir. Ayrıca, predictArgs, c(type='class')'u içermelidir, aksi halde, predict çağrısı dahili olarak kullanılırken, en olası sınıflandırma yerine olasılıkların bir vektörünü döndürür. Özetle:

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

(Bu cvFit başka varyantı kullanır Ek args rpart için args= parametresini ayarlayarak geçirilebilir..)

İlgili konular