2016-03-17 2 views
1

У меня есть следующие предсказания (предсказание_svm_linear) из модели svm, и я хочу построить кривую ROC с помощью пакета pROC в R. Я получаю AUC 100%, что невозможно, поскольку на основе матрицы путаницы У меня нет идеального предсказания. Очевидно, что у меня что-то не хватает, и, возможно, я не совсем понимаю, как работают кривые ROC, не могли бы вы объяснить мне, почему это может произойти?странное предсказание кривой ROC

Confusion Matrix and Statistics 

     Reference 
Prediction Cancer Normal 
Cancer  11  0 
Normal  3  5 

      Accuracy : 0.8421   
      95% CI : (0.6042, 0.9662) 
No Information Rate : 0.7368   
P-Value [Acc > NIR] : 0.2227   

       Kappa : 0.6587   
Mcnemar's Test P-Value : 0.2482   

     Sensitivity : 0.7857   
     Specificity : 1.0000   
    Pos Pred Value : 1.0000   
    Neg Pred Value : 0.6250   
     Prevalence : 0.7368   
    Detection Rate : 0.5789   
    Detection Prevalence : 0.5789   
    Balanced Accuracy : 0.8929   

    'Positive' Class : Cancer 

Вот мой код:

library(pROC) 
    testData_class = c(rep(c("Normal", "Cancer"), c(5, 14))) 
    prediction_svm_linear = data.frame(Cancer = c(0.11766249, 0.04765463, 0.08749940, 0.01715765, 0.10755376, 0.28358435, 0.37478957, 0.90603193, 0.91077112, 0.68602820, 0.64783894, 0.67916187,0.38785763, 0.66440580, 0.51897036, 0.93484214, 0.91719866, 0.83239007, 0.63491027), Normal = c(0.88233751, 0.95234537, 0.91250060, 0.98284235, 0.89244624, 0.71641565, 0.62521043, 0.09396807, 0.08922888, 0.31397180, 0.35216106, 0.32083813,0.61214237, 0.33559420, 0.48102964, 0.06515786, 0.08280134, 0.16760993, 0.36508973)) 

    result.roc.model1 <- roc(testData$class, prediction_svm_linear$Cancer, 
          levels = rev(levels(testData$class))) 


>result.roc.model1 
Call: 
roc.default(response = testData$class, predictor = prediction.prob.b5_svm_linear$Cancer,  levels = rev(levels(testData$class))) 

Data: prediction.prob.b5_svm_linear$Cancer in 5 controls (testData$class Normal) < 14 cases (testData$class Cancer). 
Area under the curve: 1 
+0

На каком пороге основана ваша матрица замешательства? Можете ли вы показать, как вы его создали? Очевидно, что кривая ROC говорит вам, что существует лучший порог ... – Calimo

+0

Я не установил порога для матрицы путаницы. Это код: 'confusionMatrix (testData_class, prediction_svm_linear)' – Mati

+0

Из пакета caret? – Calimo

ответ

1

Ваш комментарий, я бы подозревать, что ваш злоупотребляя confusionMatrix функцию из caret пакета. Согласно документации, вторым фактором должно быть «a factor of classes to be used as the true results», в то время как ваш комментарий предполагает, что вы передаете data.frame с непрерывными прогнозами. Он не только отличается от требуемого формата, но также должен быть вашим первым аргументом.

Вы должны использовать что-то вроде этого, вместо:

predictions <- ifelse(prediction_svm_linear$Cancer > 0.2, "Cancer", "Normal") 
confusionMatrix(predictions, testData_class) 
0

Жаль, что я мог бы спутать вас, но здесь вся информация

Binary prefiction:

prediction_svm = c("Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Normal", "Cancer", "Cancer", "Cancer", "Cancer", "Cancer", "Normal", "Cancer", "Cancer", "Cancer", "Cancer", "Cancer", "Cancer")

Основная истина:

testData_class = c(rep(c("Normal", "Cancer"), c(5, 14)))

Вероятность предсказание

prediction_svm_linear.prob = data.frame(Cancer = c(0.11766249, 0.04765463, 0.08749940, 0.01715765, 0.10755376, 0.28358435, 0.37478957, 0.90603193, 0.91077112, 0.68602820, 0.64783894, 0.67916187,0.38785763, 0.66440580, 0.51897036, 0.93484214, 0.91719866, 0.83239007, 0.63491027), Normal = c(0.88233751, 0.95234537, 0.91250060, 0.98284235, 0.89244624, 0.71641565, 0.62521043, 0.09396807, 0.08922888, 0.31397180, 0.35216106, 0.32083813,0.61214237, 0.33559420, 0.48102964, 0.06515786, 0.08280134, 0.16760993, 0.36508973))

и я строю матрицу путаницы с этой командой:

confusionMatrix(prediction_svm, testData$class)

library(pROC) 
    result.roc.model1 <- roc(testData$class, prediction_svm_linear.prob$Cancer, 
          levels = rev(levels(testData$class))) 


>result.roc.model1 
Call: 
roc.default(response = testData$class, predictor = prediction.prob.b5_svm_linear$Cancer,  levels = rev(levels(testData$class))) 

Data: prediction.prob.b5_svm_linear$Cancer in 5 controls (testData$class Normal) < 14 cases (testData$class Cancer). 
Area under the curve: 1 


>result.coords.model1 <- coords( result.roc.model1, "best", best.method="closest.topleft",ret=c("threshold", "accuracy")) 

>result.coords.model1 
threshold accuracy 
0.2006234 1.0000000 
Смежные вопросы