FPR(False Positive Rate,误报率)
一句话定义(先有直觉)
FPR = 在所有"本来是正常(benign)"的流量里,被你错报成"攻击"的比例。
英文:FPR = FP / (FP + TN)
- FP(假阳):正常 → 被判成攻击
- TN(真阴):正常 → 被判成正常
它衡量"误报"的强度。FPR越高,运维就越容易被假警报淹没(alert fatigue)。
和其它指标怎么区分?
- Precision(精准率) :从"被判成攻击的那些"里看,有多少是真攻击。
- FPR(误报率) :从"所有正常样本"里看,有多少被错报为攻击。
- Specificity(特异度) :识别"正常"的能力 = 1 − FPR。
你的二分类案例(Normal vs Attack)
假设测试集中"正常 "有 1,000 条:
- 模型把其中 20 条误报成攻击(FP=20)
- 有 980 条判对(TN=980)
则
FPR=FPFP+TN=2020+980=0.02=2% \text{FPR}=\frac{FP}{FP+TN}=\frac{20}{20+980}=\mathbf{0.02}=2\% FPR=FP+TNFP=20+98020=0.02=2%
解读 :每 100 条正常流量里,会有 2 条被错报为攻击。
运维换算 :如果网关每天有 50,000 条正常 记录,FPR=2% ⇒ 1,000 条/天误报,需要人力处置------这就是告警疲劳的来源。
你的多分类案例(Normal / DoS / DDoS / Mirai / ...)
多分类时我们常把 "所有攻击类"合并为1 、Normal为0,先"压扁"为二分类来算FPR:
- 只关心"正常是否被错报成任意一种攻击"。
- 这样得到的FPR可直接与二分类轨道对比,非常适合你"二 vs 多"的同台比较。
举例(压扁后统计):
- 正常样本:TN=4,900(判对),FP=100(错报为DoS/DDoS/Mirai中的某一类)
FPR=100100+4900=2% \text{FPR}=\frac{100}{100+4900}=\mathbf{2\%} FPR=100+4900100=2%
解读 :虽然细分了很多攻击家族,但误报仍然以"正常被错报"为口径,所以FPR可以与二分类直接比较。
怎么从脚本输出里找到/使用 FPR?
你的脚本已经把 FPR 写进了汇总表里:
-
summary_binary.csv
与summary_multiclass.csv
:都有FPR
列(每个模型一行)。 -
results_summary.xlsx
:两个工作表 Binary_Summary / Multiclass_Summary 里也有 FPR 列,直接截图贴报告/幻灯片。 -
classification_report_*.csv
:不会直接给FPR (它给precision/recall/F1);但你可以用混淆矩阵 (*_cm_*.csv
)自己算:- 取压扁后的二分类 TN、FP ,按 FPR = FP / (FP+TN) 计算即可。
二分类 :脚本按 0/1 直接算。
多分类:脚本先把 Normal 当 0、其余类当 1,再算 FPR(与你的研究需求一致)。
初学者"四步法"计算 FPR(任何场景都通用)
-
确定口径 :谁是"正常"类(通常是 Normal/Benign)。
-
数数 :在真实为正常的样本中,统计
- TN = 预测为正常
- FP = 预测为攻击(任意攻击类都算错)
-
套公式 :FPR = FP / (FP + TN)
-
写解释 :把它乘以你的业务量(每小时/每天正常流量),换算成"每天多少条误报"。
报告/答辩可直接粘贴的表述(中英)
中文
"FPR(误报率)表示在真实为正常 的流量中被错报为攻击 的比例(FPR=FP/(FP+TN))。我们在多分类中将所有攻击合并为1、Normal为0后计算FPR,使其与二分类轨道可直接对比。FPR能量化告警疲劳 风险:例如当网关每天有 50,000 条正常记录且 FPR=2% 时,意味着约 1,000 条/天的误报,需要额外的人力处置。"
English
"FPR (false-positive rate) is the proportion of benign events incorrectly flagged as attacks, i.e., FP/(FP+TN) . For multiclass, we collapse all attack families into one positive class to make FPR directly comparable with the binary track. FPR quantifies alert fatigue: e.g., with 50,000 benign events/day and FPR=2%, we expect ~1,000 false alarms/day."
需要用代码自己算?(可选小片段)
二分类:
python
from sklearn.metrics import confusion_matrix
# y_true: 0=Normal, 1=Attack
# y_pred: model predictions (0/1)
tn, fp, fn, tp = confusion_matrix(y_true, y_pred, labels=[0,1]).ravel()
fpr = fp / (fp + tn)
多分类(压扁后计算FPR):
python
import numpy as np
from sklearn.metrics import confusion_matrix
# 假设 'Normal' 是正常,其余都视为攻击
is_attack = np.array([0 if str(y)=='Normal' else 1 for y in y_true_multi])
pred_is_attack = np.array([0 if str(y)=='Normal' else 1 for y in y_pred_multi])
tn, fp, fn, tp = confusion_matrix(is_attack, pred_is_attack, labels=[0,1]).ravel()
fpr = fp / (fp + tn)
但你不用自己写 :脚本的
summary_*.csv
已经给出 FPR,直接拿来用,并在报告里配上"每天误报条数"的换算就能把结论落到业务上。
小结(写在你的讨论段的两句话)
- 宏F1 看"整体公平与小类表现 ",FPR 看"误报负担"。
- 结合二者:若多分类的macro-F1几乎不增,FPR/时延却显著上升,在线告警更适合二分类;需要家族级诊断与溯源时,再选择多分类。