混淆矩阵仅显示所选标签的对角线值,尽管存在错误分类

Confusion Matrix only shows diagonal values for selected labels despite misclassifications

提问人:Bella_18 提问时间:10/6/2023 最后编辑:DataJanitorBella_18 更新时间:10/31/2023 访问量:72

问:

我正在尝试从我的数据中为标签子集创建一个混淆矩阵。尽管对行进行了错误分类,但生成的混淆矩阵在除对角线外的所有地方都显示零。我错过了什么吗?

代码如下:

import pandas as pd
from sklearn.metrics import confusion_matrix
    
confusion_df = pd.read_csv("./confusion_data.csv")
confusion_df.head() # this dataframe contains true and predicted values of all the test observations
    
selected_labels = [14, 30, 57, 79, 83, 98, 101, 105, 137, 163]
    
# Filter the dataframe to keep only rows from selected labels list
filtered_df = confusion_df[(confusion_df['True'].isin(selected_labels))]
filtered_df = filtered_df.reset_index(drop=True)

# Generate the confusion matrix
confusion_mat = confusion_matrix(filtered_df['True'], filtered_df['Predicted'], labels=selected_labels)

运行此代码后,我的混淆矩阵如下所示:

array([[1602,    0,    0,    0,    0,    0,    0,    0,    0,    0],
       [   0, 1601,    0,    0,    0,    0,    0,    0,    0,    0],
       [   0,    0, 1601,    0,    0,    0,    0,    0,    0,    0],
       [   0,    0,    0, 1597,    0,    0,    0,    0,    0,    0],
       [   0,    0,    0,    0, 1601,    0,    0,    0,    0,    0],
       [   0,    0,    0,    0,    0, 1600,    0,    0,    0,    0],
       [   0,    0,    0,    0,    0,    0, 1596,    0,    0,    0],
       [   0,    0,    0,    0,    0,    0,    0, 1599,    0,    0],
       [   0,    0,    0,    0,    0,    0,    0,    0, 1569,    0],
       [   0,    0,    0,    0,    0,    0,    0,    0,    0, 1602]],
      dtype=int64)

鉴于我有 45 个错误分类的行,我预计对角线会出现一些非零值。我的代码有错误吗?

scikit-learn 混淆矩阵 多类分类

评论

0赞 Bella_18 10/10/2023
@DataJanitor,如果它是二元分类,那么矩阵将只有 4 个字段,如您所说。但是如果有 N 个类,那么就会有一个形状为 N x N 的矩阵
0赞 DataJanitor 10/16/2023
你有时间测试我的解决方案吗?如果是这样,它对你有帮助吗?

答:

0赞 PV8 10/9/2023 #1

要使用文档,请执行以下操作

计算混淆矩阵以评估分类的准确性。

根据定义,混淆矩阵 C 使得 C_ij 等于 已知属于第 I 组并预测属于 J组 .

主要的例子是:

from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
confusion_matrix(y_true, y_pred)
array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])

在你的例子中,你也没有二元分类,来解释主要的例子。有三个预测值:0、1、2 和三个可能的结果。该函数返回:

Cndarray of shape (n_classes, n_classes)
Confusion matrix whose i-th row and j-th column entry indicates the number of samples with true label being i-th class and predicted label being j-th class.

所以形状是(3,3)。所以矩阵是:

    predicted  0   1  2
true
0              2   0  0
1              0   0  1
2              1   0   2

您的混淆矩阵是有道理的,如果 TRUE 和 PREDICTIONS 值中没有双精度值,则只填充对角线是有道理的。

0赞 DataJanitor 10/11/2023 #2

是的,我看到一个问题。您只能筛选列中的选定标签,而不会筛选列中的选定标签。'True''Predicted'

当您使用 计算混淆矩阵时,它仅在 和 类的选定标签中查找匹配和错误分类。由于您的标签未被过滤为仅包含 ,因此任何不属于 的预测都会被有效忽略,从而导致对角线外元素为零。labels=selected_labels'True''Predicted''Predicted'selected_labelsselected_labels

因此,您希望同时筛选 true 列或(包括)预测列:

# Filter the dataframe to keep only rows where either 'True' or 'Predicted' is in selected_labels list
filtered_df = confusion_df[(confusion_df['True'].isin(selected_labels)) | (confusion_df['Predicted'].isin(selected_labels))]