提问人:Bella_18 提问时间:10/6/2023 最后编辑:DataJanitorBella_18 更新时间:10/31/2023 访问量:72
混淆矩阵仅显示所选标签的对角线值,尽管存在错误分类
Confusion Matrix only shows diagonal values for selected labels despite misclassifications
问:
我正在尝试从我的数据中为标签子集创建一个混淆矩阵。尽管对行进行了错误分类,但生成的混淆矩阵在除对角线外的所有地方都显示零。我错过了什么吗?
代码如下:
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 个错误分类的行,我预计对角线会出现一些非零值。我的代码有错误吗?
答:
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_labels
selected_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))]
评论