python - 如何标准化混淆矩阵?

标签 python matrix scikit-learn normalization confusion-matrix

我使用来自 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/

相关文章:

python - 如何根据列到值的映射为 DataFrame 赋值?

JavaScript 动态扩展/收缩矩阵 - 如何实现?

haskell - 代码在 Elm 中编译,但在 Haskell 中不编译

python - 仅使用系数和截距模拟 sklearn 逻辑回归 Predict_proba

python - 由于尺寸不同,无法在 scikit-learn 中使用 FeatureUnion

python - zip 不适用于 imshow : TypeError: Image data cannot be converted to float

python - 添加新文本到 Sklearn TFIDIF Vectorizer (Python)

python - 如何创建一系列单词作为超参数进行迭代?

python - *更新* 为两个二维数组之间的距离创建一个数组

matlab - 如何有效地遍历矩阵元素