显示反转的 ROC 曲线

Display inverted ROC Curve

我的异常检测算法给了我一组预测,其中所有大于 0 的值都应该是正值 class (= 0),所有其他值都应该 class 化为异常(= 1)。我也构建了 classifier:(我有三个数据集,一个只有非异常值,另一个有所有异常值):

normal = np.load('normal_score.pkl')
anom_1 = np.load('anom1_score.pkl')
anom2_ = np.load('anom2_score.pkl')

y_normal = np.asarray([0]*len(normal)) # I know they are normal
y_anom_1 = np.asarray([1]*len(anom_1)) # I know they are anomaly
y_anom_2 = np.asarray([1]*len(anom_2)) # I know they are anomaly

score = np.concatenate([normal, anom_1, anom_2])
y = np.concatenate([y_normal, y_anom_1, y_anom_2])

auc = roc_auc_score(y, score)
fpr, tpr, thresholds = roc_curve(y, score)
display = RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=auc)

我得到的 AUC 分数是 0.02,情节如下:

根据我的理解,这个结果很好,因为我应该反转标签使其接近 0.98,但我的问题是:有没有办法指定它并通过函数自动反转它? 我的正常分数数据中的值都在 (21;57) 范围内,异常值在 (-1090; -1836) 范围内,因此应该很容易发现它们。

“我应该把标签倒过来使它接近 0.98”
这不是应该做的。这是因为如果你可以预测“正常”,比方说,以 95% 的置信度,你不能由此推断你也可以以同样的置信度预测“异常”。 在数据严重不平衡的情况下变得至关重要,这里可能就是这种情况。

您应该定义您想要以高置信度预测这两者中的哪一个,以及目标预测指标是什么。例如,如果您的目标是预测“异常”的准确率和召回率,那么这应该是您的 class“1”并相应地计算指标,反之亦然。