在河边有一座水质监测站,橙色的浮标随着河水轻轻起伏。监测员老李的工作是每天定时取水样,观察水质是否异常。他发现河水永远不会一成不变——上游春季融雪、夏季暴雨、秋日工厂排污,都会让水质在某个瞬间发生改变。如果反应太慢,污染早已顺着支流扩散到整个城区;如果反应太快,偶来的漂浮物又会让他虚惊一场。 AI 模型和这条河很像。模型上线后,真实世界的数据就像不断流动的河水——用户习惯在变、市场环境在变、天气季节在变。当这些变化积累到一定程度,模型基于旧数据学到的“世界观”过时了,预测开始走偏。这个现象叫作概念漂移。要守护模型的健康,就需要一套自动“水质监测”系统,在不断涌入的数据流中及时发现分布变化。 本文要讲的 ADWIN 和 DDM,就是两套经典的“水质监测方案”。DDM 像一个经验丰富的老监测员,紧盯错误率指标;ADWIN 则像一个带着“记忆长卷”的新监测员,不断调整回顾历史的窗口长度。学会它们,你就能为 AI 系统装上一座自动预警的“水质监测站”。
对 AI 从业者:漂移检测是模型监控与持续学习体系的基石能力。掌握它,你就能在模型上线后第一时间发现数据分布变化,及时触发告警与重训练,显著提升系统的鲁棒性与交付质量。
可视化演示
动态演示漂移检测算法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 错误信号。如果你的业务里得不到实时标签,它便英雄无用武之地。
- \(p_i\)(当前错误率)第 \(i\) 个样本时,累计错误样本数除以总样本数。它反映模型近期“犯错”的比例,是 DDM 唯一关心的信号。
- \(\sigma_i\)(当前标准差)二项分布的标准差公式。错误率是对真实错误概率的估计,标准差衡量这个估计的不确定性——样本越多,估计越可靠,标准差越小。
- \(p_{min}\)(历史最优错误率)自检测以来,\(p_i + \sigma_i\) 曾经达到的最小值。它代表模型在“健康状态”下的最佳表现,是判断漂移的基准线。
- \(\sigma_{min}\)(最优状态标准差)与 \(p_{min}\) 同时记录的标准差,代表基准线附近的正常波动幅度。
- 漂移判定当 \(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)\) 级别。
小张收起了他的记忆长卷,得意地说:“我不但要盯酸碱度,还要记住整条河的故事,才能判断它是真变了,还是只是打了个喷嚏。”
- \(\hat{\mu}_0\)(旧半段均值)窗口切割后左半段数据的平均值,代表“过去的记忆”。
- \(\hat{\mu}_1\)(新半段均值)窗口右半段数据的平均值,代表“现在的状态”。
- \(|\hat{\mu}_0 - \hat{\mu}_1|\)(均值差异绝对值)两个时期统计量的差异,差异越大,说明分布变化越明显。
- \(n\)(窗口总样本数)\(W_0\) 与 \(W_1\) 的样本量之和。\(n\) 越大,统计置信度越高,允许检测到更细微的漂移。
- \(\delta\)(显著性参数)误报率上界的置信参数。它控制检测的“保守程度”,取值越小越不容易误报,但灵敏度也越低。
- \(\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 演示
"""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()
class DDMMonitor:定义 DDM 检测器,内部维护累计错误数等统计量。std = math.sqrt(p * (1 - p) / self.num_instances)用二项分布标准差衡量错误率波动范围。if p + std >= self.p_min + self.drift_ratio * self.std_min:触发漂移的核心判定条件。self.reset()漂移触发后清空统计量,让 DDM 从头学习新的分布。class ADWINMonitor:定义 ADWIN 检测器,用 Python 列表模拟滑动窗口。for split in range(n // 2, n):尝试从窗口中间开始找每个切分点。eps = math.sqrt((1 / (2 * total)) * math.log(4 * total / self.delta))计算 Hoeffding 界给出的显著性阈值。if abs(mean_left - mean_right) > eps:均值差超过阈值就判定漂移。self.window = right漂移后丢弃旧数据段,只保留新数据段。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 算法直接监控的核心指标是什么?
- A.模型参数大小
- B.模型预测错误率← 正确答案
- C.数据特征均值
- D.模型推理延迟
答案:B。DDM 的核心输入是每个样本预测的对错(0/1),它统计的是错误率及其波动。它不直接监控参数、特征均值或延迟。
Q2. DDM 用哪种概率分布刻画错误率的波动?
- A.泊松分布
- B.二项分布← 正确答案
- C.指数分布
- D.均匀分布
答案:B。每个样本的预测结果只有对/错两种,n 次预测中错误次数服从二项分布。错误率的标准差公式 \(\sqrt{p(1-p)/n}\) 正是二项分布的性质,其他分布没有这种对应关系。
Q3. DDM 进入“警告”状态意味着什么?
- A.模型已经完全失效
- B.错误率有上升趋势,需要留观← 正确答案
- C.数据已经发生漂移
- D.需要立即回滚模型
答案:B。当 \(p_i+\sigma_i\) 超过 \(p_{min}+2\sigma_{min}\) 时 DDM 进入警告状态,表示模型表现“可疑”但尚未确诊。此时应记录可疑样本,继续观察若干样本再做决定,而不是立刻回滚或判定失效。
Q4. ADWIN 判定漂移发生后,对滑动窗口执行什么操作?
- A.扩大窗口长度
- B.丢弃旧半段,保留新半段← 正确答案
- C.清空整个窗口
- D.保持窗口不变
答案:B。ADWIN 检测到左右两半均值差异超过阈值后,会把窗口的旧半段丢弃,只保留更接近当前分布的新半段,从而快速适应新状态。
Q5. ADWIN 的窗口长度有什么特点?
- A.固定不变
- B.随数据自动调整← 正确答案
- C.线性增长不可缩减
- D.完全随机变化
答案:B。稳定时窗口自动增长来积累统计置信度,检测到漂移时窗口快速收缩。窗口长度完全由数据驱动,这就是“自适应窗口”的含义。
Q6. 关于 DDM 的警告阈值与漂移阈值,以下说法正确的是?
- A.警告阈值对应 3 倍标准差
- B.警告阈值对应 2 倍标准差← 正确答案
- C.警告阈值数值上大于漂移阈值
- D.漂移阈值数值上大于警告阈值← 正确答案
答案:BD。DDM 默认 \(w=2\) 对应警告、\(d=3\) 对应漂移。警告先响起,若状况恶化再升级为漂移,所以漂移阈值(3σ)一定大于警告阈值(2σ)。B、D 正确,A、C 颠倒了两者的关系。
Q7. ADWIN 的显著性阈值 \(\epsilon_{cut}\) 来源于哪个概率不等式?
- A.Chebyshev 不等式
- B.Hoeffding 不等式← 正确答案
- C.Markov 不等式
- D.Jensen 不等式
答案:B。ADWIN 的理论基础是 Hoeffding 不等式:两个有界分布随机变量的均值差超过 \(\sqrt{(1/2n)\ln(4n/\delta)}\) 的概率有上界。Chebyshev 只能用小方差界,Markov 和 Jensen 不直接给出这种差值上界。
Q8. 以下哪些做法可以降低漂移检测的误报率?
- A.减小 ADWIN 的 \(\delta\) 值← 正确答案
- B.增大 ADWIN 的 \(\delta\) 值
- C.告警前连续观察多个样本确认← 正确答案
- D.忽略所有告警
答案:AC。\(\delta\) 减小会让阈值 \(\sqrt{(1/2n)\ln(4n/\delta)}\) 变大,触发难度提高,误报减少。确认机制要求警告状态持续多个样本才升级为告警,也能过滤瞬时噪声。B 会提高灵敏度但增加误报,D 等于取消检测。
Q9. 模型上线后数据分布逐渐变化,最恰当的处理是?
- A.立即停用模型
- B.触发告警并启动重训练← 正确答案
- C.忽略变化继续运行
- D.手动修改模型参数
答案:B。漂移检测的价值正是发现这种变化后及时动作。标准做法是告警让人工或自动化系统介入,启动重训练或回滚等流程。直接停用或忽略都会造成业务损失,手改参数过于随意。
Q10. 关于 ADWIN 与 DDM 的对比,正确的说法是?
- A.DDM 需要 0/1 错误信号作为输入← 正确答案
- B.ADWIN 可以直接监控数值特征← 正确答案
- C.ADWIN 内存开销始终不变
- D.DDM 在错误率可观测的业务中更简洁高效← 正确答案
答案:ABD。A 正确,DDM 统计错误率;B 正确,ADWIN 直接对数值序列操作;C 错误,ADWIN 窗口动态变化,通过桶压缩控制内存但不是固定不变;D 正确,DDM 实现简单、O(1) 存储,在有实时标签的场景中是极轻量的选择。