2017-09-15 457 views
3

我正在使用sklearn.metrics.confusion_matrix(y_actual, y_predict)來提取tn,fp,fn,tp和大部分時間它完美的工作。如何使sklearn.metrics.confusion_matrix()始終返回TP,TN,FP,FN?

from sklearn.metrics import confusion_matrix 

y_actual, y_predict = [1,1,1,1], [0,0,0,0] 
tn, fp, fn, tp = confusion_matrix(y_actual, y_predict).ravel() 
>>> [0 0 4 0] # ok 

y_actual, y_predict = [1,1,1,1],[0,1,0,1] 
tn, fp, fn, tp = confusion_matrix(y_actual, y_predict).ravel() 
>>> [0 0 2 2] # ok 

然而,在某些情況下,confusion_matrix()並不總是返回的信息,按照下圖我會得到ValueError異常。

from sklearn.metrics import confusion_matrix 

y_actual, y_predict = [0,0,0,0],[0,0,0,0] 
tn, fp, fn, tp = confusion_matrix(y_actual, y_predict).ravel() 
>>> [4] # ValueError: not enough values to unpack (expected 4, got 1) 

y_actual, y_predict = [1,1,1,1],[1,1,1,1] 
tn, fp, fn, tp = confusion_matrix(y_actual, y_predict).ravel() 
>>> [4] # ValueError: not enough values to unpack (expected 4, got 1) 

我的臨時解決方案是編寫我自己的函數來提取這些信息。有什麼辦法可以強制confusion_matrix()始終返回tn,fp,fn,tp輸出嗎?

感謝

回答

5

這個問題有可以包含在您輸入矩陣的獨特標籤的數量做。在你的第二個例子中,它是(正確)建立一個只有一個類的混淆矩陣,分別是0或1。

要強制它輸出兩個類,即使其中一個類未被預測,請使用label屬性。

y_actual, y_predict = [0,0,0,0],[0,0,0,0] 
tn, fp, fn, tp = confusion_matrix(y_actual, y_predict, labels=[0,1]).ravel() 
>> array([[4, 0], 
      [0, 0]]) 
+0

哇這完美!非常感謝你。 –

+0

很高興幫助!請記住接受答案,如果它解決了你的問題! – kdd