2015-08-30 3 views
2

Я пытаюсь построить кривую ROC с вероятностями классификации деревьев. Однако, когда я рисую кривую, она отсутствует. Я пытаюсь построить кривую ROC, а затем найти значение AUC из области под кривой. Кто-нибудь знает, как это исправить? Спасибо, если сможешь. Бинарный столбец «Риск» означает ошибочную классификацию рисков, которую, как я полагаю, является моей меткой. Должен ли я применять уравнение кривой ROC в другой точке моего кода?Как построить кривую ROC из вероятностей классификации деревьев

Вот кадр данных:

library(ROCR) 

    data(Risk.table) 

    pred = prediction(Risk.table$Predicted.prob, Risk.table2$Risk) 
    perf = performance(pred, measure="tpr", x.measure="fpr") 
    perf 
    plot(perf) 

    Predicted.prob Actual.prob predicted actual Risk 
    1  0.5384615 0.4615385  G8  V4 0 
    2  0.1212121 0.8787879  V4  V4 1 
    3  0.5384615 0.4615385  G8  G8 1 
    4  0.9000000 0.1000000  G8  G8 1 
    5  0.1212121 0.8787879  V4  V4 1 
    6  0.1212121 0.8787879  V4  V4 1 
    7  0.9000000 0.1000000  G8  G8 1 
    8  0.5384615 0.4615385  G8  V4 0 
    9  0.5384615 0.4615385  G8  V4 0 
    10  0.1212121 0.8787879  V4  G8 0 
    11  0.1212121 0.8787879  V4  V4 1 
    12  0.9000000 0.1000000  G8  V4 0 
    13  0.9000000 0.1000000  G8  V4 0 
    14  0.1212121 0.8787879  G8  V4 1 
    15  0.9000000 0.1000000  G8  G8 1 
    16  0.5384615 0.4615385  G8  V4 0 
    17  0.9000000 0.1000000  G8  V4 0 
    18  0.1212121 0.8787879  V4  V4 1 
    19  0.5384615 0.4615385  G8  V4 0 
    20  0.1212121 0.8787879  V4  V4 1 
    21  0.9000000 0.1000000  G8  G8 1 
    22  0.5384615 0.4615385  G8  V4 0 
    23  0.9000000 0.1000000  G8  V4 0 
    24  0.1212121 0.8787879  V4  V4 1 

Вот ROC кривая этот код выводит, но кривая отсутствует:

enter image description here

Я попробовал еще раз, и эта кривая ROC просто неверно

enter image description here

Я построил выше фрейм данных с помощью кода ниже:

Начальный кадр данных, содержащий все данные, называется shuffle.cross.validation2

#Split data 70:30 after shuffling the data frame 

    index<-1:nrow(LDA.scores1) 
    trainindex.LDA3=sample(index, trunc(length(index)*0.70),replace=FALSE)  

    LDA.70.trainset3<-shuffle.cross.validation2[trainindex.LDA3,] 

    LDA.30.testset3<-shuffle.cross.validation2[-trainindex.LDA3,] 

Run дерево классификации с использованием пакета rpart()

tree.split3<-rpart(Family~., data=LDA.70.trainset3, method="class") 
tree.split3 
summary(tree.split3) 
print(tree.split3) 
plot(tree.split3) 
text(tree.split3,use.n=T,digits=0) 
printcp(tree.split3) 
tree.split3 

Предскажите предсказанные и фактические данные

res3=predict(tree.split3,newdata=LDA.30.testset3) 
res4=as.data.frame(res3) 

Создать две колонок с (фактической и прогнозируемой скоростью классификации) НСОМ

res4$predicted<-NA 
res4$actual<-NA 


for (i in 1:length(res4$G8)){ 

if(res4$R2[i]>res4$V4[i]) { 
res4$predicted[i]<-"G8" 
} 

else { 
res4$predicted[i]<-"V4" 
} 

    print(i) 
} 

res4 

res4$actual<-LDA.30.testset3$Family 
res4 
Risk.table$Risk<-NA 
Risk.table 

Создать двоичный столбец прогнозирующего

for (i in 1:length(Risk.table$Risk)){ 

    if(Risk.table$predicted[i]==res4$actual[i]) { 
    Risk.table$Risk[i]<-1 
    } 

    else { 
    Risk.table$Risk[i]<-0 
    } 

    print(i) 
    } 

Создания прогнозируемых и фактических вероятностей для двух семейств V4 и G8 выше

#Confusion Matrix 

    cm=table(res4$actual, res4$predicted) 

    names(dimnames(cm))=c("actual", "predicted") 

Наивный байесовский

index<-1:nrow(significant.lda.Wilks2) 
    trainindex.LDA.help1=sample(index, trunc(length(index)*0.70), replace=FALSE)          
    sig.train=significant.lda.Wilks2[trainindex.LDA.help1,] 
    sig.test=significant.lda.Wilks2[-trainindex.LDA.help1,] 


    library(klaR) 
    nbmodel<-NaiveBayes(Family~., data=sig.train) 
    prediction<-predict(nbmodel, sig.test) 
    NB<-as.data.frame(prediction) 
    colnames(NB)<-c("Actual", "Predicted.prob", "acual.prob") 

    NB$actual2 = NA 
    NB$actual2[NB$Actual=="G8"] = 1 
    NB$actual2[NB$Actual=="V4"] = 0 
    NB2<-as.data.frame(NB) 

    plot(fit.perf, col="red"); #Naive Bayes 
    plot(perf, col="blue", add=T); #Classification Tree 
    abline(0,1,col="green") 

enter image description here

Оригинал Наивное код Байеса, используя пакет каретку

 library(caret) 
    library(e1071) 

    train_control<-trainControl(method="repeatedcv", number=10, repeats=3) 
    model<-train(Matriline~., data=LDA.scores, trControl=train_control, method="nb") 
    predictions <- predict(model, LDA.scores[,2:13]) 
    confusionMatrix(predictions,LDA.scores$Family) 

Показано с

   Confusion Matrix and Statistics 

         Reference 
       Prediction V4 G8 
         V4 25 2 
         G8 5 48 

        Accuracy : 0.9125   
        95% CI : (0.828, 0.9641) 
     No Information Rate : 0.625   
     P-Value [Acc > NIR] : 4.918e-09  

        Kappa : 0.8095   
    Mcnemar's Test P-Value : 0.4497   

       Sensitivity : 0.8333   
       Specificity : 0.9600   
      Pos Pred Value : 0.9259   
      Neg Pred Value : 0.9057   
       Prevalence : 0.3750   
      Detection Rate : 0.3125   
    Detection Prevalence : 0.3375   
     Balanced Accuracy : 0.8967   

     'Positive' Class : V4   
+0

В функции «прогнозирование» ваши прогнозы и метки используются из двух разных фреймов данных, что, вероятно, не так, как вы планировали. Ваш сюжет * * * кривая ROC, но для модели, которая имеет ровно нулевую прогностическую силу. Когда я запускаю свой код с помощью «Predicted.prob» и «Risk» из данных, которые вы опубликовали, я получаю кривую ROC, но она ниже линии 45 градусов, потому что прогнозы и метки антикоррелированы. – eipi10

+0

Кроме того, ваш код включает 'data (Risk.table)', но, насколько я могу судить, нет пакета, который включает в себя фрейм данных под названием «Risk.table». – eipi10

+0

Должен ли я применять уравнение кривой ROC выше в другой точке кода? Спасибо за ваш комментарий –

ответ

1

У меня есть различные вещи, чтобы указать на:

1) Я думаю, ваш код чтобы быть Family ~ . внутри вашей команды rpart.

2) В вашей начальной таблице я могу увидеть значение W3 в вашем прогнозируемом столбце. Означает ли это, что у вас нет двоичной зависимой переменной? Кривые ROC работают с двоичными данными, поэтому проверьте их.

3) Ваши предсказанные и фактические вероятности в вашей первоначальной таблице всегда равны 1. Это разумно? Я думаю, что они представляют что-то еще, поэтому вы можете подумать об изменении имен, если они смутят вас в будущем.

4) Я думаю, вы смущены тем, как работает ROC и какие входы ему нужны. В столбце Risk используется 1 для представления правильного предсказания, а 0 - неправильное предсказание. Однако кривая ROC требует 1 для представления одного класса и 0 для представления другого класса. Простыми словами, команда prediction(predictions, labels), где predictions - ваши прогнозируемые вероятности, а labels - это истинный класс/уровни вашей зависимой переменной. Проверьте следующий код:

dt = read.table(text=" 
Id Predicted.prob Actual.prob predicted actual Risk 
1  0.5384615 0.4615385  G8  V4 0 
2  0.1212121 0.8787879  V4  V4 1 
3  0.5384615 0.4615385  G8  G8 1 
4  0.9000000 0.1000000  G8  G8 1 
5  0.1212121 0.8787879  V4  V4 1 
6  0.1212121 0.8787879  V4  V4 1 
7  0.9000000 0.1000000  G8  G8 1 
8  0.5384615 0.4615385  G8  V4 0 
9  0.5384615 0.4615385  G8  V4 0 
10  0.1212121 0.8787879  V4  G8 0 
11  0.1212121 0.8787879  V4  V4 1 
12  0.9000000 0.1000000  G8  V4 0 
13  0.9000000 0.1000000  G8  V4 0 
14  0.1212121 0.8787879  W3  V4 1 
15  0.9000000 0.1000000  G8  G8 1 
16  0.5384615 0.4615385  G8  V4 0 
17  0.9000000 0.1000000  G8  V4 0 
18  0.1212121 0.8787879  V4  V4 1 
19  0.5384615 0.4615385  G8  V4 0 
20  0.1212121 0.8787879  V4  V4 1 
21  0.9000000 0.1000000  G8  G8 1 
22  0.5384615 0.4615385  G8  V4 0 
23  0.9000000 0.1000000  G8  V4 0 
24  0.1212121 0.8787879  V4  V4 1", header=T) 

library(ROCR) 

roc_pred <- prediction(dt$Predicted.prob, dt$Risk) 
perf <- performance(roc_pred, "tpr", "fpr") 
plot(perf, col="red") 
abline(0,1,col="grey") 

Кривая ROC является:

enter image description here

При создании нового столбца actual2, где у вас есть 1 вместо G8 и 0 вместо V4:

dt$actual2 = NA 
dt$actual2[dt$actual=="G8"] = 1 
dt$actual2[dt$actual=="V4"] = 0 

roc_pred <- prediction(dt$Predicted.prob, dt$actual2) 
perf <- performance(roc_pred, "tpr", "fpr") 
plot(perf, col="red") 
abline(0,1,col="grey") 

enter image description here

5) Как упоминалось выше в @ eipi10, вы должны попытаться избавиться от циклов for в вашем коде.

+0

Спасибо Антониоск. Это блестяще. Я играю с этим целую вечность и просто ничего не имею. Ты легенда. Еще раз спасибо :) –

+0

Рад, что помог. Другая полезная команда - «performance (roc_pred,« auc ») @ y.values', которая даст вам область под кривой, если вам нужно сравнить модели. – AntoniosK

+0

Это именно то, что я пытаюсь сделать. Я использовал два контролируемых метода машинного обучения, и я хочу сравнить различия между Naive Bayes (NB) и этим классификационным деревом.Были ли у вас какие-либо идеи о том, как отобразить как результаты для NB, так и дерево классификации на одной кривой ROC, а затем вычислить AUC для их сравнения: –

Смежные вопросы