我用Python写了一个混淆矩阵计算代码:
def conf_mat(prob_arr, input_arr):
# confusion matrix
conf_arr = [[0, 0], [0, 0]]
for i in range(len(prob_arr)):
if int(input_arr[i]) == 1:
if float(prob_arr[i]) < 0.5:
conf_arr[0][1] = conf_arr[0][1] + 1
else:
conf_arr[0][0] = conf_arr[0][0] + 1
elif int(input_arr[i]) == 2:
if float(prob_arr[i]) >= 0.5:
conf_arr[1][0] = conf_arr[1][0] +1
else:
conf_arr[1][1] = conf_arr[1][1] +1
accuracy = float(conf_arr[0][0] + conf_arr[1][1])/(len(input_arr))
prob_arr
是我的分类代码返回的数组,样本数组是这样的:
[1.0, 1.0, 1.0, 0.41592955657342651, 1.0, 0.0053405015805891975, 4.5321494433440449e-299, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.70943426182688163, 1.0, 1.0, 1.0, 1.0]
input_arr
是数据集的原始类标签,它是这样的:
[2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1]
我的代码试图做的是:我得到 prob_arr
和 input_arr
并且对于每个类(1 和 2),我检查它们是否被错误分类。
但是我的代码只适用于两个类。如果我为多分类数据运行此代码,它不起作用。我怎样才能为多个班级做这个?
例如,对于具有三个类的数据集,它应该返回: [[21, 7, 3], [3, 38, 6],[5, 4, 19]]
。
原文由 Arja Varvio 发布,翻译遵循 CC BY-SA 4.0 许可协议
Scikit-Learn 提供了一个
confusion_matrix
函数输出一个 Numpy 数组
但您也可以使用 Pandas 创建混淆矩阵:
你会得到一个(贴上标签的)Pandas DataFrame:
如果你添加
margins=True
就像您还将获得每一行和每一列的总和:
您还可以使用以下方法获得归一化混淆矩阵:
您可以使用绘制此 confusion_matrix
或者使用以下方法绘制归一化混淆矩阵:
您可能也对这个项目感兴趣 https://github.com/pandas-ml/pandas-ml 及其 Pip 包 https://pypi.python.org/pypi/pandas_ml
有了这个包,混淆矩阵可以漂亮地打印出来,绘制。您可以对混淆矩阵进行二值化,获取类别统计信息,例如 TP、TN、FP、FN、ACC、TPR、FPR、FNR、TNR (SPC)、LR+、LR-、DOR、PPV、FDR、FOR、NPV 和一些整体统计数据
我注意到一个名为 PyCM 的关于混淆矩阵的新 Python 库已经出来了:也许你可以看看。