《机器学习(周志华)》笔记--模型的评估与选择(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。
如果我们把这些结果组成如下矩阵,则该矩阵就成为混淆矩阵。
| 真实 \ 预测 | 0 | 1 | 
|---|---|---|
| 0 | 9978 | 12 | 
| 1 | 2 | 8 | 
图4.2.1 检测系统数据组成的混淆矩阵
混淆矩阵中每个格子所代表的的意义也很明显,意义如下:
| 真实 \ 预测 | 0 | 1 | 
|---|---|---|
| 0 | 预测 0正确的数量 | 预测 1错误的数量 | 
| 1 | 预测 0错误的数量 | 预测 1正确的数量 | 
图4.2.2 混淆矩阵各格的意义
如果将正确看成是 True,错误看成是 False, 0 看成是 Negtive, 1 看成是 Positive。然后将上表中的文字替换掉,混淆矩阵如下:
| 真实 \ 预测 | 0 | 1 | 
|---|---|---|
| 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)]
    ])

 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号