一张分类结果表只留下九个数字,读者还无法确定每个错误属于哪类。scikit-learn 1.9.1的confusion_matrix文档定义,矩阵第i行、第j列的值,统计真实类别属于i、预测类别属于j的观察数。[1] 行列身份是定义的一部分;离开类别标签,某个非对角位置只能说明两种身份不同,还不能指出是哪一种类别被认成另一种。

官方例子给出六个真实标签与六个预测标签,类别为ant、bird和cat,并明确按这个顺序排列。例中ant对应的行是二、零、零;bird对应的行是零、零、一;cat对应的行是一、零、二。按该定义阅读,bird行中落在cat列的一,就表示一项真实为bird而预测为cat的记录。它不能反过来写成真实cat被预测为bird。这些是文档示例数字,并非本文训练模型的结果。

类别顺序也需要随表保留。labels参数可以重新排列类别,或选取其中一部分;若未指定,文档采用真实标签或预测标签中至少出现一次的类别,并按排序后的顺序组织。[1] 因此,两个矩阵的第一行即使数值相同,也应先核对标签列表。行号本身不替某种动物或业务类别保留固定位置,选择子集的矩阵也不能自动被视为全部类别的完整展示。

该函数还区分计数与归一化结果。normalize为None时不归一化;true按真实类别所在的行归一化,pred按预测类别所在的列归一化,all则相对于整个样本总体。[1] 同一个格子因采用不同基准,会回答不同问题:它在某个真实类别中占多少,与它在某个预测类别中占多少,所比较的集合并不相同。这里的差别来自参数定义,而不是模型突然改变了分类。

这个关系对结果表的转写尤其有用。假设报告保留了归一化后的数值,却删去normalize口径,读者便无法确定比例参照的是一行、一列还是总体。这个假设没有添加新的样本计算,只说明参数信息被省略后会损失什么。原文也提醒,其他资料可能采用不同的坐标轴约定,所以不能凭熟悉的表形,默认每个来源都把真实类别放在行上。

完整表述因而应把真实与预测的方向、类别顺序、计数或归一化口径连在一起。本文依据该版本API的定义与原示例,首次发布日期未知;没有运行分类器、比较模型优劣或选择业务阈值。矩阵在这里提供的是结果组织方式,具体数字的含义须由这些明确的标签与参数共同确定。

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。