《机器学习(周志华)》笔记--模型的评估与选择(4)--混淆矩阵

五、衡量分类的性能指标

  1、准确度的陷阱

  准确度(正确率)越高就能说明模型的分类性能越好吗?

  答:非也!举个例子,现在我开发了一套癌症检测系统,只要输入你的一些基本健康信息,就能预测出你现在是否患有癌症,并且分类的准确度为 0.999。但是我们知道,一般年轻人患癌症的概率非常低,假设患癌症的概率为 0.001,那么其实我这个癌症检测系统只要一直输出您没有患癌症,准确度也可能能够达到 0.999。假如现在有一个人本身已经患有癌症,但是他自己不知道自己患有癌症。这个时候用我的癌症检测系统检测发现他没有得癌症,那很显然我这个系统已经把他给坑了(耽误了治疗)。

  一个分类模型如果光看准确度是不够的,尤其是对这种样本极度不平衡的情况( 10000 条健康信息数据中,只有 1 条的类别是患有癌症,其他的类别都是健康)。

  2、混淆矩阵

  继续以癌症检测系统为例,癌症检测系统的输出不是有癌症就是健康,这里为了方便,就用 1 表示患有癌症,0 表示健康。假设现在拿 10000 条数据来进行测试,其中有 9978 条数据的真实类别是 0,系统预测的类别也是 0,有 2 条数据的真实类别是 1 却预测成了 0,有 12 条数据的真实类别是 0 但预测成了 1,有 8 条数据的真实类别是 1,预测结果也是 1。

  如果我们把这些结果组成如下矩阵,则该矩阵就成为混淆矩阵。

真实  \   预测01
0 9978 12
1 2 8

              图4.2.1  检测系统数据组成的混淆矩阵

  混淆矩阵中每个格子所代表的的意义也很明显,意义如下:

真实  \  预测01
0 预测0正确的数量 预测1错误的数量
1 预测0错误的数量 预测1正确的数量

              图4.2.2  混淆矩阵各格的意义

  如果将正确看成是 True,错误看成是 False, 0 看成是 Negtive, 1 看成是 Positive。然后将上表中的文字替换掉,混淆矩阵如下:

真实  \  预测01
0 TN FP
1 FN TP

               图4.2.3  混淆矩阵

  因此 TN 表示真实类别是 Negtive,预测结果也是 Negtive 的数量; FP 表示真实类别是 Negtive,预测结果是 Positive 的数量; FN 表示真实类别是 Positive,预测结果是 Negtive 的数量;TP 表示真实类别是 Positive,预测结果也是 Positive 的数量。

  很明显,当 FN 和 FP 都等于 0 时,模型的性能应该是最好的,因为模型并没有在预测的时候犯错误。所以模型分类性能越好,混淆矩阵中非对角线上的数值越小

  混淆矩阵代码实现:

 

import numpy as np

def confusion_matrix(y_true, y_predict):
    '''
    构建二分类的混淆矩阵,并将其返回
    :param y_true: 真实类别,类型为ndarray
    :param y_predict: 预测类别,类型为ndarray
    :return: shape为(2, 2)的ndarray
    '''
    def TN(y_true, y_predict):
        return np.sum((y_true == 0) & (y_predict == 0))
    
    def FP(y_true, y_predict):
        return np.sum((y_true == 0) & (y_predict == 1))

    def FN(y_true, y_predict):
        return np.sum((y_true == 1) & (y_predict == 0))

    def TP(y_true, y_predict):
        return np.sum((y_true == 1) & (y_predict == 1))

    return np.array([
        [TN(y_true, y_predict), FP(y_true, y_predict)],
        [FN(y_true, y_predict), TP(y_true, y_predict)]
    ])
posted @ 2020-01-13 17:27  泰初  阅读(928)  评论(0编辑  收藏  举报