微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Sklearn - 序数数据的多类混淆矩阵

我编写了一个预测有序数据的模型。目前,我正在使用 quadratic cohen's kappa 评估我的模型。我正在寻找一种使用混淆矩阵将结果可视化的方法,然后在考虑预测距离的情况下计算召回率、精度和 f1 分数。

IE 在 class 为 1 时预测 2 比在 class 为 1 时预测 3 要好。。 >

我编写了以下代码来绘制和计算结果:

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,average= 'weighted',zero_division=0))
    print(f'Precision score:',precision_score(df.x,zero_division=0))
    print(f'F1 score:',f1_score(df.x,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考虑样本 i 的真实类别的分数。

采用相同的逻辑,召回将是相关人群的 TP 得分总和,即

R = (sum of (weighted) TP scores)/(total amount of samples)

最后,F1 是 Precision 和 Recall 的调和平均值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。