在河边有一座水质监测站,橙色的浮标随着河水轻轻起伏。监测员老李的工作是每天定时取水样,观察水质是否异常。他发现河水永远不会一成不变——上游春季融雪、夏季暴雨、秋日工厂排污,都会让水质在某个瞬间发生改变。如果反应太慢,污染早已顺着支流扩散到整个城区;如果反应太快,偶来的漂浮物又会让他虚惊一场。 AI 模型和这条河很像。模型上线后,真实世界的数据就像不断流动的河水——用户习惯在变、市场环境在变、天气季节在变。当这些变化积累到一定程度,模型基于旧数据学到的“世界观”过时了,预测开始走偏。这个现象叫作概念漂移。要守护模型的健康,就需要一套自动“水质监测”系统,在不断涌入的数据流中及时发现分布变化。 本文要讲的 ADWIN 和 DDM,就是两套经典的“水质监测方案”。DDM 像一个经验丰富的老监测员,紧盯错误率指标;ADWIN 则像一个带着“记忆长卷”的新监测员,不断调整回顾历史的窗口长度。学会它们,你就能为 AI 系统装上一座自动预警的“水质监测站”。

岗位关联

对 AI 从业者:漂移检测是模型监控与持续学习体系的基石能力。掌握它,你就能在模型上线后第一时间发现数据分布变化,及时触发告警与重训练,显著提升系统的鲁棒性与交付质量。

目录
  1. 可视化演示
  2. 漂移概念识别
  3. DDM检测原理
  4. ADWIN窗口机制
  5. 参数调优策略
  6. 误报漏报控制
  7. 实战监控系统
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示漂移检测算法ADWIN与DD的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。

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

漂移检测算法ADWIN与DD:ADWI ADWIN自适应窗口算法原理 DDM错误率监控算法原理 核心机制可视化 漂移检测算法ADWIN与DD整体架构与关键组件

漂移概念识别

老李当监测员的第一课,是弄清楚“什么才算异常”。河水的成分天然有波动——雨天浑浊、晴天清澈,这是正常的。但如果连续一周 pH 值持续下降、河面漂起死鱼,那就是真问题。AI 世界的“水质异常”就是概念漂移:真实数据分布随时间发生变化,导致模型训练时学到的输入输出映射关系不再成立。

具体来说,数据包含特征 X 和标签 y。当特征本身的分布 \(P(X)\) 发生改变,称为数据漂移(协变量漂移),好比河水变浑浊了但成分没变;当 X 与 y 之间的映射关系 \(P(y|X)\) 发生改变,则称为真正的概念漂移,好比同样的酸碱度读数对应的是“污染”而非“正常”。实际生产中两者常常同时发生。

检测漂移的意义在于:模型是静态的,世界是动态的。没有漂移检测,模型就像一个失明的监测员,直到业务方发现预测结果离谱才追悔莫及。检测到漂移后的触发动作通常有四种:发出告警让人工介入、自动触发模型重训练、切换到备用模型或执行回滚。应用场景涵盖推荐系统(用户兴趣漂移)、信贷风控(欺诈模式变化)、工业预测性维护(设备老化规律变化)等。

回到比喻中,老李意识到:“我们不能只守在监测站里喝茶,得盯紧河水的一举一动。”这正是漂移检测的初心——不等模型彻底失灵,提前发现变数。

DDM检测原理

老李有张随身携带的“酸碱试纸”。他不测量河里所有成分,只看一个简单而可靠的指标——pH 值。他记录每天的读数:如果这一周的平均值比历史最好水平高出一大截,就果断拉响警报。DDM(Drift Detection Method)的思路如出一辙。

DDM 由 Gama 等人于 2004 年提出,它的输入是模型每个样本的预测对错信号(0 或 1),输出是警告或漂移告警。核心假设是:当数据分布稳定时,模型的错误率服从二项分布,恰如反复抛一枚固定偏好的硬币,正面次数会围绕某个期望值波动。第 \(i\) 个样本时,累计错误率 \(p_i\) 的波动幅度由标准差描述:

DDM 维护两个记忆:历史最优错误率 \(p_{min}\) 和它对应的标准差 \(\sigma_{min}\)。当当前错误率偏离历史最优水平超过 \(2\sigma_{min}\) 时进入警告状态;超过 \(3\sigma_{min}\) 时判定发生漂移并重置统计量:

DDM 最大的优势是内存效率:它只需要记录 \(p_i\)、\(\sigma_i\)、\(p_{min}\)、\(\sigma_{min}\) 四个数字,时间复杂度 O(1),非常适合资源受限的在线场景。但它的局限也很明显——就像试纸只能测酸碱性一样,DDM 必须依赖可观测的 0/1 错误信号。如果你的业务里得不到实时标签,它便英雄无用武之地。

pi∼B(i,p),σi=pi(1−pi)i\displaystyle p_i \sim \mathcal{B}(i, p), \quad \sigma_i = \sqrt{\frac{p_i(1-p_i)}{i}}
pi+pi(1−pi)i≥pmin+3σmin\displaystyle p_i + \sqrt{\frac{p_i(1-p_i)}{i}} \geq p_{min} + 3\sigma_{min}
这个公式的含义是:如果当前观测到的错误率加上其波动范围,已经比模型最健康时的最好水平高出 3 倍标准差,那么基本可以断定模型不再健康。
  1. \(p_i\)(当前错误率)第 \(i\) 个样本时,累计错误样本数除以总样本数。它反映模型近期“犯错”的比例,是 DDM 唯一关心的信号。
    pi=1i∑t=1iI[y^t≠yt]\displaystyle p_i = \frac{1}{i}\sum_{t=1}^{i} \mathbb{I}[ \hat{y}_t \neq y_t ]
  2. \(\sigma_i\)(当前标准差)二项分布的标准差公式。错误率是对真实错误概率的估计,标准差衡量这个估计的不确定性——样本越多,估计越可靠,标准差越小。
    σi=pi(1−pi)i\displaystyle \sigma_i = \sqrt{\frac{p_i(1-p_i)}{i}}
  3. \(p_{min}\)(历史最优错误率)自检测以来,\(p_i + \sigma_i\) 曾经达到的最小值。它代表模型在“健康状态”下的最佳表现,是判断漂移的基准线。
  4. \(\sigma_{min}\)(最优状态标准差)与 \(p_{min}\) 同时记录的标准差,代表基准线附近的正常波动幅度。
  5. 漂移判定当 \(p_i + \sigma_i\) 超过 \(p_{min} + 3\sigma_{min}\) 时,触发漂移告警。根据正态分布的 68-95-99.7 法则,正常波动几乎不可能越过 3 倍标准差,跨过即说明模型真的坏了。

ADWIN窗口机制

新来的监测员小张有更现代化的方法。他不只看酸碱度,而是把一段时间内河水各项指标都记录在“记忆长卷”上,然后不断对比“最近这段”与“之前那段”的平均值。更妙的是,他的记忆长度是动态的:丰水期水稳,记忆拉长以获取更精确的统计;洪水期水变,记忆缩短,快速忘掉过时的历史。

ADWIN(Adaptive Windowing,自适应窗口)正是这样一套算法。它由 Bifet 等人提出,维护一个滑动窗口 \(W\),每当新数据到达,就尝试在窗口内找一个切分点,把窗口分成左右两半 \(W_0\) 和 \(W_1\)。如果两半的均值之差超过一个与窗口大小相关的阈值,就判定发生了漂移,随后丢弃窗口的旧半段,只保留新半段继续观察。

核心判定公式源自 Hoeffding 不等式——它回答的问题是:“两个样本均值差多大,才能说明它们背后的分布真的不同,而非随机波动?”

ADWIN 的核心优势在于它不依赖错误信号——你可以直接监控任意数值特征:用户点击率、模型预测分数、传感器值、特征均值等。窗口长度自适应调节:稳定期窗口自动增长以获得统计精度,漂移期窗口快速收缩以迅速定位新状态。存储上用一个“桶压缩”技巧,把数据按指数增长的桶组织起来,让内存开销保持在 \(O(\log n)\) 级别。

小张收起了他的记忆长卷,得意地说:“我不但要盯酸碱度,还要记住整条河的故事,才能判断它是真变了,还是只是打了个喷嚏。”

∣μ^0−μ^1∣>12nln⁡4nδ\displaystyle |\hat{\mu}_0 - \hat{\mu}_1| > \sqrt{\frac{1}{2n} \ln\frac{4n}{\delta}}
阈值 \(\epsilon_{cut}\) 随窗口总样本数 \(n\) 和置信参数 \(\delta\) 变化。样本越多,阈值越小,检测越灵敏;\(\delta\) 越小,阈值越大,判定越保守。
  1. \(\hat{\mu}_0\)(旧半段均值)窗口切割后左半段数据的平均值,代表“过去的记忆”。
    μ^0=1∣W0∣∑x∈W0x\displaystyle \hat{\mu}_0 = \frac{1}{|W_0|}\sum_{x \in W_0} x
  2. \(\hat{\mu}_1\)(新半段均值)窗口右半段数据的平均值,代表“现在的状态”。
  3. \(|\hat{\mu}_0 - \hat{\mu}_1|\)(均值差异绝对值)两个时期统计量的差异,差异越大,说明分布变化越明显。
  4. \(n\)(窗口总样本数)\(W_0\) 与 \(W_1\) 的样本量之和。\(n\) 越大,统计置信度越高,允许检测到更细微的漂移。
  5. \(\delta\)(显著性参数)误报率上界的置信参数。它控制检测的“保守程度”,取值越小越不容易误报,但灵敏度也越低。
  6. \(\epsilon_{cut}\)(显著性阈值)由 Hoeffding 界推导出的临界值。当均值差超过它时,可以高置信度地判定发生了真实漂移,而非抽样波动。

参数调优策略

老李和小张都有自己的“灵敏度旋钮”。老李调试纸的判定线:2σ 预警还是 2.5σ 预警?小张调记忆长卷的长度约束:置信度 δ 设多大,窗口收缩得多激进?调参的本质,是在灵敏度与稳定性之间找平衡。

DDM 的关键参数有三个。警告阈值系数 \(w\) 默认 2.0,当 \(p_i + \sigma_i \geq p_{min} + w \cdot \sigma_{min}\) 时进入警告状态,表示模型开始“可疑”,但不立即动作,而是记录可疑样本数,为后续确认留证据。漂移阈值系数 \(d\) 默认 3.0,越过即判定漂移并重置。最小样本数 \(min\_instances\) 默认 30,在样本量不足时统计量不可靠,先沉默观察。

ADWIN 的参数更少,核心是 \(\delta\)(置信度参数),默认 0.05。\(\delta\) 出现在阈值 \(\epsilon_{cut} = \sqrt{\frac{1}{2n}\ln\frac{4n}{\delta}}\) 的分母上,\(\delta\) 越小,\(\epsilon_{cut}\) 越大,触发漂移所需的均值差就越大——更保守、更少误报,但检测延迟变长。此外,ADWIN 的桶压缩粒度也影响内存与精度的取舍:桶粒度越细,检测越准,但内存开销越大。

数据采样与周期设计同样重要。输入检测器之前,建议先做标准化或归一化,避免量纲差异干扰窗口均值比较。对间隔不均匀的数据流,可按固定时间窗口重采样后再喂给算法。检测周期上,在线场景一般是每个样本实时更新;批量场景则每小时或每天跑一次批检测——周期太短噪声大,太长延迟高。

回到监测站,老李说:“试纸的灵敏度不能乱调。调太灵敏,一条鱼翻肚皮就报警;调太迟钝,污染都到你家水龙头了才发现。”调参的艺术,就是对业务可接受的误报代价与漏报代价做一次诚实的权衡。

误报漏报控制

误报就是“狼来了”——模型其实没坏,但正常波动触发了警报,运维人员反复处理虚假告警后逐渐麻木,真正出问题时反而无人理会。漏报则是“洪水已到眼前”——漂移已经发生,检测器却毫无反应,业务损失持续扩大。两者是漂移检测中最令人头疼的一对矛盾。

误报的根源通常有三个:一是样本量不足,统计量方差偏大,错误率或均值容易碰到阈值线;二是阈值设得过紧,比如把 w 从 2.0 调到 1.5,一点风吹草动就报警;三是数据本身含周期性噪声,比如电商每周的“周末效应”,被窗口比较误判为趋势变化。

漏报则常发生在两种场景:一是渐变式漂移(slow drift),错误率缓慢爬升,长时间贴着阈值线但始终没有跨过去;二是窗口过大,漂移信号被大量历史数据稀释,均值差始终不显著。

控制策略方面,最有效的是双通道确认机制:当检测器进入警告状态后,不立即告警,而是连续观察后续 n 个样本,若警告状态持续或升级为漂移,才真正发出告警。这相当于“一个人说看见污染不算数,要两个人确认才算数”。其次可设置冷却时间:告警一次后,短时间内不重复告警,避免告警风暴。最后,结合趋势辅助判断——不仅看是否越过阈值,还看错误率的变化速率,速率为正且持续上升,比瞬时越线更有说服力。

老李在值班日志上写道:“好的监测员,既不能风声鹤唳,也不能麻木不仁。每一次拉响警报,都要对得起河水的真相。”

实战监控系统

单靠一个人守一个监测站是不够的。真正可靠的是一个监测网:上游、中游、下游多个站点联动,信息互通。实战中的漂移检测系统也是类似的网状结构。

一套完整的漂移监控系统通常分五层。数据接入层对接实时管道(Kafka、Flink)或离线批任务,负责把数据流送进监控系统。特征监控层对每个关键特征和模型预测分数计算滚动统计量——均值、分位数、类别分布直方图等。检测算法层运行 DDM、ADWIN 等插件式检测器,每个检测器独立输出状态。告警降噪层聚合多条告警、执行冷却与升级路线,把“噪声”压缩成“信号”。自动化动作层根据告警级别触发模型重训练、灰度切换或回滚。

集成检测流程并不复杂:收到每个样本 → 更新特征统计量 → 把错误信号喂给 DDM、把特征数值喂给 ADWIN → 根据状态执行动作。比如 DDM 进入警告态时记录可疑样本数,升级为漂移态时自动创建重训练任务;ADWIN 检测到窗口收缩时,在监控面板上高亮漂移区间并附上前后窗口的统计对比图。

告警降噪的实践中,常用三条经验规则:一是合并重复告警,一小时内同类型告警合并为一条;二是告警附证据,每条告警附带漂移前后均值差、窗口变化的可视化摘要,让人工确认有据可依;三是分级升级,初次告警仅是“提醒”,持续一段时间后升级为“紧急”,再升级为“自动干预”。

效果评估方面,用三个指标衡量检测器:检测延迟(漂移发生到被检测到之间的样本数,越小越好)、误报率(未漂移时触发告警的比例)、漏报率(漂移发生后未触发告警的比例)。没有免费的午餐——想在延迟上更快,往往要接受更高的误报率;想压低误报,则要承受更长的延迟。取舍之间,取决于业务愿意为哪种风险买单。

老李和小张把各自的监测站连成了一张网。老李负责盯错误率,小张负责盯特征细节,两人互相印证、互相补充。从此,这条河有了真正意义上的“健康守护网”。

AI 应用场景

推荐系统的用户兴趣漂移监控

阶段:模型上线后的在线监控与更新(MLOps)

解决的问题:用户兴趣随时间变化,推荐模型的点击率持续下降。传统做法是等周报出来才发现问题,修复滞后至少数天;用 ADWIN 实时监控点击率特征的滚动均值后,漂移几分钟内即可被发现。

具体案例:某电商平台的推荐系统用 ADWIN 监控“商品类目点击率”的特征均值。当某个类目的点击率数据出现均值漂移时,系统自动触发该类目召回模型的重训练任务,并在监控面板上展示漂移前后的统计对比,供算法工程师确认。

信贷风控模型的概念漂移检测

阶段:模型监控与风险预警

解决的问题:经济周期变化使借款人的违约模式发生改变,风控模型的错误率上升。DDM 通过监控拒绝率与真实违约率的偏差,在模型失效前发出告警。

具体案例:某银行在信贷审批模型的预测错误信号上运行 DDM,设置 2σ 警告、3σ 漂移。当错误率连续多日越过警告线后触发漂移告警,风控团队随即审查特征重要性分布,决定是否冻结模型并启动重新训练。

物联网设备的故障预测

阶段:流式数据监控与预测性维护

解决的问题:设备传感器数据随运行环境和磨损程度缓慢漂移,导致故障预测模型失灵。ADWIN 直接监控传感器温度、振动频率等数值特征,发现漂移后提前提示设备进入新的磨损阶段。

具体案例:某工厂的预测性维护系统用 ADWIN 监控主轴电机温度特征。当窗口收缩并检测到温度均值漂移时,系统自动提高检测频率,并向维护人员发送“设备状态改变”提示,避免突发停机。

Python 演示

python101 行
"""ADWIN 与 DDM 漂移检测实战演示"""import mathimport random  class DDMMonitor:    """DDM 漂移检测器:监控预测错误率是否显著上升"""    def __init__(self, warn_ratio=2.0, drift_ratio=3.0, min_instances=30):        self.warn_ratio = warn_ratio        self.drift_ratio = drift_ratio        self.min_instances = min_instances        self.num_errors = 0        self.num_instances = 0        self.p_min = float('inf')        self.std_min = float('inf')        self.in_warning = False     def update(self, predict_error):        """输入 1 表示预测错误,0 表示正确"""        self.num_instances += 1        if predict_error:            self.num_errors += 1        if self.num_instances < self.min_instances:            return "normal"        p = self.num_errors / self.num_instances        std = math.sqrt(p * (1 - p) / self.num_instances)        if p + std <= self.p_min + self.std_min:            self.p_min = p            self.std_min = std            self.in_warning = False            return "normal"        if p + std >= self.p_min + self.drift_ratio * self.std_min:            self.in_warning = False            self.reset()            return "drift"        if p + std >= self.p_min + self.warn_ratio * self.std_min:            self.in_warning = True            return "warning"        return "normal"     def reset(self):        self.num_errors = 0        self.num_instances = 0        self.p_min = float('inf')        self.std_min = float('inf')        self.in_warning = False  class ADWINMonitor:    """ADWIN 漂移检测器:用自适应窗口检测均值变化"""    def __init__(self, delta=0.05):        self.window = []        self.delta = delta     def update(self, value):        self.window.append(value)        return self._detect_drift()     def _detect_drift(self):        n = len(self.window)        if n < 10:            return "normal"        for split in range(n // 2, n):            left = self.window[:split]            right = self.window[split:]            mean_left = sum(left) / len(left)            mean_right = sum(right) / len(right)            m = len(left)            n2 = len(right)            total = m + n2            eps = math.sqrt((1 / (2 * total)) * math.log(4 * total / self.delta))            if abs(mean_left - mean_right) > eps:                self.window = right                return "drift"        return "normal"  def simulate():    """模拟数据流:前 80 步稳定,后 50 步漂移"""    random.seed(42)    stream = []    for i in range(130):        if i < 80:            stream.append(random.gauss(5.0, 0.5))        else:            stream.append(random.gauss(8.0, 0.5))     ddm = DDMMonitor()    adwin = ADWINMonitor()     print("时间  DDM状态   ADWIN状态")    for i, v in enumerate(stream):        err = 1 if abs(v - 6.5) > 2 else 0        ddm_state = ddm.update(err)        adwin_state = adwin.update(v)        if i % 10 == 0 or ddm_state == "drift" or adwin_state == "drift":            print(f"{i:3d}  {ddm_state:7s}   {adwin_state}")  if __name__ == "__main__":    simulate()
目的:用 Python 实现 DDM 与 ADWIN 两个漂移检测器,并在模拟的“前稳定后漂移”数据流上进行比较。
  1. class DDMMonitor:定义 DDM 检测器,内部维护累计错误数等统计量。
  2. std = math.sqrt(p * (1 - p) / self.num_instances)用二项分布标准差衡量错误率波动范围。
  3. if p + std >= self.p_min + self.drift_ratio * self.std_min:触发漂移的核心判定条件。
  4. self.reset()漂移触发后清空统计量,让 DDM 从头学习新的分布。
  5. class ADWINMonitor:定义 ADWIN 检测器,用 Python 列表模拟滑动窗口。
  6. for split in range(n // 2, n):尝试从窗口中间开始找每个切分点。
  7. eps = math.sqrt((1 / (2 * total)) * math.log(4 * total / self.delta))计算 Hoeffding 界给出的显著性阈值。
  8. if abs(mean_left - mean_right) > eps:均值差超过阈值就判定漂移。
  9. self.window = right漂移后丢弃旧数据段,只保留新数据段。
  10. random.gauss(5.0, 0.5)生成稳定段的正态分布数据。

常见误区

误区很多同学认为漂移检测成功触发告警后,下一步就是无条件自动触发模型重训练,把训练脚本一挂就万事大吉。

正解漂移检测解决的是“发现问题”,模型重训练解决的是“解决问题”,两者之间还隔着“如何解决”的决策。重训练需要准备新标签数据、验证集更新策略、回滚机制、训练资源分配等。如果盲目重训练,可能在漂移数据上过拟合,或触发训练/推理数据不一致的新问题。成熟系统通常先告警,人工或规则审核后再决定重训练还是回滚。

为何常见:许多 MLOps 框架的宣传材料把“漂移检测+自动重训练”打包展示,容易让人误以为这是默认的最佳实践。

误区有人把 DDM 当作通用漂移检测器,直接把特征值(比如用户年龄、点击率)输入给 DDM,希望它输出漂移与否。

正解DDM 需要的是二值的错误信号(0/1),它统计的是模型错误率,而不是特征值的分布。要监控连续特征,应先把特征变化转化为“偏差信号”,或者干脆换用 ADWIN 这类直接处理数值的检测器。误用 DDM 不仅得不到正确结果,还会在概念上混淆“性能漂移”与“数据漂移”。

为何常见:DDM 的论文标题是"Drift Detection Method",泛化的名字让人忽略了它的输入前提。

误区直觉上样本越多统计越准,所以希望把 ADWIN 的窗口设得很大,觉得这样检测结果更可信。

正解窗口过大反而会让漂移信号被大量历史数据“稀释”,均值差被平均掉,检测延迟显著变长。ADWIN 的核心价值就是自适应——稳定期窗口自动增长去获取统计置信度,漂移期窗口快速收缩去追踪新状态。手动设一个超大的固定窗口,恰恰违背了它的设计初衷。

为何常见:经典统计学的“大样本更好”印象根深蒂固,忽略了流式场景下时效性的代价。

误区ADWIN 比较窗口两侧的均值,所以只能检测数据平均值的变化,方差变化它无能为力。

正解ADWIN 检测的是分布变化,均值差异只是分布差异的一种可检验信号。如果分布从 \(N(0,1)\) 变成 \(N(0,3)\),均值未变,ADWIN 确实可能失灵。但这不等于它“只能检测均值”,在实际使用中,可以对方差、分位数等统计量构造衍生序列,再喂给 ADWIN 检测。也可以组合多个 ADWIN 实例分别监控不同统计量,弥补单一均值的盲区。

为何常见:直观上“均值差”是算法最显眼的判定量,初学者容易把它等同于算法的全部能力边界。

面试题

Q1. DDM 算法直接监控的核心指标是什么?

单选题 · easy

  • A.模型参数大小
  • B.模型预测错误率← 正确答案
  • C.数据特征均值
  • D.模型推理延迟

答案:B。DDM 的核心输入是每个样本预测的对错(0/1),它统计的是错误率及其波动。它不直接监控参数、特征均值或延迟。

Q2. DDM 用哪种概率分布刻画错误率的波动?

单选题 · easy

  • A.泊松分布
  • B.二项分布← 正确答案
  • C.指数分布
  • D.均匀分布

答案:B。每个样本的预测结果只有对/错两种,n 次预测中错误次数服从二项分布。错误率的标准差公式 \(\sqrt{p(1-p)/n}\) 正是二项分布的性质,其他分布没有这种对应关系。

Q3. DDM 进入“警告”状态意味着什么?

单选题 · mid

  • A.模型已经完全失效
  • B.错误率有上升趋势,需要留观← 正确答案
  • C.数据已经发生漂移
  • D.需要立即回滚模型

答案:B。当 \(p_i+\sigma_i\) 超过 \(p_{min}+2\sigma_{min}\) 时 DDM 进入警告状态,表示模型表现“可疑”但尚未确诊。此时应记录可疑样本,继续观察若干样本再做决定,而不是立刻回滚或判定失效。

Q4. ADWIN 判定漂移发生后,对滑动窗口执行什么操作?

单选题 · mid

  • A.扩大窗口长度
  • B.丢弃旧半段,保留新半段← 正确答案
  • C.清空整个窗口
  • D.保持窗口不变

答案:B。ADWIN 检测到左右两半均值差异超过阈值后,会把窗口的旧半段丢弃,只保留更接近当前分布的新半段,从而快速适应新状态。

Q5. ADWIN 的窗口长度有什么特点?

单选题 · easy

  • A.固定不变
  • B.随数据自动调整← 正确答案
  • C.线性增长不可缩减
  • D.完全随机变化

答案:B。稳定时窗口自动增长来积累统计置信度,检测到漂移时窗口快速收缩。窗口长度完全由数据驱动,这就是“自适应窗口”的含义。

Q6. 关于 DDM 的警告阈值与漂移阈值,以下说法正确的是?

多选题 · easy

  • A.警告阈值对应 3 倍标准差
  • B.警告阈值对应 2 倍标准差← 正确答案
  • C.警告阈值数值上大于漂移阈值
  • D.漂移阈值数值上大于警告阈值← 正确答案

答案:BD。DDM 默认 \(w=2\) 对应警告、\(d=3\) 对应漂移。警告先响起,若状况恶化再升级为漂移,所以漂移阈值(3σ)一定大于警告阈值(2σ)。B、D 正确,A、C 颠倒了两者的关系。

Q7. ADWIN 的显著性阈值 \(\epsilon_{cut}\) 来源于哪个概率不等式?

单选题 · hard

  • A.Chebyshev 不等式
  • B.Hoeffding 不等式← 正确答案
  • C.Markov 不等式
  • D.Jensen 不等式

答案:B。ADWIN 的理论基础是 Hoeffding 不等式:两个有界分布随机变量的均值差超过 \(\sqrt{(1/2n)\ln(4n/\delta)}\) 的概率有上界。Chebyshev 只能用小方差界,Markov 和 Jensen 不直接给出这种差值上界。

Q8. 以下哪些做法可以降低漂移检测的误报率?

多选题 · mid

  • A.减小 ADWIN 的 \(\delta\) 值← 正确答案
  • B.增大 ADWIN 的 \(\delta\) 值
  • C.告警前连续观察多个样本确认← 正确答案
  • D.忽略所有告警

答案:AC。\(\delta\) 减小会让阈值 \(\sqrt{(1/2n)\ln(4n/\delta)}\) 变大,触发难度提高,误报减少。确认机制要求警告状态持续多个样本才升级为告警,也能过滤瞬时噪声。B 会提高灵敏度但增加误报,D 等于取消检测。

Q9. 模型上线后数据分布逐渐变化,最恰当的处理是?

单选题 · easy

  • A.立即停用模型
  • B.触发告警并启动重训练← 正确答案
  • C.忽略变化继续运行
  • D.手动修改模型参数

答案:B。漂移检测的价值正是发现这种变化后及时动作。标准做法是告警让人工或自动化系统介入,启动重训练或回滚等流程。直接停用或忽略都会造成业务损失,手改参数过于随意。

Q10. 关于 ADWIN 与 DDM 的对比,正确的说法是?

多选题 · hard

  • A.DDM 需要 0/1 错误信号作为输入← 正确答案
  • B.ADWIN 可以直接监控数值特征← 正确答案
  • C.ADWIN 内存开销始终不变
  • D.DDM 在错误率可观测的业务中更简洁高效← 正确答案

答案:ABD。A 正确,DDM 统计错误率;B 正确,ADWIN 直接对数值序列操作;C 错误,ADWIN 窗口动态变化,通过桶压缩控制内存但不是固定不变;D 正确,DDM 实现简单、O(1) 存储,在有实时标签的场景中是极轻量的选择。