异常检测输出修正
想要判断异常检测模型性能的好坏,我们需要将模型的输出数据和标签数据根据各种不同的评价指标做对比。然而,倘若我们直接用两者做对比,得分会比较低,并且也不符合实际情况。实际情况下,我们认为我们只要判断出连续异常点中的一个异常点,就可以认为找到了这一段异常点。因此,我们必须对异常检测的输出进行修正。
例子(0为正常,1为异常)
预测值为: [0 0 0 0 0 1 0 0 1]
标签值为: [0 1 1 0 1 1 1 0 0]
我们希望修正后的输出值为:[0 0 0 0 1 1 1 0 1]
加粗的1是我们修正加上去的。
程序如下
参考来源为 Anomaly Transformer: Time Series Anomaly Detection with Association Discrepancy 的源码
import numpy as np
def detection_adjustment(gt,pred):
anomaly_state = False
for i in range(len(gt)):
if gt[i] == 1 and pred[i] == 1 and not anomaly_state:
anomaly_state = True
for j in range(i, 0, -1):
if gt[j] == 0:
break
else:
if pred[j] == 0:
pred[j] = 1
for j in range(i, len(gt)):
if gt[j] == 0:
break
else:
if pred[j] == 0:
pred[j] = 1
elif gt[i] == 0:
anomaly_state = False
if anomaly_state:
pred[i] = 1
pred = np.array(pred)
gt = np.array(gt)
return gt,pred
if __name__ == '__main__':
gt=np.array([0,1,1,0,1,1,1,0,0])
pred=np.array([0,0,0,0,0,1,0,0,1])
gt,pred=detection_adjustment(gt,pred)
print("pred: ", pred)
print("gt: ", gt)
修正后的标签符合预期