混淆矩阵中的白线?
White lines in confusion matrix?
我有一个关于 numpy 矩阵的非常普遍的问题:我试图根据线条对结果进行归一化,但我得到了一些奇怪的白线。这是因为一些零卡在除法的某个地方吗?
这是代码:
import numpy as np
from matplotlib.pylab import *
def confusion_matrix(results,tagset):
# results : list of tuples (predicted, true)
# tagset : list of tags
np.seterr(divide='ignore', invalid='ignore')
mat = np.zeros((len(tagset),len(tagset)))
percent = [0,0]
for guessed,real in results :
mat[tagset.index(guessed),tagset.index(real)] +=1
if guessed == real :
percent[0] += 1
percent[1] += 1
else :
percent[1] += 1
mat /= mat.sum(axis=1)[:,np.newaxis]
matshow(mat,fignum=100)
xticks(arange(len(tagset)),tagset,rotation =90,size='x-small')
yticks(arange(len(tagset)),tagset,size='x-small')
colorbar()
show()
#print "\n".join(["\t".join([""]+tagset)]+["\t".join([tagset[i]]+[str(x) for x in
(mat[i,:])]) for i in xrange(mat.shape[1])])
return (percent[0] / float(percent[1]))*100
感谢您的宝贵时间! (希望答案不要太明显)
没有直接回答你的问题,但这很容易用 scikit-learn:
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
y_test=[2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 1, 0, 0, 2, 0, 0, 1, 1, 0, 2, 1, 0, 2, 2, 1, 0, 1]
y_pred = [2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 1, 0, 0, 2, 0, 0, 1, 1, 0, 2, 1, 0, 2, 2, 1, 0, 2]
cm = confusion_matrix(y_test, y_pred)
print(cm)
# Plot confusion matrix
plt.matshow(cm)
plt.title('Confusion matrix')
plt.colorbar() plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.show()
输出:
[[13 0 0]
[ 0 15 1]
[ 0 0 9]]
简而言之,您有一些从未猜到的特定标签。因为您正在根据标签被猜测的次数进行标准化,所以您有一行 0/0
,它会产生 np.nan
。默认情况下,matplotlib 的颜色条会将 NaN
设置为没有填充颜色,导致轴的背景显示出来(默认情况下为白色)。
这是一个重现当前问题的简单示例:
import numpy as np
import matplotlib.pyplot as plt
def main():
tags = ['A', 'B', 'C', 'D']
results = [('A', 'A'), ('B', 'B'), ('C', 'C'), ('A', 'D'), ('C', 'A'),
('B', 'B'), ('C', 'B')]
matrix = confusion_matrix(results, tags)
plot(matrix, tags)
plt.show()
def confusion_matrix(results, tagset):
output = np.zeros((len(tagset), len(tagset)), dtype=float)
for guessed, real in results:
output[tagset.index(guessed), tagset.index(real)] += 1
return output / output.sum(axis=1)[:, None]
def plot(matrix, tags):
fig, ax = plt.subplots()
im = ax.matshow(matrix)
cb = fig.colorbar(im)
cb.set_label('Percentage Correct')
ticks = range(len(tags))
ax.set(xlabel='True Label', ylabel='Predicted Label',
xticks=ticks, xticklabels=tags, yticks=ticks, yticklabels=tags)
ax.xaxis.set(label_position='top')
return fig
main()
如果我们看一下混淆矩阵:
array([[ 0.5 , 0. , 0. , 0.5 ],
[ 0. , 1. , 0. , 0. ],
[ 0.333, 0.333, 0.333, 0. ],
[ nan, nan, nan, nan]])
如果你想避免标签永远不会被猜到的问题,你可以做类似的事情:
def confusion_matrix(results, tagset):
output = np.zeros((len(tagset), len(tagset)), dtype=float)
for guessed, real in results:
output[tagset.index(guessed), tagset.index(real)] += 1
num_guessed = output.sum(axis=1)[:, None]
num_guessed[num_guessed == 0] = 1
return output / num_guessed
其中产生(其他一切相同):
我有一个关于 numpy 矩阵的非常普遍的问题:我试图根据线条对结果进行归一化,但我得到了一些奇怪的白线。这是因为一些零卡在除法的某个地方吗?
这是代码:
import numpy as np
from matplotlib.pylab import *
def confusion_matrix(results,tagset):
# results : list of tuples (predicted, true)
# tagset : list of tags
np.seterr(divide='ignore', invalid='ignore')
mat = np.zeros((len(tagset),len(tagset)))
percent = [0,0]
for guessed,real in results :
mat[tagset.index(guessed),tagset.index(real)] +=1
if guessed == real :
percent[0] += 1
percent[1] += 1
else :
percent[1] += 1
mat /= mat.sum(axis=1)[:,np.newaxis]
matshow(mat,fignum=100)
xticks(arange(len(tagset)),tagset,rotation =90,size='x-small')
yticks(arange(len(tagset)),tagset,size='x-small')
colorbar()
show()
#print "\n".join(["\t".join([""]+tagset)]+["\t".join([tagset[i]]+[str(x) for x in
(mat[i,:])]) for i in xrange(mat.shape[1])])
return (percent[0] / float(percent[1]))*100
感谢您的宝贵时间! (希望答案不要太明显)
没有直接回答你的问题,但这很容易用 scikit-learn:
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
y_test=[2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 1, 0, 0, 2, 0, 0, 1, 1, 0, 2, 1, 0, 2, 2, 1, 0, 1]
y_pred = [2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 1, 0, 0, 2, 0, 0, 1, 1, 0, 2, 1, 0, 2, 2, 1, 0, 2]
cm = confusion_matrix(y_test, y_pred)
print(cm)
# Plot confusion matrix
plt.matshow(cm)
plt.title('Confusion matrix')
plt.colorbar() plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.show()
输出:
[[13 0 0]
[ 0 15 1]
[ 0 0 9]]
简而言之,您有一些从未猜到的特定标签。因为您正在根据标签被猜测的次数进行标准化,所以您有一行 0/0
,它会产生 np.nan
。默认情况下,matplotlib 的颜色条会将 NaN
设置为没有填充颜色,导致轴的背景显示出来(默认情况下为白色)。
这是一个重现当前问题的简单示例:
import numpy as np
import matplotlib.pyplot as plt
def main():
tags = ['A', 'B', 'C', 'D']
results = [('A', 'A'), ('B', 'B'), ('C', 'C'), ('A', 'D'), ('C', 'A'),
('B', 'B'), ('C', 'B')]
matrix = confusion_matrix(results, tags)
plot(matrix, tags)
plt.show()
def confusion_matrix(results, tagset):
output = np.zeros((len(tagset), len(tagset)), dtype=float)
for guessed, real in results:
output[tagset.index(guessed), tagset.index(real)] += 1
return output / output.sum(axis=1)[:, None]
def plot(matrix, tags):
fig, ax = plt.subplots()
im = ax.matshow(matrix)
cb = fig.colorbar(im)
cb.set_label('Percentage Correct')
ticks = range(len(tags))
ax.set(xlabel='True Label', ylabel='Predicted Label',
xticks=ticks, xticklabels=tags, yticks=ticks, yticklabels=tags)
ax.xaxis.set(label_position='top')
return fig
main()
如果我们看一下混淆矩阵:
array([[ 0.5 , 0. , 0. , 0.5 ],
[ 0. , 1. , 0. , 0. ],
[ 0.333, 0.333, 0.333, 0. ],
[ nan, nan, nan, nan]])
如果你想避免标签永远不会被猜到的问题,你可以做类似的事情:
def confusion_matrix(results, tagset):
output = np.zeros((len(tagset), len(tagset)), dtype=float)
for guessed, real in results:
output[tagset.index(guessed), tagset.index(real)] += 1
num_guessed = output.sum(axis=1)[:, None]
num_guessed[num_guessed == 0] = 1
return output / num_guessed
其中产生(其他一切相同):