【问题标题】:Confusion matrix sklearn bug?混淆矩阵sklearn错误?
【发布时间】:2019-10-15 21:09:01
【问题描述】:

我正在使用sklearn.metrics.confusion_matrix 进行测试,看看如果预测数组中有一个不在标签和映射数组中的类会发生什么。 我的代码是:

from sklearn.metrics import confusion_matrix as cm

a = ["positive\n", "positive\n", "negative\n", "positive\n", "negative\n"]
b = ["negative\n", "negative\n", "don't\n", "negative\n", "negative\n"]
m = ["positive\n", "negative\n"]
c = cm(a, b, m)
TN, FP, FN, TP = c.ravel()

print(c)
print("")
print("{} {} {} {}\n".format(TN, FP, FN, TP))

输出是:

[[0 3]
 [0 1]]

0 3 0 1

所以don't这个类被跳过了。


但是,如果您查看documentation 的版本v0.21.2,这是我安装的ravel() 方法“应该”输出我写的混淆矩阵的值:TN、FP、FN、TP .我的print 的输出不同。似乎ravel() 的真实输出被翻转:TP、FN、FP、TN。我的想法对吗?

【问题讨论】:

    标签: python python-3.x scikit-learn confusion-matrix


    【解决方案1】:

    没有错误。您已定义标签:

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

    因此"positive\n" 是负数,"negative\n" 是正数。结果符合您的要求。

    如果你这样修改m

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

    你会得到:

    1 0 3 0
    

    分别为TN, FP, FN, TP

    【讨论】:

    • 所以在二进制分类的情况下,映射数组中的第一个类必须是“负”类才能获得正确的ravel() 结果,否则我必须交换返回值?但最终结果是一样的,对吧?
    • 本身没有对错之分。要了解该过程,请构建一个矩阵,其中行是真实类,列是预测类。然后,用预测值和真实值填充矩阵。你就会得到结果。
    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2021-09-29
    • 2015-09-18
    • 2015-12-10
    • 2020-03-09
    • 2018-10-02
    • 2021-10-25
    • 2020-07-25
    相关资源
    最近更新 更多