【机器学习】FPR(False Positive Rate,误报率)是什么?

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 / ...)

多分类时我们常把 "所有攻击类"合并为1Normal为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.csvsummary_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(任何场景都通用)

  1. 确定口径 :谁是"正常"类(通常是 Normal/Benign)。

  2. 数数 :在真实为正常的样本中,统计

    • TN = 预测为正常
    • FP = 预测为攻击(任意攻击类都算错)
  3. 套公式 :FPR = FP / (FP + TN)

  4. 写解释 :把它乘以你的业务量(每小时/每天正常流量),换算成"每天多少条误报"。


报告/答辩可直接粘贴的表述(中英)

中文

"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/时延却显著上升,在线告警更适合二分类;需要家族级诊断与溯源时,再选择多分类。