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()绘制的结果是错的,以后大家用各种库函数跑出来的结果还是要多看一眼。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)