在异常检测任务中:
-
正常样本:数量 很多,通常占绝大多数(> 95%)
-
异常样本:数量 很少,稀缺且重要(高风险)
因此是一个极度不均衡的二分类问题。
在这种情况下,常规的准确率(accuracy)往往不再适用,而 ROC 和 AUC 是更合适的评估方式。
计算步骤
1. 将异常分数按从高到低排序
(因为高分被认为是“更异常”)
2. 选一系列阈值(threshold)
从最大分数 → 最小分数,依次尝试作为判决线。
3. 每个阈值下做一次“二分类预测”:
然后统计四个基本量:
-
TP:预测为异常,且真的异常
-
FP:预测为异常,结果其实是正常
-
FN:预测为正常,结果其实是异常
-
TN:预测为正常,且真的正常
4. 计算:
5. 把所有 (FPR, TPR) 点连接成曲线
就得到了 ROC 曲线
这是一个ROC曲线的示例,不同的线是不同的网络攻击方式
AUC 是 ROC 曲线下的面积,其定义是:“从随机抽取的一个正样本和一个负样本中,模型判定正样本得分更高的概率”。
示例:你现在模型输出的是 MSE
无监督异常检测模型(如自编码器、LSTM、Transformer)会输出每个样本的 重建误差(MSE),你可以这样处理:
from sklearn.metrics import roc_curve, roc_auc_score
# y_true: 0/1 标签, mse_scores: 每个样本的 MSE 值
fpr, tpr, thresholds = roc_curve(y_true, mse_scores)
auc = roc_auc_score(y_true, mse_scores)
# 画 ROC 曲线
import matplotlib.pyplot as plt
plt.plot(fpr, tpr, label=f"AUC = {auc:.4f}")
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.title("ROC Curve for Anomaly Detection")
plt.grid()
plt.legend()
plt.show()