混淆矩阵是一种对错误分类的数量进行制表的方法,即错误分类的数量,即基于真实分类最终出现在错误分类箱中的预测分类的数量。
尽管sklearn.metrics.confusion_matrix提供了一个数字矩阵,但我发现使用以下命令生成“报告”更为有用:
import pandas as pd
y_true = pd.Series([2, 0, 2, 2, 0, 1, 1, 2, 2, 0, 1, 2])
y_pred = pd.Series([0, 0, 2, 1, 0, 2, 1, 0, 2, 0, 2, 2])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)
结果是:
Predicted 0 1 2 All
True
0 3 0 0 3
1 0 1 2 3
2 2 1 3 6
All 5 2 5 12
这使我们能够看到:
- 对角线元素显示每个类别的正确分类数:对于类别0、1和2分别为3、1和3。
- 非对角线元素提供了错误分类:例如,类别2中的2被错误分类为0,类别0中没有一个被错误分类为2,依此类推。
y_true
和中y_pred
的所有类别的分类总数(来自“全部”小计)
此方法也适用于文本标签,并且可以扩展数据集中的大量样本以提供百分比报告。
import numpy as np
import pandas as pd
# create some data
lookup = {0: 'biscuit', 1:'candy', 2:'chocolate', 3:'praline', 4:'cake', 5:'shortbread'}
y_true = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
y_pred = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted']).apply(lambda r: 100.0 * r/r.sum())
输出为:
Predicted biscuit cake candy chocolate praline shortbread
True
biscuit 23.529412 10 23.076923 13.333333 15.384615 9.090909
cake 17.647059 20 0.000000 26.666667 15.384615 18.181818
candy 11.764706 20 23.076923 13.333333 23.076923 31.818182
chocolate 11.764706 5 15.384615 6.666667 15.384615 13.636364
praline 17.647059 10 30.769231 20.000000 0.000000 13.636364
shortbread 17.647059 35 7.692308 20.000000 30.769231 13.636364
现在,数字代表已分类结果的百分比(而非病例数)。
请注意,sklearn.metrics.confusion_matrix
可以使用以下命令直接查看输出:
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()