关于sklearn绘制混淆矩阵的问题

关于sklearn绘制混淆矩阵的问题,第1张

sklearn有一个绘制混淆矩阵的函数叫做 confusion_matrix(label,predict)

其目的是根据标签和模型预测值来绘制出混淆矩阵,label就是实际值,predict是预测值,格式要求是元素为str格式的列表,比如 label = [ '0' ,'1' ,'2'] 表示的就是三个样本的标签,0,1,2分别表示的是其对应的分类编号,同时也是最终混淆矩阵的行索引(后面会展开讲讲),pedict的样本顺序必须与之对应,通过一一按顺序成组比对label和predict的类别获得最终的结果。

最终结果如下图示意:

图1.三分类问题混淆矩阵示意图

上图假设了一个3分类的问题,行索引代表的是实际值,列索引代表的是预测值,矩阵中的数字则代表对应的样本数量,以第二列[1, 7, 1]为例,7的位置是[1][1],即label=predict,分类正确,1类被分对的样本有7个,所有对角线上的数字表示正确分类的数量,第一个1的位置是[0][1],表示样本是第0类,但是模型把它分为第1类,这样的样本有1个,依次类推。

如果想研究模型的错误,往往不关注对角上的元素,可以全部为0,然后按行求和,则是对应样本的错误总数(按列求和则是本不属于此类,但被分为此类的样本总数),则上图变为(求和是绘制完成后另外 *** 作的):

图2.只包括错误结果的混淆矩阵 

笔者处理的是60分类问题,使用sklearn.confusion_matrix()得到的结果出现了如下问题:

 可以看见,数据发生了错位,相同颜色的数据出现了整体偏移,总数上是没有问题的,但是在单独提取某一种错误的样本时,发现样本的数量对不上,原因暂时未知,于是自己写了一个函数来绘制混淆矩阵:

def my_confusion_matrix(true, predict, n_class, len):
    C = np.zeros((n_class,n_class))
    for i in range(0,len):
        C[int(true[i]), int(predict[i])] += 1
    return C

true,predict不在赘述,n_class就是问题中类别的数量,len是测试集的样本数量。

其实很简单,以60分类为例,先定义一个(60*60)成组遍历两个数组,label做为行索引,predict做为列索引,对应的位置加1,最终结果经过验证是正确的。

目前不知道为什么sklearn.confusion_matrix()绘制的结果是错的,以后大家用各种库函数跑出来的结果还是要多看一眼。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/713980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存