2017-09-15 317 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