数据会随时间而改变。这会导致假设输入和输出变量之间存在静态关系的预测模型性能下降。
数据底层关系变化的这个问题在机器学习领域被称为概念漂移。
在这篇文章中,你将了解概念漂移问题以及你在自己的预测建模问题中如何解决它。
完成这篇文章后,您将了解:
- 数据随时间变化的问题。
- 什么是概念漂移及其定义。
- 如何在您自己的预测建模问题中处理概念漂移。
通过我的新书《机器学习算法精通》启动您的项目,书中包含分步教程和所有示例的Excel电子表格。
让我们开始吧。

机器学习中概念漂移入门指南
照片作者:Joe Cleere,部分权利保留。
概述
这篇文章分为3个部分;它们是
- 数据随时间变化
- 什么是概念漂移?
- 如何解决概念漂移
数据随时间变化
预测建模是从历史数据中学习模型,并使用模型对未知答案的新数据进行预测的问题。
从技术上讲,预测建模是给定输入数据 (X) 预测输出值 (y) 的映射函数 (f) 的问题。
1 |
y = f(X) |
通常,这个映射被假定为静态的,这意味着从历史数据中学到的映射对于未来新数据也同样有效,并且输入和输出数据之间的关系不会改变。
这对于许多问题都是正确的,但并非所有问题。
在某些情况下,输入和输出数据之间的关系会随时间改变,这意味着未知底层映射函数会发生变化。
这些变化可能很重要,例如,在旧历史数据上训练的模型所做的预测不再正确,或者不如在更新的历史数据上训练的模型那样正确。
这些变化反过来可能被检测到,如果检测到,则可以更新学习到的模型以反映这些变化。
…许多数据挖掘方法假设发现的模式是静态的。然而,在实践中,数据库中的模式会随时间演变。这带来了两个重要的挑战。第一个挑战是检测何时发生概念漂移。第二个挑战是在不从头开始诱导模式的情况下保持模式的最新。
— 第10页,《数据挖掘与知识发现手册》,2010年。
什么是概念漂移?
机器学习和数据挖掘中的概念漂移是指随时间推移,底层问题中输入和输出数据之间关系的变化。
在其他领域,这种变化可能被称为“协变量偏移”、“数据集偏移”或“非平稳性”。
在大多数具有挑战性的数据分析应用中,数据会随时间演变,并且必须近乎实时地进行分析。这类数据中的模式和关系通常会随时间演变,因此,为分析这些数据而构建的模型会随着时间的推移而迅速过时。在机器学习和数据挖掘中,这种现象被称为概念漂移。
— 概念漂移应用概述,2016年。
“概念漂移”中的概念是指输入和输出变量之间未知且隐藏的关系。
例如,天气数据中的一个概念可能是季节,它没有明确地包含在温度数据中,但可能影响温度数据。另一个例子可能是客户随时间变化的购买行为,它可能受到经济强度的影响,而经济强度没有明确地包含在数据中。这些元素也称为“隐藏上下文”。
许多现实世界领域学习的一个难题是,感兴趣的概念可能依赖于某些隐藏的上下文,而这些上下文没有明确地以预测特征的形式给出。一个典型的例子是天气预测规则,这些规则可能随季节而发生根本性变化。[…] 变化的原因通常是隐藏的,事先未知,这使得学习任务更加复杂。
— 概念漂移问题:定义和相关工作,2004年。
数据变化可以采取任何形式。从概念上讲,考虑变化具有某种时间一致性的情况更容易,即在特定时间段内收集的数据显示相同的关系,并且这种关系随时间平滑地变化。
请注意,情况并非总是如此,并且应质疑此假设。其他类型的变化可能包括
- 随时间发生的渐进式变化。
- 周期性或循环性变化。
- 突然或剧烈变化。
每种情况可能需要不同的概念漂移检测和处理方案。通常,周期性变化和长期趋势被认为是系统性的,可以明确识别和处理。
概念漂移可能存在于进行预测和随时间收集数据的监督学习问题中。鉴于数据随时间的变化,这些问题通常被称为在线学习问题。
在某些领域,预测是按时间排序的,例如时间序列预测和流数据上的预测,在这些领域,概念漂移问题更有可能发生,应明确测试和解决。
挖掘数据流的一个常见挑战是数据流并不总是严格平稳的,即数据概念(传入数据的底层分布)会不可预测地随时间漂移。这导致了及时检测数据流中这些概念漂移的需求。
— 流数据概念漂移检测,2015年。
Indre Zliobaite在其2010年的论文《概念漂移下的学习:概述》中提供了一个思考概念漂移和机器学习从业者需要做出的决定的框架,如下所示:
- 未来假设:设计者需要对未来的数据源做出假设。
- 变化类型:设计者需要识别可能的变化模式。
- 学习器适应性:根据变化类型和未来假设,设计者选择使学习器适应的机制。
- 模型选择:设计者需要一个标准来选择每个时间步的选定学习器的特定参数化(例如,集成成员的权重,变量窗口方法的窗口大小)。
此框架可能有助于您在解决自己的预测建模问题中的概念漂移时,思考可用的决策点。
如何解决概念漂移?
有许多方法可以解决概念漂移;让我们来看几个。
1. 什么都不做(静态模型)
最常见的方法是不处理它,并假设数据不会改变。
这允许您一次开发一个“最佳”模型,并将其应用于所有未来的数据。
这应该是您的起点和基线,用于与其他方法进行比较。如果您认为您的数据集可能存在概念漂移,您可以通过两种方式使用静态模型:
- 概念漂移检测。随时间监控静态模型的技能,如果技能下降,则可能发生概念漂移,需要进行干预。
- 基线性能。使用静态模型的技能作为基线,与您进行的任何干预进行比较。
2. 定期重新拟合
一个好的第一级干预是定期用更近期的历史数据更新您的静态模型。
例如,您可能每月或每年用前一时期的收集数据来更新模型。
这可能还包括回测模型,以选择合适的历史数据量在重新拟合静态模型时包含。
在某些情况下,可能适合只包含一小部分最近的历史数据来最好地捕捉输入和输出之间的新关系(例如,使用滑动窗口)。
3. 定期更新
一些机器学习模型可以被更新。
这比之前的方法(定期重新拟合)更有效率,因为不是完全丢弃静态模型,而是将现有状态作为起点,通过最近的历史数据样本来更新模型拟合。
例如,这种方法适用于大多数使用权重或系数的机器学习算法,如回归算法和神经网络。
4. 加权数据
某些算法允许您对输入数据的重要性进行加权。
在这种情况下,您可以使用与数据年龄成反比的权重,这样就可以更多地关注最近的数据(权重更高),而较少关注最近的数据(权重更小)。
5. 学习变化
可以使用集成方法,其中静态模型保持不变,但新模型会根据近期数据的关系来纠正静态模型的预测。
这可以被认为是某种增强类型(仅精神上)的集成,其中后续模型纠正先前模型的预测。这里的关键区别在于,后续模型是在不同的、更近期的数据上拟合的,而不是像 AdaBoost 和梯度增强那样,在同一数据集的加权形式上拟合。
6. 检测和选择模型
对于某些问题领域,可能可以设计系统来检测变化并选择一个特定且不同的模型进行预测。
这可能适用于预期在过去发生过并且将来可以检查的突变领域。它还假设可以开发有技能的模型来处理可检测到的数据变化中的每一种。
例如,突变可能是特定观测值或范围内的一系列观测值,或者一个或多个输入变量分布的变化。
7. 数据准备
在某些领域,例如时间序列问题,数据可能会随时间变化。
在这些类型的问题中,通常会以某种方式准备数据,以去除数据随时间的系统性变化,例如通过差分来去除趋势和季节性。
这是如此普遍,以至于它被内嵌在 ARIMA 模型等经典线性方法中。
通常,我们不将数据中的系统性变化视为概念漂移问题,因为它可以直接处理。相反,这些示例可能是思考您的问题的一种有用方式,并可能帮助您预期变化并以特定方式准备数据,使用标准化、缩放、投影等方法来减轻或至少减少未来输入变量变化的影响。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
论文
- 在概念漂移和隐藏上下文存在的情况下进行学习, 1996.
- 概念漂移问题:定义和相关工作, 2004.
- 流数据概念漂移检测, 2015.
- 概念漂移下的学习:概述, 2010.
- 概念漂移应用概述, 2016.
- 什么是概念漂移及其度量方法?,2010年。
- 理解概念漂移, 2017.
文章
- 维基百科上的概念漂移
- 处理概念漂移:重要性、挑战和解决方案, 2011.
总结
在这篇文章中,您了解了应用机器学习中数据变化的“概念漂移”问题。
具体来说,你学到了:
- 数据随时间变化的问题。
- 什么是概念漂移及其定义。
- 如何在您自己的预测建模问题中处理概念漂移。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
非常感谢您的博客,我总是仔细阅读。有一件事与此有些关联,我还没有找到答案:当需要新的输出时,我们应该如何调整分类模型?特别是,用于人脸识别的分类,您可以定期添加新的人(即新的输出类别),而无需每次都重新生成模型?
很好的问题!
您可能需要训练一个新模型,但使用现有模型作为起点。
嘿,Jason,您能告诉我如何使用现有模型作为起点来启动我的模型吗?
这叫做迁移学习,请看这些教程
https://machinelearning.org.cn/?s=transfer+learning&post_type=post&submit=Search
或模型更新
https://machinelearning.org.cn/update-neural-network-models-with-more-data/
嗨,Jason,
一如既往,精彩的帖子!
您能否为第5点“学习变化”提供一些文献?我的想法是,您有一个全局基线模型,它就像一个静态模型。另一个模型是在更多后续数据上训练的,它基本上捕捉了近期趋势。
谢谢
抱歉,我没有参考资料。
嘿,感谢您的博客,非常有趣!您如何称呼新类别的出现(通常由新颖性检测算法处理)?在您的观点中,这是否也是概念漂移?
谢谢
如果您能预测它们,就可以留出编码空间。
如果可以重新拟合,那么在问题发生变化后重新拟合模型。
如果不行,也许可以拟合一个新模型,该模型选择使用旧模型处理旧类别,并使用新模型处理新类别,采用一对重置的结构。这听起来其实很糟糕……
你好,我正在寻找包含漂移的回归问题的数据库。
您有什么关于在哪里可以找到这样的数据集或生成它们(三种类型(渐进式、渐进式……)的想法吗?
感谢您的工作和帮助!
不,抱歉。
@sathouel,您可以考虑 2001 年和 2008 年左右的金融数据,当时全球经济(尤其是美国经济)发生了剧烈变化,并且在变化之前出现了一些异常的领先指标波动(让人想起 2008 年的衰退),这打破了大多数传统的金融预测模型。
为什么?
股市数据中存在一个隐藏点“市场情绪”,它取决于许多未知参数。
覆盖“如何解决概念漂移?”部分的任何代码示例都会很棒。
我在这里有一些关于更新 LSTM 的内容,可能对您有帮助。
https://machinelearning.org.cn/update-lstm-networks-training-time-series-forecasting/
你好!感谢您的帖子。我很想找到“允许您对输入数据的重要性进行加权”的算法,但很难找到。我找到了这篇论文(https://research.uni-sofia.bg/bitstream/10506/57/1/ECAI2000_WSTR.pdf),但没有提供实现,您有这些算法的示例,特别是带有代码的示例吗?非常感谢!
一个简单的线性或指数加权,更关注近期数据,可能是个不错的起点。
你好,
好文!
我想知道的是,非参数方法(如聚类)是否有助于防止概念漂移问题的发生?
怎么会呢?
通过根据用户行为中(新)观察到的模式隐式调整集群构成。
我并不是说它确实如此。只是想讨论一下是否有可能。
你好,
我正在处理一个属于概念漂移问题的领域,即 Twitter 上的垃圾邮件检测,其中一个尚未得到妥善解决的问题是“垃圾邮件漂移”,您是否有任何见解或想法如何进行,或者是否有任何合适的算法?
感谢您的帮助
首先测量漂移,然后提出并测试处理方法。
如何测量漂移?您能举例说明吗?
分布的变化将是一个好的开始。也许是交叉熵或 KL 散度。
我正在尝试量化概念漂移的成本。您能否提供时间节省、处理能力节省、消除此问题的准确性提高等方面的价值?
抱歉,我没明白,您到底是什么意思?
你好,
我们如何证明图像分类中的概念漂移?
您是什么意思?是想说检测吗?
概念漂移的一个好迹象是模型在处理新数据时性能随时间下降。
嗨,
模型跟踪是什么?部署前如何进行?
谢谢。
我不确定,什么是模型跟踪?
您是指模型评估吗?
https://machinelearning.org.cn/faq/single-faq/how-do-i-evaluate-a-machine-learning-algorithm
感谢这篇精彩的文章。我正在使用纳斯达克历史数据,通过集成方法进行股票预测,应用概念漂移是否可以提高模型准确性?或者在股票预测中使用概念漂移是否可行?
感谢您的善意合作
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/can-you-help-me-with-machine-learning-for-finance-or-the-stock-market
非常感谢您的回复。不过,我有以下问题:
1- 目前有多少集成算法可用?或者哪些被认为是集成
2- 是否容易修改其中一个集成以获得更好的准确性?
先谢谢了
有很多集成算法,可能数不清。
开始时,您应该关注大约 3 种,例如堆叠、装袋、增强。
所有模型都必须针对特定数据集进行调整,以提高模型技能。
您能否提供一个小型数据集的简单现实生活中的概念漂移示例?
当然:时间序列中的水位每天都在变化。
先生,我需要一个数学示例来显示概率分布的变化,即 P(Y|X) 显示概念漂移。您能否在一个小型、简单的数据集上演示概念漂移?
感谢您的建议。
尊敬的 Jason,非常感谢您非常有用的文章。目前我正在研究一个员工流失预测模型。由于我们的流失人数每年最多为 200 人,因此我们决定使用 5 年的流失数据。为了训练我们的机器,我们还需要在数据集中包含留任员工。
现在我和我的同事之间存在分歧,我认为我们需要使用每年的留任员工并将他们所有的记录添加进去,这样如果某人过去 5 年都留在了公司,他们将有 5 条不同的记录,具有 5 个不同的值,如不同的年龄、任期、不同的绩效分数等。但我的同事认为将 1 名留任员工计入数据集 5 次是错误的,应该只考虑他们最后的状态。
我可以使用这个概念并告诉他我的想法是正确的吗?
不客气。
我暂时不清楚,抱歉,您需要深入研究您的数据才能发现真相。
尊敬的 Jason Brownlee 先生:
在您的博客中,您提供了关于漂移检测的良好信息,我开始我的博士研究,我选择概念漂移检测作为机器学习问题。我需要帮助选择上述问题的方法,您能推荐新方法吗?
定义方法听起来像是您应该在研究项目中完成的事情。
谁能帮我一个使用机器学习检测概念漂移的新颖方法?
是的,但这可能会使完成博士学位的初衷失效。我建议您查阅文献并与您的研究导师讨论。
您好,Mahshad,
在我看来,您是对的,每年的重点都不同,因此好的方法是使用每年的数据,而不是全部5年的数据。
你好,概念漂移和数据集中的噪声有什么区别?
噪声是随机的,漂移是特定方向的,例如概念(如类别和决策边界)会发生变化。
漂移可能是一种偏差,它也可能是一种噪声。
学生表现的流数据中会发生概念漂移吗?如何发生?
当然,数据随时间的任何变化都是漂移的一个例子。
特定领域的原因可能取决于许多因素,也许可以与领域专家讨论。
嗨,Jason,
非常感谢您的所有博文。我发现它们非常有趣和有帮助。
我构建了一个模型,该模型根据许多自变量来预测因变量。在实践中,会提供新的自变量组合,并根据由此产生的预测做出决策。我的主管对当新组合与训练数据集中使用的总体相差甚远时会发生什么表示了很多反对意见。自然,预测仍然会发生,但其有效性令人怀疑。我的问题是:如何评估样本外自变量与训练期间使用的自变量的相似性?如果可能,当该示例与训练数据集中的分布相差甚远时,我可以用警告来限定预测。
另一个想法是测试每个新变量在训练期间同一变量的分布中的位置。我的数据集很大,这是可以做到的。但是,有人对只使用单变量分布持反对意见?以及当组合非常不可能或不可能的情况。对这两种方法有什么看法?这些方法在文献中有名称吗?
提前致谢,如果这没有意义,请道歉。
此致,
Aidan
我认为在您的情况下,可以通过交叉验证来提供置信度。请参阅这篇博文:https://machinelearning.org.cn/training-validation-test-split-and-cross-validation-done-right/
最后,您将测试集得分与交叉验证得分进行比较。这样,您就可以分辨出来。
谢谢 Adrian。我当然可以看到交叉验证的好处,而且它在一般情况下是合理的,但如果新的自变量组合与总体相差甚远,则无济于事。例如,负利率是经济学中一个流行的主题,如果将它们提供给我的模型,将导致许多自变量的分布与训练时不同。
我知道这是一个糟糕的例子,因为用户应该意识到如此大的变化,但如果用户在不知情的情况下提供了一个与训练总体相差甚远的变量组合,我们如何提醒他/她模型可能不准确?是否有这样的技术?例如,样本外自变量与训练期间使用的自变量的相似性。
模型将不知道它不准确,因为它看不到正确的预测是什么。但您的描述在我看来,您似乎在寻找异常值检测。尝试沿着这个思路思考。
感谢 Adrian 的文章,我们有不同的测试来衡量数据漂移,例如总体稳定性指数 (PSI)、分类变量的卡方检验、连续变量的 K-S 检验,但我们如何量化训练集中的数据在测试集上漂移了某个特定值?
您认为测试集和训练集中的样本均值和方差可以完成这项工作吗?
Jason 博士您好,
在研究中,如何将概念漂移注入数据集?
最好不要注入,而是收集不同时间的数据,看看使用一个数据集训练的模型如何应用于另一个数据集。例如,在自然语言处理问题中,如果您收集 2000 年代的文本进行训练,并将其应用于 1900 年代进行测试,您就能知道漂移如何影响模型。如果您确实想注入,您需要有一个关于数据如何漂移的模型,然后才能注入。