gpt4 book ai didi

python - Sklearn - 序数数据的多类混淆矩阵

转载 作者:行者123 更新时间:2023-12-04 07:27:13 27 4
gpt4 key购买 nike

我写了一个预测序数数据的模型。目前,我正在使用 quadratic cohen's kappa 评估我的模型.我正在寻找一种使用混淆矩阵来可视化结果的方法,然后在考虑预测距离的情况下计算召回率、精度和 f1 分数。
I.E 预测 2 当类(class)是 1 比预测要好 3 当类(class)是 1 .
我编写了以下代码来绘制和计算结果:

def plot_cm(df, ax):
cf_matrix = confusion_matrix(df.x, df.y,normalize='true',labels=[0,1,2,3,4,5,6,7,8])

ax = sns.heatmap(cf_matrix, linewidths=1, annot=True, ax=ax, fmt='.2f')
ax.set_ylabel(f'Actual')
ax.set_xlabel(f'Predicted')

print(f'Recall score:',recall_score(df.x,df.y, average= 'weighted',zero_division=0))
print(f'Precision score:',precision_score(df.x,df.y, average= 'weighted',zero_division=0))
print(f'F1 score:',f1_score(df.x,df.y, average= 'weighted',zero_division=0))
enter image description here
Recall score: 0.53505
Precision score: 0.5454783454981732
F1 score: 0.5360650278722704
可视化很好,但是,计算忽略了“几乎”正确的预测。 I.E 预测 8 当实际是 9 (例如)。
有没有办法在考虑数据的有序行为的情况下计算召回率、精度和 F1?

最佳答案

常规精度(对于类)计算为真阳性与该类的完全检测的比率。通常真正的阳性检测以二进制方式定义:您要么正确地检测到类,要么没有。样本i的TP检测分数没有任何限制模糊(或者换句话说,轻微惩罚接近类的检测并随着差异的增加使惩罚更加严重):

TP(i) = max(0, (1 - abs(detected_class(i) - true_class(i))/penalty_factor) )
哪里 TP_i是样本 i 的“真阳性检测”值, 并且是 [0,1] 之间的某个数字- 这是 。合理制作 penalty_factor等于类的数量(它应该大于 1)。通过更改它,您可以控制将惩罚多少“远程”类。例如,如果您认为超过 3 的差异足以考虑“未检测到”,请将其设置为 3。如果您将其设置为 1,您将返回到“常规”精度公式。我正在使用 max()以确保TP分数不会变成负数。
现在,为了获得正确的分母,您需要将其设置为 TP(i)>0 的样本数。也就是说,如果您总共有 100 个样本,其中 5 个样本的 TP 检测分数为 1,其中 6 个样本的 TP 检测分数为 0.5,那么您的精度将为 (5 + 6*0.5)/(5+6)。
这里的一个问题是“每个类的精度”变得毫无意义,因为任何类都以某种方式与所有类相关,如果您需要按类“加权”的总精度(对于不平衡类的情况),您需要将其计入 TP 分数考虑 true sample 类别 i .
采用相同的逻辑,召回将是相关人群的 TP 分数的总和,即
R = (sum of (weighted) TP scores)/(total amount of samples)
最后,F1 是 Precision 和 Recall 的调和平均值。

关于python - Sklearn - 序数数据的多类混淆矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68151165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com