如何确保pandas.crosstab返回方形矩阵 缺失标签填充0
pandas.crosstab生成固定维度方形混淆矩阵方案
pandas.crosstab默认仅统计输入序列中实际出现的标签值,当预测结果未覆盖全部类别时,会自动丢弃未出现的标签,输出非方形矩阵/一维向量,不符合混淆矩阵的格式要求。
实现逻辑
提前指定全量标签集合,将真实、预测标签序列转换为pandas分类类型,强制crosstab统计时覆盖所有指定类别,未出现的类别位置自动填充0,无需后续手动对齐索引。
代码示例
import pandas as pd # 测试数据 true_data = pd.Series([1, 1, 2, 2, 3, 3, 4, 4, 5, 5]) pred_data = pd.Series([3, 3, 2, 3, 2, 1, 1, 3, 4, 1]) # 定义全量类别标签,若有预设的全类别列表可直接赋值 all_labels = sorted(true_data.unique()) # 将两个标签序列转换为指定类别范围的分类类型 true_with_all_cat = pd.Categorical(true_data, categories=all_labels) pred_with_all_cat = pd.Categorical(pred_data, categories=all_labels) # 生成混淆矩阵 confusion_matrix = pd.crosstab(true_with_all_cat, pred_with_all_cat, dropna=False)
执行后输出结果与预期完全一致,为行列均覆盖全部标签的5*5方阵:
col_0 1 2 3 4 5 row_0 1 0 0 2 0 0 2 0 1 1 0 0 3 1 1 0 0 0 4 1 0 1 0 0 5 1 0 0 1 0
注意事项
- 若分类任务有固定的全类别集合(例如多分类任务预设的所有标签),可直接将
all_labels替换为固定标签列表,无需从真实标签中提取,可覆盖真实/预测序列均未出现某类标签的极端场景 - 该方法兼容分类器异常的极端情况:哪怕所有样本都被预测为单一标签,也能输出维度正确的方形混淆矩阵
- 必须保留
dropna=False参数,避免空值标签被自动丢弃导致维度错位
内容的提问来源于stack exchange,提问作者arc_lupus
相关产品推荐
相关产品推荐

