我使用来自 scikit-learn 的 confusion_matrix()
为我的分类器计算了一个混淆矩阵。混淆矩阵的对角元素表示预测标签与真实标签相等的点的数量,而非对角元素是分类器错误标注的点。
我想标准化我的混淆矩阵,使其仅包含 0 到 1 之间的数字。我想从矩阵中读取正确分类样本的百分比。
我找到了几种方法来规范化矩阵(行和列规范化),但我对数学知之甚少,不确定这是否是正确的方法。
最佳答案
假设
>>> y_true = [0, 0, 1, 1, 2, 0, 1]
>>> y_pred = [0, 1, 0, 1, 2, 2, 1]
>>> C = confusion_matrix(y_true, y_pred)
>>> C
array([[1, 1, 1],
[1, 2, 0],
[0, 0, 1]])
然后,要找出每个类别有多少样本获得了正确的标签,您需要
>>> C / C.astype(np.float).sum(axis=1)
array([[ 0.33333333, 0.33333333, 1. ],
[ 0.33333333, 0.66666667, 0. ],
[ 0. , 0. , 1. ]])
对角线包含所需的值。计算这些的另一种方法是意识到您正在计算的是每类的召回率:
>>> from sklearn.metrics import precision_recall_fscore_support
>>> _, recall, _, _ = precision_recall_fscore_support(y_true, y_pred)
>>> recall
array([ 0.33333333, 0.66666667, 1. ])
同样,如果您除以 axis=0
上的总和,您将得到精度(类别-k
具有基本实况标签 k 的预测的分数
):
>>> C / C.astype(np.float).sum(axis=0)
array([[ 0.5 , 0.33333333, 0.5 ],
[ 0.5 , 0.66666667, 0. ],
[ 0. , 0. , 0.5 ]])
>>> prec, _, _, _ = precision_recall_fscore_support(y_true, y_pred)
>>> prec
array([ 0.5 , 0.66666667, 0.5 ])
关于python - 如何标准化混淆矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20927368/