2013-05-23 6 views
5

割り当てでは、CARTモデルに対してクロスバリデーションを実行するように求められます。私はcvToolsからcvFit関数を使用しようとしましたが、奇妙なエラーメッセージが表示されました。私が見ているエラーがある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)) 

それはycvFit.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のドキュメントに掘る場合**それが表示されますそれらのツールのほとんどは、離散的ではなく、連続的な応答変数を念頭に置いて構築されていました。あなたはおそらくそれを動作させることができますが、分類エラーを計算するためにあなた自身の関数を 'コスト'に供給しなければならないように見えます。 – joran

+0

@ヨラン:まさに、ありがとう! [私自身の答え](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

は最後に、私はそれが仕事を得ることができました。 Joranが指摘したように、costのパラメータを適合させる必要があります。私の場合、私は0/1の損失を使用しています。つまり、-の代わりに!=を、yyHatの間で評価する単純な関数を使用しています。また、predictArgsにはc(type='class')が含まれていなければなりません。そうしないと、内部で使用されるpredictコールは、最も可能性の高い分類の代わりに確率のベクトルを返します。要約すると:

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=パラメータを設定して渡すことができます)

関連する問題