小さなデータセットでの相互検証
私は非常に小さなデータセット(124サンプル)を持っています。Rのいくつかの機械学習アルゴリズムで興味深い結果が得られたら試してみたいと思います。
私が行ったこと:データセットを75%のトレーニングと25%のテストに分割し、次のような構造で6つの異なるモデルをトレーニングしました。
fitControl <- trainControl(## 10-fold CV
method = "repeatedcv",
number = 10,
## repeated five times
repeats = 5,
savePredictions = TRUE,
classProbs = TRUE,
summaryFunction = twoClassSummary)
model_SVM_P <- train(Group ~ ., data = training_set,
method = "svmPoly",
trControl = fitControl,
metric = "Accuracy",
verbose = FALSE,
tuneLength = 10)
しかし、私は機械学習と深層学習について勉強し始めたばかりであり、相互検証の部分は理解するのが難しいです。
問題は次のとおりです。コードには内部相互検証ステップのみがありますが、cvの外部ループを実行する必要がありますか?はいの場合、どうすればコーディングできますか?
編集:
誰かが同じ問題で通りかかっている場合に役立つ可能性がある単なる更新:
私はこれを行い、うまくいきました:
folds <- createFolds(training_set$Group,4) split_up <- lapply(folds, function(ind, dat) dat[ind,], dat = training_set) parms_list_SVM_P <- list() model_list_SVM_P <- list() for (i in 1:4) {model_SVM_P <- train(Group ~ ., data = split_up[[i]], method = "svmPoly", trControl = fitControl, metric = "Accuracy", verbose = FALSE, tuneLength = 10) model_list_SVM_P[[i]] <- model_SVM_P parms_list_SVM_P[[i]] <- model_SVM_P$bestTune}
今、私はさらなる分析に進んでいます。
より専門的な人が間違いを見つけたら、私に知らせてください。
このリンクは私を大いに助けました: https://stackoverflow.com/questions/62183291/statistical-test-with-test-data/62193116#62193116
回答
考慮すべき2つのポイントがあります:
内部検証の結果を使用してモデルを調整する場合は常に、外部検証ステップが必要です。
その理由は、ノイズの多いパフォーマンス見積もりによる調整により、その見積もりがパフォーマンス見積もりとして楽観的にバイアスされるようになるためです。テストケースの数が少ないため、パフォーマンスの見積もりにノイズが多くなります(二項信頼区間と測定比率を調べます)。例として、31のテストされたケースから3つの誤分類を観察した場合、これは95%の信頼区間77-97%で90%の精度です。
あなたのチューニンググリッドの観測されたパフォーマンスを持っていない限り、他の言葉では、荒涼最高と最悪のモデルの違いを、あなたは確実にそう少数のテストケースに基づいて選択することはできません。
何をすべきか?
内部(最適化)検証での(繰り返し)相互検証により、信頼性の高いパフォーマンス見積もりが得られます。(しかし、奇跡を期待しないでください。)
精度(または他の比率)は、非常に大きな分散の不確実性の影響を受けます-確実になるには、非常に大きなテストサンプルサイズが必要です。それらには、最適化のターゲット機能としてあまり適していないというさらなる特性があります。代わりに(厳密に)適切なスコアリングルールを使用できるかどうかを確認してください。
あなたの場合のような小さなデータセットでは、トレイン/テストの分割にノイズが発生する可能性があるため、強くお勧めします。外部CVを実行すると、パフォーマンスの見積もりがはるかに堅牢になります。私の知る限り、外部CVを自分でコーディングし、ループ内でコードをそのまま使用する必要があります。これは役立つかもしれません。