我目前正在使用pandas.crosstab来生成我的分类器测试后的混淆矩阵。不幸的是,有时我的分类器失败了,并将每个信号分类为一个标签(而不是多个标签)。在这种情况下,pandas.crosstab生成单个向量(或非平方矩阵),而不是平方矩阵。
举个例子,我的基本真理是
true_data = pandas.Series([1, 1, 2, 2, 3, 3, 4, 4, 5, 5])我的预测数据是
pred_data = pandas.Series([3, 3, 2, 3, 2, 1, 1, 3, 4, 1])应用pandas.crosstab(true_data, pred_data, dropna=False)给出
col_0 1 2 3 4
row_0
1 0 0 2 0
2 0 1 1 0
3 1 1 0 0
4 1 0 1 0
5 1 0 0 1有没有办法
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相反,即保留矩阵正方形并用0填充缺失的标签。
发布于 2022-07-06 15:00:55
您可以创建一个所需形状的zeros数组,然后用crosstab替换数组的一部分。
xtab = pd.crosstab(pred_data, true_data, dropna=False).sort_index(axis=0).sort_index(axis=1)
all_unique_values = sorted(set(true_data) | set(pred_data))
z = np.zeros((len(all_unique_values), len(all_unique_values)))
rows, cols = xtab.shape
z[:rows, :cols] = xtab
square_xtab = pd.DataFrame(z, columns=all_unique_values, index=all_unique_values) 输出
1 2 3 4 5
1 0.0 0.0 1.0 1.0 1.0
2 0.0 1.0 1.0 0.0 0.0
3 2.0 1.0 0.0 1.0 0.0
4 0.0 0.0 0.0 0.0 1.0
5 0.0 0.0 0.0 0.0 0.0我还没有考虑/测试,如果错配在“中间”,这种方法是否会起作用?比如,如果,pred_data = [1, 2, 4, 5]和true_data = [1, 2, 3, 4]
发布于 2022-07-06 14:47:16
在计算crosstab之后,您可以沿着索引和列轴对数据进行reindex。
i = df.index.union(df.columns)
df.reindex(index=i, columns=i, fill_value=0) 1 2 3 4 5
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 0https://stackoverflow.com/questions/72885273
复制相似问题