You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解索引错误(Index Error)?使用pretty_confusion_matrix库生成混淆矩阵时遇索引越界问题求助

解决pretty_confusion_matrix的IndexError问题

我来帮你搞定这个报错——本质原因是混淆矩阵必须是方阵(行数和列数完全相等),但你的DataFrame是49行×36列,行和列维度不匹配,才导致库在访问对角线元素时抛出索引越界错误。

为什么会出现这个问题?

pp_matrix函数要求输入的DataFrame是标准的混淆矩阵格式:

  • 行代表真实类别,列代表预测类别
  • 行的类别集合必须和列的完全一致,也就是说行数必须等于列数

你的数据里行有49个类别,列却只有36个,当库遍历列索引去访问对应行的对角线元素(array_df[col][col])时,列的索引很快就超出了行的有效范围,直接触发了IndexError。

具体解决方案

1. 先明确你的类别集合

首先搞清楚:你是想保留所有49个真实类别,还是只保留列里有的36个预测类别?根据需求选下面的调整方式:

方式一:补全缺失的列(保留所有真实类别)

如果你的行是完整的真实类别列表,列只是少了部分类别,那就把缺失的列补上,用0填充计数:

# 获取所有真实类别(行索引)
all_true_classes = df.index.tolist()
# 获取现有预测类别(列名)
existing_pred_classes = df.columns.tolist()
# 找出列里缺失的类别
missing_classes = [cls for cls in all_true_classes if cls not in existing_pred_classes]
# 给DataFrame添加这些缺失列,值设为0
for cls in missing_classes:
    df[cls] = 0
# 可选:把列的顺序调整得和行索引一致,更符合混淆矩阵规范
df = df[all_true_classes]

方式二:过滤多余的行(只保留预测类别对应的真实行)

如果那些不在列里的行类别是不需要的,直接过滤掉:

# 获取所有预测类别(列名)
pred_classes = df.columns.tolist()
# 只保留行索引在预测类别里的行
df = df[df.index.isin(pred_classes)]

2. 验证调整后的维度

调整完后,先检查一下DataFrame的形状:

print(df.shape)

输出必须是(N, N)的方阵格式,比如(49,49)或者(36,36),这才符合混淆矩阵的要求。

3. 重新运行函数

维度没问题后,再执行你的代码:

pp_matrix(df, cmap=cmap)

额外排查小技巧

如果调整后还是报错,可以检查这两点:

  • 行索引或列名有没有重复的类别?重复项会导致库内部处理时维度异常
  • 确认DataFrame里的数值都是整数(混淆矩阵是计数矩阵,必须是整数类型)

内容的提问来源于stack exchange,提问作者c_metaphorique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:39:07