我正在多标签任务上训练一个具有tensorflow的electra模型。每个标签的ROC表现
AUROC per tag
morality_binary: 0.8840802907943726
emotion_binary: 0.8690611124038696
positive_binary: 0.9115268588066101
negative_binary: 0.9200447201728821
care_binary: 0.9266915321350098
fairness_binary: 0.8638730645179749
authority_binary: 0.8471786379814148
sanctity_binary: 0.9040042757987976
harm_binary: 0.9046630859375
injustice_binary: 0.8968375325202942
betrayal_binary: 0.846387505531311
subversion_binary: 0.7741811871528625
degradation_binary: 0.9601025581359863
但是当我运行sklearn分类报告时:
THRESHOLD = 0.5
y_pred = predictions.numpy()
y_true = labels.numpy()
upper, lower = 1, 0
y_pred = np.where(y_pred > THRESHOLD, upper, lower)
print(classification_report(
y_true,
y_pred,
target_names=LABEL_COLUMNS,
zero_division=0
))
…其中5个标签的f值为0:
precision recall f1-score support
morality_binary 0.72 0.73 0.73 347
emotion_binary 0.66 0.73 0.69 303
positive_binary 0.71 0.76 0.73 242
negative_binary 0.70 0.62 0.65 141
care_binary 0.67 0.60 0.63 141
fairness_binary 0.55 0.53 0.54 166
authority_binary 0.00 0.00 0.00 49
sanctity_binary 0.00 0.00 0.00 23
harm_binary 0.48 0.32 0.39 50
injustice_binary 0.62 0.56 0.59 97
betrayal_binary 0.00 0.00 0.00 30
subversion_binary 0.00 0.00 0.00 8
degradation_binary 0.00 0.00 0.00 10
谁能给我解释一下这是怎么可能的?我能理解低f分,但0分?我假设0是负数,1是正数
AUROC计算ROC曲线下的面积,作为分类器执行情况的度量(0.5分是随机的,掷硬币模型)。为了绘制ROC曲线,需要在不同的阈值处计算两个值,以区分正例和负例。
- y轴:真阳性率(TPR) -模型预测的阳性样本中有多少为阴性。
- x轴:假阳性率(False positive rate, FPR) -模型预测的阴性样本中有多少为阳性。
TPR又称召回。我们使用以下公式计算:
TPR =真阳性/(真阳性+假阴性)= True positive/All positive
所以TPR为0的唯一原因是TP也为0。这意味着当我们使用以下公式计算精度时,精度也将为0:
Precision =真阳性/(真阳性+假阳性)
当且仅当TP等于0时,结果也为0。
现在给定ROC曲线(ROC曲线如图所示),如果FPR为0,曲线下的面积也等于0。这是因为您在代码中选择了一个阈值(0.5)来预测0或1。这不是ROC曲线和AUROC测量的表示。
我建议你看一下ROC曲线,并尝试不同的值作为你的分类阈值。得到的AUROC值表明你的模型通常比随机模型表现得更好,所以你应该找到一个好的阈值。