You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sklearn v0.21.2 confusion_matrix的ravel方法输出是否存在异常?

你的判断是完全正确的,我们来一步步拆解这个问题:

1. 未包含类别的处理逻辑

你观察到的"don't"类别被忽略是符合sklearn 0.21.2版本行为的:当通过labels参数指定类别列表时,所有不在这个列表中的样本(无论真实标签还是预测标签)都会被直接排除在混淆矩阵的计算之外。你的第三个样本预测标签"don't\n"不在m的列表中,所以这个样本不会被计入最终的统计结果。

2. ravel()输出顺序的核心原因

你对输出顺序的怀疑是准确的——实际输出确实是TP、FN、FP、TN,而非你预期的TN、FP、FN、TP,这完全由labels参数的顺序定义决定:

sklearn的confusion_matrix严格按照你传入的labels列表顺序构建矩阵:

  • 矩阵的行对应真实标签,顺序与labels一致
  • 矩阵的列对应预测标签,顺序也与labels一致

在你的代码中,m = ["positive\n", "negative\n"],相当于把positive\n定义为正类(第一个类别),negative\n定义为负类(第二个类别),此时混淆矩阵的结构是:

预测positive预测negative
真实positiveTPFN
真实negativeFPTN

你的输出矩阵是:

[[0 3]
 [0 1]]

按行展开(ravel()的默认行为)得到[0, 3, 0, 1],对应:

  • 0 → TP(真实positive、预测positive的数量)
  • 3 → FN(真实positive、预测negative的数量)
  • 0 → FP(真实negative、预测positive的数量)
  • 1 → TN(真实negative、预测negative的数量)

而你参考的文档中TN、FP、FN、TP的顺序,是默认将第一个类别作为负类的场景(比如常见的0代表负类、1代表正类),但你把正类放在了labels的第一位,所以顺序自然反转了。

如果想要得到预期的TN、FP、FN、TP顺序,只需要调整labels的顺序,把负类放在前面:

m = ["negative\n", "positive\n"]

重新计算后混淆矩阵会变成:

[[1 0]
 [3 0]]

ravel()之后就是[1, 0, 3, 0],完全匹配文档描述的顺序。

内容的提问来源于stack exchange,提问作者User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:06:46