混淆矩阵返回单个矩阵

时间:2018-10-22 13:56:52

标签: python scikit-learn confusion-matrix

我发现scikit混淆矩阵存在问题。

我在KFold中使用混淆矩阵,然后当y_true和y_pred为100%正确时,混淆矩阵返回单个数字。这使我的混淆矩阵变量崩溃了,因为我将混淆矩阵中的结果相加。有人对此有解决方案吗?

这是我的代码

model = MultinomialNB()
kf = KFold(n_splits=10)
cf = np.array([[0, 0], [0, 0]])
for train_index, test_index in kf.split(x):
    x_train, x_test = x[train_index], x[test_index]
    y_train, y_test = y[train_index], y[test_index]
    model.fit(x_train, y_train)
    y_pred = model.predict(x_test)
    cf += confusion_matrix(y_test, y_pred)

谢谢

2 个答案:

答案 0 :(得分:2)

最干净的方法可能是将所有可能的类的列表作为labels参数传入。这是一个示例,显示了问题并已解决(基于事实和预测的欺骗数据)。

from sklearn.metrics import confusion_matrix                                      
import numpy as np                                                                

y_test = np.array([1,1,1,1,1,0,0])                                                
y_pred = np.array([0,1,1,1,1,0,0])                                                

labels = np.unique(y_test)                                                        

cf = np.array([[0, 0], [0, 0]])                                                   

for indices in [ [0,1,2,3], [1,2,3] , [1,2,3,4,5,6]]:                             
    cm1= confusion_matrix(y_test[indices], y_pred[indices])                       
    cm2= confusion_matrix(y_test[indices], y_pred[indices], labels=labels)        
    print (cm1.shape == (2,2), cm2.shape == (2,2))                                

在第一个子集中,两个类都出现;但是在第二个子集中,仅出现一个类,因此cm1矩阵的大小不为(2,2)(结果为(1,1))。但是请注意,通过在labels中指示所有可能的类别,cm2始终可以。

如果您已经知道标签只能是0或1,则只需分配标签= [0,1],但是使用np.unique会更可靠。

答案 1 :(得分:0)

您可以首先检查所有pred_values是否都等于true_values。如果是这种情况,则只需将0011混淆矩阵值增加true_values(或pred_values)即可。

X = pd.DataFrame({'f1': [1]*10 + [0]*10,
                  'f2': [3]*10 + [10]*10}).values
y = np.array([1]*10 + [0]*10)
model = MultinomialNB()
kf = KFold(n_splits=5)
cf = np.array([[0, 0], [0, 0]])
for train_index, test_index in kf.split(X):
    x_train, x_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    model.fit(x_train, y_train)
    y_pred = model.predict(x_test)
    if all(y_test == y_pred): # if perfect prediction
        cf[0][0] += sum(y_pred == 0) # increment by number of 0 values
        cf[1][1] += sum(y_pred == 1) # increment by number of 1 values
    else:
        cf += confusion_matrix(y_test, y_pred) # else add cf values

print(cf)的结果

>> [10  0]
   [0  10]

请小心 过度拟合