2017-10-23 15 views
3

Caret에서 5 배 교차 유효성 검사에서 각 폴드에 대해 교육 세트 및 테스트 세트에 대해 ROC 곡선을 사용할 수 있습니까?Caret에서 교차 검증의 각 폴드에 대한 교육 세트 및 테스트 세트에 대한 ROC 곡선

library(caret) 
train_control <- trainControl(method="cv", number=5,savePredictions = TRUE,classProbs = TRUE) 
output <- train(Species~., data=iris, trControl=train_control, method="rf") 

나는 다음과 같은 작업을 수행 할 수 있지만 Fold1의 트레이닝 세트 또는 테스트 세트에 대한 ROC를 반환하는 경우 나도 몰라 :

library(pROC) 
selectedIndices <- rfmodel$pred$Resample == "Fold1" 
plot.roc(rfmodel$pred$obs[selectedIndices],rfmodel$pred$setosa[selectedIndices]) 

답변

3

documentation 전혀 명확 관련없는 것이 사실이다 rfmodel$pred의 내용 - 포함 된 예측은 테스트 세트로 사용 된 폴드에 대한 것이지만, 문서의 어떠한 증거도 지적 할 수는 없습니다. 그럼에도 불구하고, 이것에 상관없이, 당신은 ROC를 얻으려는 방식에서 여전히 몇 가지 요점을 놓치고 있습니다.

먼저, 쉽게 처리에 대한 별도의 dataframe에 rfmodel$pred를 분리하자

dd <- rfmodel$pred 

nrow(dd) 
# 450 

왜 450 개 행을?

rfmodel$results 
# output: 
    mtry Accuracy Kappa AccuracySD KappaSD 
1 2  0.96 0.94 0.04346135 0.06519202 
2 3  0.96 0.94 0.04346135 0.06519202 
3 4  0.96 0.94 0.04346135 0.06519202 

150 행 X 3 설정 =

(450)은의이 내용을 좀 더 자세히 살펴 보자 : 당신이 (당신의 사건에 mtry 단지 3 가지 값을) 3 개 가지 파라미터 세트를 시도하기 때문이다 rfmodel$pred의 :

head(dd) 

# result: 
    pred obs setosa versicolor virginica rowIndex mtry Resample 
1 setosa setosa 1.000  0.000   0  2 2 Fold1 
2 setosa setosa 1.000  0.000   0  3 2 Fold1 
3 setosa setosa 1.000  0.000   0  6 2 Fold1 
4 setosa setosa 0.998  0.002   0  24 2 Fold1 
5 setosa setosa 1.000  0.000   0  33 2 Fold1 
6 setosa setosa 1.000  0.000   0  38 2 Fold1 
  • obs는 진정한 값을
  • 을 포함 세 개의 열 setosa, versicolorvirginica는 각 클래스에 대하여 계산 된 각각의 확률을 포함하고, 이들은 각 행 1에 요약
  • pred 언급 세 열의 최대 확률 클래스 즉, 최종 예측을 포함

    selectedIndices <- rfmodel$pred$Resample == "Fold1" 
    plot.roc(rfmodel$pred$obs[selectedIndices],rfmodel$pred$setosa[selectedIndices]) 
    

    그러나 이것은 전체 성되지 않습니다 :이 모든 이야기는 ROC 확인 될 것 플롯의 길, 즉한다면

위 ory (단지 150 개가 아니라 450 개가 존재한다는 단순한 힌트는 이미 힌트를 주었음) : mtry이라는 열의 존재를 확인하십시오. 실제로 rfmodel$pred에 대한 결과를 모두 포함합니다. 교차 유효성 검사 (예 :모든 매개 변수 설정)을 위해 :

tail(dd) 
# result: 
     pred  obs setosa versicolor virginica rowIndex mtry Resample 
445 virginica virginica  0  0.004  0.996  112 4 Fold5 
446 virginica virginica  0  0.000  1.000  113 4 Fold5 
447 virginica virginica  0  0.020  0.980  115 4 Fold5 
448 virginica virginica  0  0.000  1.000  118 4 Fold5 
449 virginica virginica  0  0.394  0.606  135 4 Fold5 
450 virginica virginica  0  0.000  1.000  140 4 Fold5 

이것은 당신의 selectedIndices 계산이 정확하지 않은 이유는 궁극적 인 이유는; 그것은 또한 하나 개 이상의 모델 "집계"때문에 그렇지 않으면 ROC는, 어떤 이해가되지 않습니다, mtry의 특정 선택을 포함해야한다 :

selectedIndices <- rfmodel$pred$Resample == "Fold1" & rfmodel$pred$mtry == 2 

- 내가 처음에 말했듯이

을, I rfmodel$pred의 예측은 테스트 세트로 폴더에 대한 것입니다. 실제로, 정확도를 수동으로 계산하면 위에 표시된 rfmodel$results (모든 세 가지 설정에 대해 0.96)에보고 된 값과 일치합니다.이 값은 테스트으로 사용 된 폴더에 대한 것입니다 (해당하는 교육 정확도는 1.0이라고 할 수 있습니다).

for (i in 2:4) { # mtry values in {2, 3, 4} 

acc = (length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold1'))/30 + 
    length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold2'))/30 + 
    length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold3'))/30 + 
    length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold4'))/30 + 
    length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold5'))/30 
)/5 

print(acc) 
} 

# result: 
[1] 0.96 
[1] 0.96 
[1] 0.96