で利用可能なデータを使用して、いくつかの分類方法/ハイパーパラメータのk倍CVを作成しようとしています
このセットは、それぞれ60個の属性を持つ208行で構成されています。 read.table関数を使用してdata.frameに読み込んでいます。
次のステップは、データをk分割に分割することです。たとえば、k = 5とします。最初の試みは、
テスト<-createFolds(t、k = 5)
これには2つの問題がありました。 1つ目は、折り目の長さが互いに隣接していないことです。
Length Class Mode
Fold1 29-なし-数値
折り2 14-なし-数値
折り3 7-なし-数値
折りたたみ4 5-なし-数値
折り5 5-なし-数値
もう1つは、属性インデックスに従ってデータを分割したようですが、データ自体を分割したいということです。私は私のdata.frameを転置することで、以下を使用すると考えました:
テスト<-t(myDataNumericValues)
しかし、createFolds関数を呼び出すと、次のようになります。
Length Class Mode
Fold1 2496-なし-数値
Fold2 2496-なし-数値
Fold3 2495-なし-数値
Fold4 2496-なし-数値
Fold5 2497-なし-数値
長さの問題は解決しましたが、それでも私の208データが分割されていません。
私にできることについて何か考えはありますか?キャレットパッケージが最も適切に割り当てられていないと思いますか?
前もって感謝します
読んでください ?createFolds
関数の機能を理解します。どのデータを保持するかを定義するインデックスを作成します個別の折り畳み(逆を返すオプションを参照):
> library(caret)
> library(mlbench)
> data(Sonar)
>
> folds <- createFolds(Sonar$Class)
> str(folds)
List of 10
$ Fold01: int [1:21] 25 39 58 63 69 73 80 85 90 95 ...
$ Fold02: int [1:21] 19 21 42 48 52 66 72 81 88 89 ...
$ Fold03: int [1:21] 4 5 17 34 35 47 54 68 86 100 ...
$ Fold04: int [1:21] 2 6 22 29 32 40 60 65 67 92 ...
$ Fold05: int [1:20] 3 14 36 41 45 75 78 84 94 104 ...
$ Fold06: int [1:21] 10 11 24 33 43 46 50 55 56 97 ...
$ Fold07: int [1:21] 1 7 8 20 23 28 31 44 71 76 ...
$ Fold08: int [1:20] 16 18 26 27 38 57 77 79 91 99 ...
$ Fold09: int [1:21] 13 15 30 37 49 53 74 83 93 96 ...
$ Fold10: int [1:21] 9 12 51 59 61 62 64 70 82 87 ...
これらを使用してデータを分割するには:
> split_up <- lapply(folds, function(ind, dat) dat[ind,], dat = Sonar)
> dim(Sonar)
[1] 208 61
> unlist(lapply(split_up, nrow))
Fold01 Fold02 Fold03 Fold04 Fold05 Fold06 Fold07 Fold08 Fold09 Fold10
21 21 21 21 20 21 21 20 21 21
関数train
は、このパッケージで実際のモデリングを行うために使用されます(通常、自分で分割する必要はありません。 このページ を参照してください)。
マックス
私はcaret
パッケージに精通していませんが、以前はrpart
パッケージの決定木に基づいてCVを計算する関数を作成していました。もちろん、目的に合わせて関数を修飾する必要があります。
CV <- function(form, x, fold = 10, cp = 0.01) {
# x is the data
n <- nrow(x)
prop <- n%/%fold
set.seed(7)
newseq <- rank(runif(n))
k <- as.factor((newseq - 1)%/%prop + 1)
y <- unlist(strsplit(as.character(form), " "))[2]
vec.accuracy <- vector(length = fold)
for (i in seq(fold)) {
# It depends on which classification method you use
fit <- rpart(form, data = x[k != i, ], method = "class")
fit.Prune <- Prune(fit, cp = cp)
fcast <- predict(fit.Prune, newdata = x[k == i, ], type = "class")
cm <- table(x[k == i, y], fcast)
accuracy <- (cm[1, 1] + cm[2, 2])/sum(cm)
vec.accuracy[i] <- accuracy
}
avg.accuracy <- mean(vec.accuracy)
avg.error <- 1 - avg.accuracy
cv <- data.frame(Accuracy = avg.accuracy, Error = avg.error)
return(cv)
}