2016-05-17 115 views
1

我正在使用R中的ROCR軟件包測試一個簡單的案例。基本上,這裏是我的代碼。我有一組真值,對於每個值,我有一組預測值,如果預測在| 2 |真正的價值,否則爲0,像這樣的:ROCR包...我沒有得到什麼?

ID<- c(1,2,3,4,5) 
    preds<-c(6,3,2,1,4) 
    truevals<- c(8,4,2,1,7) 
    df<-data.frame(ID, preds,truevals) 
    df<- mutate(df, labels = ifelse(abs(df$preds - df$truevals) < 2, 1, 0)) 
    predtest<-prediction(df$preds, df$labels) 
    auc <- performance(predtest, 'auc') 

但我的計算AUC爲0,即

> [email protected][[1]] 
[1] 0 

我的問題是,我究竟做錯了什麼?顯然,有些分類是「正確的」,那麼爲什麼AUC應該是零呢?我不瞭解什麼?我的價值觀以ID排列,即我假設他們是ID爲1至5的人的衡量標準。有沒有我不考慮的訂購問題?謝謝。

+0

這兩個很好的答案 – roccomay

回答

1

要理解這是怎麼回事,請你數據的箱線圖:

boxplot(preds ~ labels, data = df) 

Boxplot of predictions as a function of labels

通知上0類的預測是如何更高比那些1類的。

現在來看從維基百科AUC的定義:

[該AUC]等於的概率分類器的排名將一個 隨機選擇的正實例不是隨機選擇的 負一更高(假設'積極'排名高於'消極')。 (1)

現在按照慣例,1旨意通常被認爲是陽性,並0小號底片。正如我們剛纔看到,你1 S,現在是陽性,秩比底片(0秒)慢,這樣的概率,他們是高是0

你有3種選擇:

A.如果您1 s爲負面,ROCR有label.ordering說法:

predtest <- prediction(df$preds, df$labels, label.ordering = c(1, 0)) 
auc <- performance(predtest, 'auc') 
[email protected][[1]] 
[1] 1 

B.如果你1 s爲確實是陽性,你可以扭轉你的預測,這樣陽性較高(注意- SIG n的的df$labels前):

predtest <- prediction(df$preds, -df$labels) 
auc <- performance(predtest, 'auc') 
[email protected][[1]] 
[1] 1 

C.你也可以反轉AUC的定義,以便成爲概率分類器的排名將隨機選擇的正實例比隨機選擇的負一個下ROCR不支持此功能,但其他軟件包可能會自動爲您選擇此功能。最後,最重要的不是你的AUC是高於還是低於0.5,而是距離對角線有多遠。如果它低於0.5,或「比隨機差」,則只需將您的解釋反轉爲比隨機更好。

2

您的數據是明顯可分的。 pred 1到3去label 1和4和6去標籤0.

這應該會給你一個AUC等於1,這與AUC爲0相同。這只是一個參考問題。

下面是一個例子:

library(ROCR) 
ID = c(1,2,3,4,5) 
preds = c(6,3,2,1,4) 
truevals = c(8,4,2,1,7) 
df = data.frame(ID, preds,truevals) 
df = mutate(df, labels = ifelse(abs(df$preds - df$truevals) < 2, 1, 0)) 
#Changing the labels is just a matter of reference 
#the algorithm is oblivious to their meaning 
df$labels = 1 - df$labels 
predtest = prediction(df$preds, df$labels) 
auc = performance(predtest, "auc") 

輸出:

> [email protected][[1]] 
[1] 1 

切換標籤提出了關於泄漏的問題,雖然,但我想這不是問題的範圍之內。

編輯: AUC是一種可分性的度量​​,它是您將隨機正實例排名高於隨機負實例的概率。 ROC曲線簡單地爲x:1-特異性和y:靈敏度,給出不同的預測器分類閾值。

所以,關於:

[...]如果我有一個值的任意一組和一組 這些值的預測,我怎麼ROC曲線?我很困惑。我認爲 預測越接近,越好?我只是不知道該怎麼做 這個。我不知道如何將類分配給真正的值。不要 有需要排名的某種?

你有一套二進制分類數據,也是一個連續預測器。現在在預測器中設置一個閾值,將觀測值高於一個類別的閾值或其他類別的觀測值。測量特異性和靈敏度,並在曲線上標記該點。嘗試其他閾值(有限數量的可能性可以改變Sens和Spec)並繪製曲線中的這些點。這是ROC曲線。

AUC越高,您的班級與預測變量的分離程度越高。它們疊加的越多,AUC就越低。

+0

咦?這沒有幫助。當我繪製ROC曲線時,它低於對角線。這不可能是正確的。 – roccomay

+0

但是這些標籤是爲了表示預測是否有效......如果我沒有可分離的數據呢?這將如何改變? – roccomay

+0

0.5是無鑑別線a.k.a隨機機會預測的AUC。這是最糟糕的結果。 –

相關問題