Scikit-learn 混淆矩阵

新手上路,请多包涵

我不知道我是否正确设置了二进制分类问题。我将正类标记为 1,将负类标记为 0。但是据我了解,默认情况下 scikit-learn 使用类 0 作为其混淆矩阵中的正类(因此与我的设置方式相反)。这让我很困惑。在 scikit-learn 的默认设置中,第一行是正类还是负类?让我们假设混淆矩阵输出:

 confusion_matrix(y_test, preds)
 [ [30  5]
    [2 42] ]

它在混淆矩阵中会是什么样子? scikit-learn 中的实际实例是行还是列?

           prediction                        prediction
           0       1                          1       0
         -----   -----                      -----   -----
      0 | TN   |  FP        (OR)         1 |  TP  |  FP
actual   -----   -----             actual   -----   -----
      1 | FN   |  TP                     0 |  FN  |  TN

原文由 OAK 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 920
1 个回答

scikit learn 按升序对标签进行排序,因此 0 是第一列/行,1 是第二列

>>> from sklearn.metrics import confusion_matrix as cm
>>> y_test = [1, 0, 0]
>>> y_pred = [1, 0, 0]
>>> cm(y_test, y_pred)
array([[2, 0],
       [0, 1]])
>>> y_pred = [4, 0, 0]
>>> y_test = [4, 0, 0]
>>> cm(y_test, y_pred)
array([[2, 0],
       [0, 1]])
>>> y_test = [-2, 0, 0]
>>> y_pred = [-2, 0, 0]
>>> cm(y_test, y_pred)
array([[1, 0],
       [0, 2]])
>>>

这是写在 文档 中的:

labels : array, shape = [n_classes], optional 用于索引矩阵的标签列表。这可用于重新排序或选择标签的子集。 如果没有给出,那些在 y_true 或 y_pred 中至少出现一次的将按 排序顺序使用

因此,您可以通过为 confusion_matrix 调用提供标签来改变此行为

>>> y_test = [1, 0, 0]
>>> y_pred = [1, 0, 0]
>>> cm(y_test, y_pred)
array([[2, 0],
       [0, 1]])
>>> cm(y_test, y_pred, labels=[1, 0])
array([[1, 0],
       [0, 2]])

实际/预测的排序就像在您的图像中一样 - 预测在列中,实际值在行中

>>> y_test = [5, 5, 5, 0, 0, 0]
>>> y_pred = [5, 0, 0, 0, 0, 0]
>>> cm(y_test, y_pred)
array([[3, 0],
       [2, 1]])

  • 真:0,预测:0(值:3,位置 [0, 0])
  • 真:5,预测:0(值:2,位置 [1, 0])
  • 真:0,预测:5(值:0,位置 [0, 1])
  • 真:5,预测:5(值:1,位置 [1, 1])

原文由 lejlot 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题