소규모 데이터 세트의 교차 검증
저는 매우 작은 데이터 세트 (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
답변
고려해야 할 두 가지 사항이 있습니다.
당신은 필요 하면 조정 모델을 내부 검증의 결과를 사용할 때마다 외부 검증 단계를.
그 이유는 시끄러운 성능 추정치에 의한 조정으로 인해 해당 추정치가 성능 추정치로 낙관적으로 편향 되기 때문 입니다.테스트 케이스 수가 적기 때문에 성능 추정치에 잡음이 있습니다 (이항 신뢰 구간 및 측정 비율 조회). 예를 들어 31 개의 테스트 된 케이스 중 3 개의 오 분류를 관찰하면 95 % 신뢰 구간 77-97 %에서 90 % 정확도입니다.
즉, 튜닝 그리드에 대해 관찰 된 성능 이 최상의 모델과 최악의 모델 사이에 뚜렷한 차이가없는 한 테스트 된 사례가 너무 적어 안정적으로 선택할 수 없습니다.
무엇을해야합니까?
내부 (최적화) 유효성 검사의 (반복) 교차 유효성 검사는 다소 더 안정적인 성능 추정치를 제공합니다. (하지만 기적을 기대하지 마십시오.)
정확도 (또는 기타 비율)는 매우 큰 분산 불확도의 영향을받습니다. 확실하게하려면 매우 큰 테스트 샘플 크기가 필요합니다. 그들은 최적화를위한 목표 기능으로 그다지 적합하지 않게 만드는 추가 특성을 가지고 있습니다. 대신 (엄격하게) 적절한 채점 규칙을 사용할 수 있는지 확인하십시오 .
귀하의 경우와 같은 작은 데이터 세트에서는 기차 / 테스트 분할이 시끄러울 수 있으므로 강력하게 권장됩니다. 외부 CV를 수행하면 성능 추정치가 훨씬 더 강력 해집니다. 내가 아는 한, 외부 CV를 직접 코딩하고 루프 내부에서 코드를 그대로 사용해야합니다. 도움 이 될 수 있습니다.