I am currently using pandas.crosstab to generate the confusion matrix of my classifiers after testing. Unfortunately, sometimes my classifier fails, and classifies every signal as a single label (instead of multiple labels). pandas.crosstab generates a single vector (or a non-square matrix) in that case instead of a square matrix.
As example, my ground truth would be

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填充缺失的标签?

推荐答案

您可以创建所需形状的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) 

Output

     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],这种方法是否有效

Python相关问答推荐

如果在第一行之前不存在其他条件,如何获得满足口罩条件的第一行?

修剪Python框架中的尾随NaN值

判断两极中N(N 2)列水平是否相等

使用Python进行网页抓取,没有页面

在Docker中运行HAProxy时无法获得503服务

删除pandas rame时间序列列中未更改的值

如何使用Selenium访问svg对象内部的元素

使用Ubuntu、Python和Weasyprint的Docker文件-venv的问题

如何使用Python中的clinicalTrials.gov API获取完整结果?

如何让我的Tkinter应用程序适合整个窗口,无论大小如何?

跟踪我已从数组中 Select 的样本的最有效方法

Odoo -无法比较使用@api.depends设置计算字段的日期

使用polars .滤镜进行切片速度比pandas .loc慢

Python会扔掉未使用的表情吗?

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

在Python中管理打开对话框

Pandas—在数据透视表中占总数的百分比

创建可序列化数据模型的最佳方法

如何在表中添加重复的列?

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?