2013-05-23 10 views
5

Trong một bài tập, chúng tôi được yêu cầu thực hiện xác thực chéo trên mô hình CART. Tôi đã thử sử dụng chức năng cvFit từ cvTools nhưng nhận được thông báo lỗi lạ. Dưới đây là một ví dụ nhỏ:Xác thực chéo mô hình CART

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

Các lỗi tôi nhìn thấy là:

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

Có vẻ rằng y là bắt buộc đối với cvFit.default. Nhưng:

> 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 

Tôi đang làm gì sai? Gói nào sẽ cho phép tôi thực hiện xác thực chéo với cây CART mà không phải tự mã hóa? (Tôi sooo lười biếng ...)

+3

Nếu bạn thâm nhập vào các tài liệu cho cvTools ** ** nó xuất hiện hầu hết các công cụ đó đều được xây dựng với các biến đáp ứng liên tục trong tâm trí, chứ không phải là rời rạc. Bạn có thể có thể làm cho nó hoạt động, nhưng có vẻ như bạn phải cung cấp chức năng của riêng mình cho 'chi phí' để tính toán lỗi phân loại. – joran

+0

@joran: Chính xác - cảm ơn bạn! Xem [câu trả lời của riêng tôi] (http://stackoverflow.com/a/16724706/946850). – krlmlr

Trả lời

15

Gói caret làm kiểm chứng chéo một snap:

> 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

Chà. Chỉ cần nhìn vào danh sách các phương thức được hỗ trợ trong 'train'. Đó là những gì tôi gọi là toàn diện ... Có rất nhiều "ma thuật" xảy ra ở đây. Chỉ có thể truy cập vào quy trình xác thực chéo mà không thực sự tối ưu hóa các tham số mô hình? – krlmlr

+0

Tôi không nghĩ vậy, nhưng bạn có thể xác định lưới thông số của riêng mình. Nếu bạn không muốn thử nghiệm nhiều mô hình thì chúng chỉ có thể được đặt thành giá trị tĩnh. Tôi sẽ minh họa điều này bằng cách chỉnh sửa ví dụ trên. – David

+0

Dấu mũ là gì? Tôi không thấy rằng đang được sử dụng trong câu trả lời của bạn. – stackoverflowuser2010

4

Cuối cùng, tôi đã có thể có được nó để làm việc. Như Joran đã lưu ý, tham số cost cần được điều chỉnh. Trong trường hợp của tôi, tôi đang sử dụng lỗ 0/1, có nghĩa là tôi sử dụng hàm đơn giản đánh giá != thay vì - giữa yyHat. Ngoài ra, predictArgs phải bao gồm c(type='class'), nếu không cuộc gọi predict được sử dụng trong nội bộ sẽ trả về một vectơ xác suất thay vì phân loại có thể xảy ra nhất. Tóm lại:

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

(này sử dụng một biến thể của cvFit args bổ sung để rpart thể được thông qua bằng cách thiết lập các thông số args=..)