我发现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)
谢谢
答案 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
。如果是这种情况,则只需将00
和11
混淆矩阵值增加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]
请小心 过度拟合