想象你是海关的资深关长。每天有成千上万个货柜入关,有的货柜混进了夹带违禁品的“问题件”,有的报关单与实物严重不符,有的货物表面完好、内里却暗藏玄机,甚至还有内部员工长期往供应链里安插“眼线”。如果这些货放行,轻则损失一笔生意,重则整个通关体系被渗透。 AI 工程师其实也是这样的“关长”,只不过检验的对象换成了训练数据。数据质量决定模型的天花板:一份混入异常值、错标标签、被恶意投毒的数据集,会让模型悄悄“学坏”,上线后翻车。这篇文章带你走一遍完整的“数据海关安检流程”——从异常值基础认知、统计与聚类检测法,到标签噪声识别、对抗样本与投毒防护,再到清洗流水线的搭建和污染程度的量化评估。学完,你就能亲手守好这道数据大门。

岗位关联

掌握数据质检与污染识别,是 AI 从业者交付可靠模型的底线能力。它帮你提前拦截“带病数据”,避免模型训练失控与上线事故,是数据工程师、算法工程师必须修炼的看家本领。

目录
  1. 可视化演示
  2. 异常值基础:可疑货物长什么样
  3. 统计检测法:常规 X 光与秤台
  4. 聚类检测法:谁不合群谁有嫌疑
  5. 标签噪声识别:核对报关单与实物
  6. 对抗样本检测:破解精心伪装的违禁品
  7. 数据投毒防护:揪出内部安插的眼线
  8. 清洗流水线:标准化多关卡安检流程
  9. 量化与实战:用指标守住数据国门
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示异常值与污染数据识别测试实战的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

异常值与污染数据识别测试实战:异常值与 异常值与污染数据的类型与影响分 统计异常检测方法:Z-scor 核心机制可视化 异常值与污染数据识别测试实战整体架构与关键组件

异常值基础:可疑货物长什么样

在海关眼里,一批正常货物有“标准画像”:重量、尺寸、来源地都落在合理区间。突然来了一个货柜,重量异常、尺寸离谱,这就是“可疑货物”——对应到数据里,我们叫它异常值(Outlier)。它指数据集中与其他样本显著偏离的数据点,可能来自传感器故障、人工录入笔误,也可能来自真实但稀有的极端事件。

异常值并非只有一种形态。点异常是单个样本自身偏离全局,如同一个货柜单独超重;上下文异常是一个样本在特定场景下才异常,比如空调在夏天开暖风,放在冬天就不稀奇;集合异常是一群样本集体偏离,如同一批货柜集体改了产地。认识形态,才能选对检测手段。

异常值的危害不只在“多了一个坏点”。它会拉偏统计量,让均值失真、方差膨胀,如同一个超重货柜把整台地磅的读数带偏;它还会干扰模型训练,让决策边界扭曲,最终模型上线后在小概率样本上疯狂出错。识别难点在于“真假难辨”:真实稀有事件和测量噪声长得一模一样,误删可能丢掉宝贵信号,漏删则埋下隐患。

好在,所有检测手段都始于一个朴素的共识:异常值是少数派、是偏离者。

回到海关视角:我们要做的,就是让“可疑货物”在均值、分布、聚集形态中被逐层识别出来,为后续每道安检关卡打下基础。

xˉ=1n∑i=1nxi\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i
均值的计算公式:全体样本一起“均摊”,正因为分母包含所有样本,一粒异常值就能把均值“拖偏”。
  1. 理解均值把所有样本值加起来再除以样本个数,得到数据中心位置,相当于货物总重量除以件数。
    xˉ=1n∑i=1nxi\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i
  2. 求和符号 Σ从第 1 个样本加到第 n 个样本,一件货物都不能漏。
    ∑i=1nxi=x1+x2+⋯+xn\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n
  3. 样本量 n样本总个数。n 越大,单个异常值对均值的拉扯越小,但再小也会让均值偏离真实值。
    n=样本个数n = \text{样本个数}

统计检测法:常规 X 光与秤台

海关入口的第一道设备是 X 光机和地磅:先测每个货柜的重量和尺寸,跟标准范围比对,超出限度的立刻警报。对应到数据领域,就是统计检测法——用数据自身的分布特征设定“正常区间”,越界的判为异常。

最常用的是 Z-score 法:先算出全体样本的均值 μ 和标准差 σ,再把每个样本换算成“偏离均值多少个标准差”。若一个样本偏离超过 3 个标准差(3σ 原则),就触发警报。另一个经典方法是 IQR 箱线图法:把数据从小到大排队,找到四分之一分位点 Q₁ 和四分之三分位点 Q₃,两者之差就是 IQR,正常区间划在 Q₁−1.5×IQR 到 Q₃+1.5×IQR 之外,两端之外全判异常。Z-score 适合近似正态分布的数据,箱线图法则对偏态分布更稳健。

作为第一道关卡,统计法简单高效,但它偏爱“规则身材”的数据。一旦数据形状怪异、呈月牙形或环形,X 光机就开始误报漏报。这时,海关需要更聪明的行为画像排查——密度聚类,也就是下一节的主角。

zi=xi−μσz_i = \frac{x_i - \mu}{\sigma}
Z-score 的含义:一个样本“偏离均值几个标准差”,好比货物重量偏离标准值几个刻度,偏离越多越可疑。
  1. 计算均值 μ全部样本的平均值,即数据重心。
    μ=1n∑i=1nxi\mu = \frac{1}{n} \sum_{i=1}^{n} x_i
  2. 计算标准差 σ样本偏离均值的平均幅度,σ 小说明数据抱团,σ 大说明数据松散。
    σ=1n∑i=1n(xi−μ)2\sigma = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (x_i - \mu)^2}
  3. 标准化转换每个值减去均值再除以标准差,得到该样本偏离均值的“倍数”。
    zi=xi−μσz_i = \frac{x_i - \mu}{\sigma}
  4. 判定规则通常 |z| > 3 判为异常,相当于货物重量超出“正常刻度”三格以上。
    ∣zi∣>3⇒异常|z_i| > 3 \Rightarrow \text{异常}

聚类检测法:谁不合群谁有嫌疑

海关的第二道手段是行为画像排查:不再只看单个货物是否偏离标准,而是观察“谁和谁结伴同行”。正常货物往往在产地、批次上形成聚集,如来自同一港口的货柜成群结队;而可疑货物总是孤零零地落在聚集区之外。DBSCAN 聚类正是这种思路:以每个点为中心画一个半径 ε 的圈,圈内样本数达到阈值就视为“核心点”,彼此连通的核心点形成簇,而那些既不靠近任何簇、也无法扩展的样本,就是噪声点——异常值。

孤立森林则换了一个角度:异常点数量少、特征怪异,天然容易被“随机切几刀”就单独切出来。它用随机超平面反复分割数据空间,异常点往往只需要很少的分割次数就能被孤立,因此“路径短”的点就是异常。相比统计法,聚类与隔离类方法不依赖正态分布假设,能识别月牙形、环形甚至任意形状的聚集结构,这是 X 光机做不到的。

行为画像排查补足了统计法的盲区,但无论是统计法还是聚类法,都只盯着“特征本身”,而忽略了数据身上贴着的那张“报关单”——标签。当标签本身是错的,下一道关卡就要登场了。

Neighborsε(p)={ q∈D∣dist(p,q)≤ε }\text{Neighbors}_{\varepsilon}(p) = \{\, q \in D \mid \text{dist}(p, q) \le \varepsilon \,\}
DBSCAN 的核心:一个样本 p 的 “ε 邻域” 内有多少邻居,决定了它是核心点、边界点还是噪声点。
  1. 设定半径 ε决定“多近算邻居”,如同海关定义“多近算同行批次”。
    ε=邻域半径\varepsilon = \text{邻域半径}
  2. 找邻域样本距离 p 不超过 ε 的所有样本点构成邻域集合。
    Neighborsε(p)={ q∈D∣dist(p,q)≤ε }\text{Neighbors}_{\varepsilon}(p) = \{\, q \in D \mid \text{dist}(p, q) \le \varepsilon \,\}
  3. 判断点角色邻域样本数 ≥ min_samples 为核心点;被核心点覆盖但自身不达标为边界点;两者皆非为噪声点。
    邻域数≥min_samples⇒核心点\text{邻域数} \ge \text{min\_samples} \Rightarrow \text{核心点}

标签噪声识别:核对报关单与实物

一个货柜明明装的是塑料颗粒,报关单却写着高纯度钯粉——在海关节奏里,这叫“单货不符”;在数据集里,这就是标签噪声:样本特征正确,但标注的类别是错的。标签噪声通常来自人工标注疲劳、众包平台低质标注、或爬虫数据自动打标的粗糙。它的破坏力比特征异常更隐蔽,因为特征分布完全正常,模型却会被错误标签“带偏”。

识别标签噪声的常用手段是交叉验证清洗:把训练数据切成 k 份,轮流用其中 k−1 份训练模型、预测剩下 1 份。若某个样本被多数模型反复预测错误,它的标签就高度可疑。更进一步,可以用模型输出的置信度做过滤:当模型对某样本预测的归属类别概率很低时,说明它处于类别边界或标签冲突区。最终,对这些可疑样本进行人工复核,或者直接修正标签,而不是盲目删除。

报关单核对能防住“粗心填错”,但还防不住一类高段位造假:货物表面严丝合缝、图像完全正常,却在毫厘之间暗藏恶意。那就是对抗样本。

y^i=arg⁡max⁡cP(y=c∣xi)\hat{y}_i = \mathop{\arg\max}_{c} P(y = c \mid x_i)
模型的“猜测标签”:取概率最大的类别。当模型长期猜不中某个样本的原始标签,这张“报关单”就值得怀疑。
  1. 模型预测对每个样本,模型输出它属于每个类别的概率。
    P(y=c∣xi)=第 c 类的预测概率P(y = c \mid x_i) = \text{第 } c \text{ 类的预测概率}
  2. 取最大项概率最大的类别作为模型预测标签。
    y^i=arg⁡max⁡cP(y=c∣xi)\hat{y}_i = \mathop{\arg\max}_{c} P(y = c \mid x_i)
  3. 对比真值预测标签与原始标签不一致,说明原标签可能被污染。
    y^i≠yi⇒疑似标签噪声\hat{y}_i \ne y_i \Rightarrow \text{疑似标签噪声}

对抗样本检测:破解精心伪装的违禁品

有经验的走私者不会扛着一箱明显违禁品过关,而是把违禁成分微缩进日用品内部,外观与正品毫无差异。对抗样本就是 AI 世界的“精致伪装”:攻击者在正常样本上叠加一层肉眼几乎看不见的微小扰动,让模型信心满满地分错。比如一张熊猫照片,加上一层细微噪声后,模型竟然高呼“长臂猿”。扰动幅度通常受范数约束,保证人眼无感,却精准打击模型的决策边界。

检测对抗样本的核心思路是“让伪装失效”。一种策略是输入预处理:对输入做压缩、降噪、平滑,破坏攻击者精心设计的扰动结构;另一种是模型鲁棒性防御:在训练时主动注入对抗样本做对抗训练,让模型对微小扰动天然免疫;还可以对输入样本进行二次校验,观察模型中间层特征是否异常,就像海关抽查时用化学试剂擦拭货柜表面,让隐藏物质现形。

对抗样本是来自外部的攻击,而数据投毒则是更阴险的“内部渗透”——它不修改任何现有货物,而是直接在供应链里安插一批表面清白、内藏后门的“新货”。

∥δ∥p≤ϵ,f(x+δ)≠y\| \delta \|_p \le \epsilon, \quad f(x + \delta) \ne y
对抗样本的数学刻画:扰动 δ 的幅度被控制在 ε 以内(人眼不可察),但足以让模型输出偏离真实标签。
  1. 扰动向量 δ叠加到原始样本上的微小变化,如给图片每个像素加一点偏移。
    δ=xadv−x\delta = x_{\text{adv}} - x
  2. 范数约束用 Lp 范数限制扰动总幅度,保证改动微小。
    ∥δ∥p=(∑i∣δi∣p)1/p≤ϵ\|\delta\|_p = \left(\sum_i |\delta_i|^p\right)^{1/p} \le \epsilon
  3. 攻击目标叠加扰动后的样本被模型分类到错误类别。
    f(x+δ)≠yf(x + \delta) \ne y

数据投毒防护:揪出内部安插的眼线

海关最怕的不是明面上的走私,而是有人长期往正常供应链里混入自己的“货”,表面合规,关键时刻集体发作。数据投毒正是如此:攻击者向训练数据中注入精心构造的恶意样本,让模型在正常任务上表现良好,却在特定触发器出现时输出攻击者想要的结果,这被称为后门攻击。比如给一批图片加上一个微小的水印,模型学到的却是“有水印→恶意分类”。

防投毒有几个抓手。净化防御:在训练前用异常检测与聚类方法筛出可疑样本,如同对入库货物进行成分抽检;鲁棒聚合:分布式训练中对各方上传的梯度做剪裁与加权,异常梯度直接降权,如同对每批货做来源资质审查;溯源审计:对每一份训练数据记录来源、版本、标注人,一旦发现污染,能迅速定位并回滚到干净版本,如同海关给每个货柜编号,出了问题能倒查整条供应链。

单点防御各有专长,但真实项目里数据来源杂、质量参差,需要像海关总署那样把多道关卡串成一条流水线,让数据从入关到放行有章可循。

投毒率=NpoisonNtotal\text{投毒率} = \frac{N_{\text{poison}}}{N_{\text{total}}}
数据污染程度的核心指标:被投毒样本数占总样本数的比例,它直接决定了清洗的优先级与模型受损的上限。
  1. 统计投毒样本数通过异常检测与人工抽检确认的恶意样本数量。
    Npoison=被污染的样本数N_{\text{poison}} = \text{被污染的样本数}
  2. 统计总样本数训练集中全量样本数量。
    Ntotal=总样本数N_{\text{total}} = \text{总样本数}
  3. 计算比例投毒率越高,模型被劫持的风险越大,超过红线必须全量清洗。
    投毒率=NpoisonNtotal\text{投毒率} = \frac{N_{\text{poison}}}{N_{\text{total}}}

清洗流水线:标准化多关卡安检流程

海关不会只靠一台设备打天下,而是把 X 光、地磅、行为画像、单货核对、抽检化验串成一条标准流水线。数据清洗同样需要Pipeline 化:先做格式规范与去重,再依次执行统计检测、聚类检测,接着核对标签噪声、排查投毒样本,最后对通过全部关卡的数据放行,进入训练集。每一步的输出都记录在案,方便追溯。

流水线必须设质量红线:比如污染率超过 5% 的数据批次不得直接入库,标签一致率低于 95% 必须重新标注,置信度低于阈值的样本必须人工复核。同时要有监控告警:每次数据入库自动计算各项质量指标,指标恶化时触发告警,让问题在进入模型之前就被拦截。自动化是这个流水线的灵魂——通过脚本和调度系统,让清洗、质检、打报告一气呵成,而不是靠工程师手工跑 notebook。

流水线建好了,管理者还需要一份“检验报告”来量化战果:到底拦下了多少污染、清洗后数据变得多干净、模型收益有多大。这就是量化与实战的功课。

数据质量分=w1×完整率+w2×一致率+w3×清洁率\text{数据质量分} = w_1 \times \text{完整率} + w_2 \times \text{一致率} + w_3 \times \text{清洁率}
用加权打分把多条红线合成一个数字,分数低于阈值即触发人工介入,好比海关给每一批货打综合风险分。
  1. 定义三个维度完整率(缺字段比例)、一致率(标签与特征吻合度)、清洁率(无异常样本比例)。
    0≤完整率,一致率,清洁率≤10 \le \text{完整率}, \text{一致率}, \text{清洁率} \le 1
  2. 分配权重按业务重要性给各维度加权,权重之和为 1。
    w1+w2+w3=1w_1 + w_2 + w_3 = 1
  3. 加权求和综合得分低于阈值,则批次进入待清洗队列。
    质量分=w1×完整率+w2×一致率+w3×清洁率\text{质量分} = w_1 \times \text{完整率} + w_2 \times \text{一致率} + w_3 \times \text{清洁率}

量化与实战:用指标守住数据国门

光有流程还不够,海关总署需要 KPI 来评估各口岸的工作成效。数据质检同样需要量化指标。最直接的是污染率:数据集里异常与污染样本的占比,它决定了一个批次是否需要返工;而评估“检测得准不准”,要用精确率、召回率与 F1——精确率看“抓到的异常里真异常占多少”,召回率看“真异常里被抓住的占多少”,F1 则是两者的调和平均,避免为了抓得多而误伤好数据。

工程落地时可以借助成熟工具链:Python 的 scikit-learn 提供 DBSCAN、孤立森林等开箱即用的检测器;Great Expectations 可以定义数据断言与质量红线;Apache Airflow 则负责把清洗任务编排成定时流水线。一个典型的实战案例是:某推荐系统团队发现 CTR 模型线上效果骤降,通过污染率监控发现训练数据中混入了 8% 的爬虫点击样本,启动流水线清洗后模型 AUC 回升 6 个百分点——这就是量化的力量,让每一次质量问题都有数字可依、有流程可解。

至此,从异常值识别到污染量化,一套完整的“数据海关”体系已经成型。记住:数据质量不是一次性的清理活动,而是像海关一样 7×24 小时运转的长期防线。

F1=2×Precision×RecallPrecision+RecallF1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}
F1 是精确率与召回率的调和平均:两边都高 F1 才高,逼着检测器既不能乱抓,也不能漏抓。
  1. 精确率被判为异常的样本中有多少是真正的异常,防止“宁可错杀一千”。
    Precision=TPTP+FP\text{Precision} = \frac{TP}{TP + FP}
  2. 召回率真正的异常中有多少被成功识别,防止漏网之鱼。
    Recall=TPTP+FN\text{Recall} = \frac{TP}{TP + FN}
  3. 调和平均两者综合成一个分数,F1 越高检测器越均衡。
    F1=2×Precision×RecallPrecision+RecallF1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}

AI 应用场景

金融风控:信用卡交易流水欺诈检测

阶段:数据预处理与质量检测

解决的问题:传统风控靠人工规则筛查欺诈交易,面对每天数百万笔交易,耗时且漏判率高;异常检测方法能够自动扫描交易特征,识别出与正常消费模式显著偏离的可疑交易。

具体案例:某银行对信用卡交易数据做质检,先用 Z-score 检测单笔金额异常的极值交易,再用 DBSCAN 聚类发现“短时间内同商户高频交易”的集合异常,最后对命中样本做人工复核。上线后欺诈拦截率提升 35%,误报率下降 20%。

自动驾驶:传感器标定数据污染过滤

阶段:数据清洗与模型鲁棒性验证

解决的问题:自动驾驶训练数据来自激光雷达、摄像头等多源传感器,极易混入标定错误、遮挡碎片等污染数据,直接训练会导致模型在真实道路上误判;系统化的清洗 Pipeline 可在数据入库前自动拦截问题样本。

具体案例:某自动驾驶团队为 LiDAR 点云数据搭建清洗流水线,用孤立森林检测空间分布异常的离群点簇,用标签一致性校验筛出被错误标注的车辆框,再配合质量红线监控,成功将模型在雨雾天气下的检测准确率从 82% 提升至 91%。

大模型训练语料:标签翻转与投毒语料排查

阶段:数据安全防护

解决的问题:大模型训练语料通常从互联网海量爬取,可能混入恶意投毒文本(如诱导模型输出有害内容的后门样本),且人工逐条审核不现实;自动化污染检测可以在语料入库前定位并隔离可疑样本。

具体案例:某 LLM 团队对 200GB 开源语料做投毒筛查,通过 n-gram 异常检测与聚类分析,发现一批“看似正常问答、实含触发词后门”的投毒文本,及时清除后有效避免了模型在特定话题上被劫持。

Python 演示

python72 行
import numpy as npfrom sklearn.cluster import DBSCAN  class DataCleaner:    """数据清洗与污染检测流水线,相当于海关多关卡检查。""     def __init__(self, data, labels=None):        self._data = np.array(data, dtype=float)        self._labels = np.array(labels) if labels is not None else None        self._outlier_mask = np.zeros(len(self._data), dtype=bool)        self._method_masks = {}     def detect_outliers_zscore(self, threshold=3.0):        mu = np.mean(self._data, axis=0)        sigma = np.std(self._data, axis=0)        sigma[sigma == 0] = 1e-9        z = np.abs((self._data - mu) / sigma)        mask = np.any(z > threshold, axis=1)        self._outlier_mask = self._outlier_mask | mask        self._method_masks['zscore'] = mask.astype(int)     def detect_outliers_iqr(self, k=1.5):        q1 = np.percentile(self._data, 25, axis=0)        q3 = np.percentile(self._data, 75, axis=0)        iqr = q3 - q1        lower = q1 - k * iqr        upper = q3 + k * iqr        mask = np.any((self._data < lower) | (self._data > upper), axis=1)        self._outlier_mask = self._outlier_mask | mask        self._method_masks['iqr'] = mask.astype(int)     def detect_outliers_dbscan(self, eps=0.5, min_samples=5):        labels = DBSCAN(eps=eps, min_samples=min_samples).fit_predict(self._data)        mask = labels == -1        self._outlier_mask = self._outlier_mask | mask        self._method_masks['dbscan'] = mask.astype(int)     def compute_pollution_rate(self):        return float(np.sum(self._outlier_mask)) / len(self._data)     def clean(self):        kept = self._data[~self._outlier_mask]        kept_labels = self._labels[~self._outlier_mask] if self._labels is not None else None        return kept, kept_labels     def report(self):        return {            'total': len(self._data),            'outliers': int(np.sum(self._outlier_mask)),            'pollution_rate': round(self.compute_pollution_rate(), 4),            'by_method': {k: int(v.sum()) for k, v in self._method_masks.items()},        }  def build_mixture_data():    rng = np.random.default_rng(42)    normal = rng.normal(0, 1, (500, 2))    outliers = rng.uniform(-6, 6, (40, 2))    return np.vstack([normal, outliers])  if __name__ == '__main__':    data = build_mixture_data()    cleaner = DataCleaner(data)    cleaner.detect_outliers_zscore(threshold=3.0)    cleaner.detect_outliers_iqr(k=1.5)    cleaner.detect_outliers_dbscan(eps=0.8, min_samples=5)    print("清洗报告:", cleaner.report())    print("污染率: %.1f%%" % (cleaner.compute_pollution_rate() * 100))    kept, _ = cleaner.clean()    print("清洗后剩余样本数:", len(kept))
目的:实现一个多关卡数据清洗流水线,依次用 Z-score、IQR、DBSCAN 识别异常与污染样本,输出污染率和清洗报告,模拟“海关安检”全过程。
  1. self._outlier_mask = np.zeros(len(self._data), dtype=bool)初始化解一个“黑名单”数组,所有样本默认放行。
  2. mask = np.any(z > threshold, axis=1)只要任意一个特征维度上 Z-score 超限,该样本即被标记为异常。
  3. self._outlier_mask = self._outlier_mask | mask各关卡结果取并集,任一关卡命中都进入黑名单。
  4. labels = DBSCAN(eps=eps, min_samples=min_samples).fit_predict(self._data)聚类后标签为 -1 的样本即噪声点。
  5. return float(np.sum(self._outlier_mask)) / len(self._data)计算污染率:黑名单人数除以总人数。
  6. kept = self._data[~self._outlier_mask]用布尔索引取反,一键放行所有干净样本。

常见误区

误区我拿到数据后只要发现异常值,一律删掉,这样模型肯定更干净更准。

正解异常值可能是测量噪声,也可能是真实且宝贵的信号。信用卡欺诈、设备故障、罕见病发作,这些恰恰是业务最关心的“稀有事件”。盲目删除会把关键信息一起丢掉,如同海关不能因为某个货柜尺寸特殊就一律销毁——它可能装着急需的医疗设备。正确做法是:先标记、再分析、结合业务判断,是噪声才清洗,是信号要保留。

为何常见:因为大多数教程都在教“如何检测并删除离群点”,让人误以为异常值天然就是坏数据。

误区我给所有特征都算一遍 Z-score,超过 3 就是异常,简单粗暴又通用。

正解Z-score 隐含的假设是数据近似服从正态分布。当数据严重偏态(如收入分布、用户点击时长),或呈多峰形态时,均值和标准差本身就被扭曲,算出的 Z-score 并不可靠。比如用户在线时长呈现“大量短会话 + 少量超长会话”的双峰分布,用 Z-score 可能把正常的长会话误判成异常。此时应改用 IQR 或基于分位数的方法,它们对分布形状更稳健。

为何常见:因为 Z-score 公式简单、直觉清晰,初学者容易忽略它的分布假设前提。

误区我就用默认参数跑 DBSCAN,反正聚类方法应该比统计法“智能”。

正解DBSCAN 对 ε 非常敏感:ε 太小会把一个簇拆成无数碎片,ε 太大又会把多个簇和噪声黏成一团,就像海关把“相邻批次”的判定标准定得太宽,什么货物都算同行。min_samples 则决定“抱团多紧密才算正常”。调参时可借助 k 距离图:把每个点到第 k 近邻居的距离排序,在曲线拐弯处选 ε,才有依据。

为何常见:因为 sklearn 里 DBSCAN 可以直接 fit 出结果,参数解释不到位时容易让人忽略其敏感性。

误区我做数据质检只看特征有没有离群点,标签是标注人员给的,应该没问题。

正解标签噪声的危害不亚于特征异常。特征完全正常的样本,如果标签标错,模型会学到一组“特征到错误标签”的映射,相当于海关只检查了货物重量,却没核对报关单上的品名。标签噪声需要用交叉验证、置信度过滤、人工抽检等手段单独检测,并且要对可疑样本做修正而非简单删除。

为何常见:因为异常检测的经典教程都聚焦“特征空间的离群点”,标签质量问题容易被习惯性忽略。

误区对抗样本不就是加了点噪声吗?我把图片模糊一下、压缩一下,不就能洗掉了?

正解对抗样本的扰动是攻击者针对模型弱点精心优化的,具有极强的方向性和隐蔽性。普通去噪可能把扰动和真实细节一起抹掉,反而降低模型精度;更糟的是,强对抗扰动经过压缩后仍然有效。正确姿势是主动防御:对抗训练、输入随机化、模型集成、中间层特征校验,而不是简单粗暴的图像平滑。这就像海关对付专业走私者,不能只靠加大 X 光剂量,还得训练嗅探犬、建立情报网络。

为何常见:因为对抗样本在视觉上确实表现为“微小噪声”,人们容易按处理噪声的思维去应对,低估了它的针对性。

面试题

Q1. Z-score 异常检测隐含的数据分布假设是什么?

单选题 · easy

  • A.数据服从均匀分布
  • B.数据近似服从正态分布← 正确答案
  • C.数据服从泊松分布
  • D.数据无任何分布假设

答案:B。Z-score 用均值和标准差衡量偏离程度,这隐含了数据近似正态的假设。均匀分布、泊松分布下均值与标准差的意义会被扭曲。选项 D 是聚类法(如 DBSCAN)的优势,不是 Z-score 的前提。

Q2. 使用 IQR 箱线图法检测异常值时,通常把上界设为多少?

单选题 · easy

  • A.Q3 + 1.5×IQR← 正确答案
  • B.Q3 + 2×IQR
  • C.Q3 + 3×IQR
  • D.Q3 + 0.5×IQR

答案:A。箱线图法约定 Q1−1.5×IQR 到 Q3+1.5×IQR 为正常区间,超出即异常。2 倍、3 倍是更宽松或更严格的其他标准,0.5 倍则过于敏感,都不属于经典 1.5 倍规则。

Q3. DBSCAN 中标签为 -1 的样本代表什么?

单选题 · mid

  • A.核心点
  • B.边界点
  • C.噪声点← 正确答案
  • D.已聚类的正常点

答案:C。DBSCAN 对每个聚类簇分配非负整数标签,标签 -1 表示该点既不是核心点也不属于任何簇的密度可达范围,即噪声点。核心点和边界点都会被分配到某个簇的标签,因此选项 A、B、D 均不对。

Q4. 以下哪些方法可用于识别标签噪声?

多选题 · mid

  • A.K 折交叉验证预测比对← 正确答案
  • B.模型输出置信度过滤← 正确答案
  • C.对特征做 Z-score 检测
  • D.人工抽检可疑样本← 正确答案

答案:ABD。交叉验证可以暴露被反复预测错误的样本,置信度过滤能发现处于类别边界的样本,人工抽检是最终兜底手段。而 Z-score 检查的是特征数值的离群,不涉及标签正确性,无法识别“特征正常但标签错误”的噪声。

Q5. 对抗样本与普通噪声的本质区别是什么?

单选题 · mid

  • A.对抗样本幅值更大
  • B.对抗样本是针对性优化的恶意扰动← 正确答案
  • C.普通噪声更容易被人类察觉
  • D.对抗样本只出现在图像领域

答案:B。对抗样本是攻击者基于模型梯度等信息刻意优化的扰动,目标是让模型误判,且通常幅值很小、人眼无感。普通噪声是随机的,没有攻击意图。选项 A、C 与事实相反,选项 D 错误——对抗样本也出现在文本、语音等领域。

Q6. 3σ 原则下,某样本的 Z-score 达到多少会被判为异常?

单选题 · easy

  • A.大于 1
  • B.大于 1.5
  • C.大于 2
  • D.大于 3← 正确答案

答案:D。3σ 原则规定偏离均值超过 3 个标准差的样本判为异常。1、1.5、2 作为阈值对应更宽松的置信区间,会误伤大量正常样本,不是该原则的定义。

Q7. 数据投毒攻击的典型特征是?

单选题 · mid

  • A.修改模型权重参数
  • B.在训练数据中注入带后门的恶意样本← 正确答案
  • C.在测试阶段篡改模型输入
  • D.增大训练数据的噪声水平

答案:B。数据投毒是在训练阶段向数据集中注入恶意样本,模型在正常任务上表现不变,但遇到特定触发器时输出攻击者预设的结果。选项 A 是直接的权重攻击,选项 C 更像对抗攻击,选项 D 无明确攻击目标,均不符合投毒定义。

Q8. 构建多维度数据清洗 Pipeline 时,合理的做法包括哪些?

多选题 · hard

  • A.先做格式规范与去重,再做异常检测← 正确答案
  • B.只保留通过全部检测关卡的数据
  • C.对清洗后的数据计算质量分并设定红线← 正确答案
  • D.将清洗结果记录并追溯来源← 正确答案

答案:ACD。规范的 Pipeline 应先做基础清洗,再叠加异常检测;质量分和红线用于判断批次是否达标;记录与溯源支持问题定位和回滚。选项 B 过于极端——部分样本可能是“信号型异常”,需要结合业务决定保留而非一律丢弃。

Q9. 以下哪些场景更适合用 DBSCAN 而非 Z-score?

多选题 · hard

  • A.数据呈月牙形弯曲分布← 正确答案
  • B.数据近似正态分布
  • C.数据形成多个环状簇← 正确答案
  • D.需要不依赖分布形状的检测← 正确答案

答案:ACD。DBSCAN 基于密度聚类,能识别月牙、环形、任意形状的簇,且不要求正态分布。Z-score 适合近似正态、单峰分布的数据。选项 B 恰是 Z-score 的主场,所以不选。

Q10. 某数据集共 20000 条样本,检测出 800 条污染数据,污染率是多少?

单选题 · mid

  • A.2%
  • B.4%← 正确答案
  • C.8%
  • D.10%

答案:B。污染率 = 污染样本数 ÷ 总样本数 = 800 ÷ 20000 = 0.04,即 4%。2% 是按 400 条算的,8% 和 10% 分别是按 1600 条和 2000 条算的,均为混淆分母或分子的错误结果。