2011-11-19 132 views
2

我在Python中使用nltk,我想繪製分類器(樸素貝葉斯)的ROC曲線。有沒有繪製它的功能,或者我是否需要跟蹤真陽性率和假陽性率?Ntlk&Python,繪製ROC曲線

這將是巨大的,如果有人點我的一些代碼已經在做了......

感謝。

回答

3

PyROC看起來很簡單:tutorialsource code

這是它將如何與NLTK樸素貝葉斯分類工作:

# class labels are 0 and 1 
labeled_data = [ 
    (1, featureset_1), 
    (0, featureset_2), 
    (1, featureset_3), 
    # ... 
] 

# naive_bayes is your already trained classifier, 
# preferrably not on the data you're testing on :) 

from pyroc import ROCData 

roc_data = ROCData(
    (label, naive_bayes.prob_classify(featureset).prob(1)) 
    for label, featureset 
    in labeled_data 
) 
roc_data.plot() 

編輯:

  • ROC是二進制只有分類器。如果你有三個班級,你可以分別衡量你的正面和負面班級的表現(通過計算其他兩個班級爲0,就像你提出的那樣)。
  • 庫期望輸出決策函數作爲每個元組的第二個值。然後它嘗試所有可能的閾值,例如f(x)> = 0.8 =>分類爲1,併爲每個閾值繪製一個點(這就是爲什麼最終得到曲線的原因)。所以如果你的分類器猜到0類,你實際上想要一個接近0的值。這就是爲什麼我建議.prob(1)
+0

感謝您的快速回復。然而,有幾件事我不明白:1)我有3個類,名爲「P」,「N」和「?」 (正面,負面和中性),如果我將正數分爲數字1和負數,中性分數爲0,那麼可以嗎? 2)它不應該是「naive_bayes.prob_classify(featureset).prob(label))」嗎? (也就是說,傳遞標籤的概率而不是正面的類) –

+0

@DT:我編輯了我的答案 - 告訴我它是不是很清楚,或者我說錯了什麼! – wutz

+0

再次感謝!編輯中的第一個點是清楚的。關於第二個點,我瞭解ROC曲線是如何繪製的(感謝您的明確解釋),但是我想仔細檢查一下:如果1 =正數且0 =負數,並且您使用'prob(1)'繪製曲線顯示正分類表現的ROC曲線,對嗎?基於python2的 –