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 | |
|---|---|---|
| 真实positive | TP | FN |
| 真实negative | FP | TN |
你的输出矩阵是:
[[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
相关产品推荐
相关产品推荐

