大家好,漂移(Drift)是机器学习中用来描述模型在生产环境中随着时间推移而性能逐步下降的现象,由很多原因引起,主要原因是随着时间推移输入数据(x)分布的变化和期望目标(y)之间的关系发生了变化。在使用机器学习模型时,漂移是一个很大的挑战,因为数据通常是动态的,不断变化的。本文将探讨模型发生漂移的原因、漂移的类型和漂移的检测及Python漂移检测示例。
1.漂移Drift
机器学习模型是基于过去的数据进行学习的,但在实际使用时,由于环境的变化,这些模型可能会渐渐失去准确性,就像是“过气”一样,这种现象被称为“漂移”。简单来说,就是模型原本学习了过去的规律,但是现在环境变了,导致它的预测能力变差。
举个例子,考虑一个用于预测公司证券的机器学习模型,它是基于历史数据进行训练的。如果我们使用来自相对稳定市场的数据来训练模型,那么模型可能在一开始表现得很好。但是,如果随着时间的推移,市场变得更加波动,那么模型可能无法再准确地预测证券,因为它所依赖的数据的统计特性已经发生了变化。
数据漂移可以被看作是导致模型漂移的原因之一,而模型漂移则是由数据漂移的影响而产生的结果。
数据漂移指的是用于新的数据相对于历史数据发生的数据分布发生了变化。这种变化可能是由于外部因素引起的,例如市场趋势的变化、用户行为的改变或者数据收集过程的变更。
模型漂移则是由于数据漂移引起的模型性能下降或者偏差的结果。当模型在实际应用中遇到数据漂移时,它可能会变得不再适用于新的数据分布,导致其预测能力下降或者产生误差。因此,数据漂移可以被视为导致模型漂移的根源,而模型漂移则是对数据漂移的反映和响应。
2.漂移的类型
让我们探讨两种不同类型的漂移:
-
概念漂移Concept Drift(模型漂移Model Drift)
概念漂移或者模型漂移发生在模型设计的任务随着时间的推移而发生变化时。想象一下,一个机器学习模型被训练来根据电子邮件的内容检测垃圾邮件,如果人们收到的垃圾邮件类型发生了显著变化,模型可能就无法准确检测垃圾邮件了。概念漂移可以进一步分为四类,包括突发性漂移、渐进性漂移、增量漂移和循环概念(参见《概念漂移下的学习:综述》,Jie Lu等人)。
来源: https://arxiv.org/pdf/2004.05785.pdf
-
数据漂移(Data Drift)
数据漂移,也称为协变量漂移,发生在输入数据的分布随时间发生变化时。举个例子,考虑一个机器学习模型,该模型根据客户的年龄和收入预测其购买产品的可能性。如果客户的年龄和收入分布随时间发生显著变化,那么模型可能无法准确预测购买的可能性。
了解概念漂移和数据漂移,并采取措施防止或减轻它们的影响是很重要的。一些解决漂移的策略包括持续监控和评估模型的性能,使用新数据更新模型,以及使用更能够抵御漂移的机器学习模型。
3.检测漂移
可以通过两种方式来检测漂移:
-
基于机器学习模型的方法:利用机器学习模型来检测传入的输入数据是否发生漂移。
-
统计检验:有许多统计检验可用于检测数据漂移,主要分为三类:
-
顺序分析方法:通过连续的时间序列分析来检测数据的统计特性变化。这些方法可以实时监测并在漂移发生时立即检测到。
-
自定义漂移检测模型:构建专门用于检测漂移的自定义模型,经过历史数据训练,能够识别与预期模式的偏差。
-
时间分布方法:利用统计技术比较不同时间点收集到的数据的概率分布。常见的方法包括opulation Stability Index、KL散度、JS散度、KS检验和Wasserstein度量。这些方法量化了分布之间的差异,能够根据这些分布随时间的变化来检测漂移。
4.检测数据漂移的算法
-
Kolmogorov-Smirnov(K-S)检验:K-S检验是一种非参数统计检验,用于确定两组数据是否来自同一分布。通常用于测试数据样本是否来自特定总体,或者比较两个样本以确定它们是否来自同一总体。在这个检验中,零假设是分布相同。如果拒绝了这个假设,表明模型存在漂移。K-S检验是比较数据集并确定它们是否来自同一分布的有用工具。
-
Population Stability Index:PSI是一种用于测量两个样本或随时间变化中变量分布变化程度的工具。通常用于监测PSI特征的变化并识别机器学习模型性能可能存在的问题。PSI最初是为了监测风险评分卡中分数分布的变化而开发的,但现在用于检查所有与模型相关的属性的分布变化,包括因变量和自变量。较高的PSI值表明两个数据集中变量的分布存在显著差异,这可能意味着模型存在漂移。
-
Page-Hinkley方法:Page-Hinkley方法是一种用于检测一系列数据随时间变化的均值的统计方法。通常用于监测机器学习模型的性能并检测数据分布中可能表明模型漂移的变化。要使用Page-Hinkley方法,首先需要定义阈值和决策函数。阈值是在此值之上被认为均值变化显著的值,决策函数是一种返回值为1表示检测到变化,返回值为0表示未检测到变化的函数。Page-Hinkley方法是一种简单有效的检测数据系列均值随时间变化的方法。它特别适用于检测可能在查看数据时不会立即显现的均值的小变化。然而,重要的是要仔细选择阈值和决策函数,以确保该方法对数据变化具有足够的敏感性,但不至于太敏感以至于产生错误警报。
5.Python漂移检测实现
漂移检测将使用 Evidently 来检测漂移。Evidently 是一个开源的 Python 库,专为与机器学习工作的数据科学家和工程师设计,帮助从验证到生产阶段测试、评估和跟踪模型的性能。
加载包和引入数据:
# import libraries
import pandas as pd
import numpy as np
from sklearn import datasets
from evidently.report import Report
from evidently.metrics import DataDriftTable
from evidently.metrics import DatasetDriftMetric# create ref and cur dataset for drift detection
adult_data = datasets.fetch_openml(name='adult', version=2, as_frame='auto')
adult = adult_data.frameadult_ref = adult[~adult.education.isin(['Some-college', 'HS-grad', 'Bachelors'])]
adult_cur = adult[adult.education.isin(['Some-college', 'HS-grad', 'Bachelors'])]adult_cur.iloc[:2000, 3:5] = np.nan
adult_cur
生成数据迁移(Drift)报告:
data_drift_dataset_report = Report(metrics=[DatasetDriftMetric(),DataDriftTable(),
])data_drift_dataset_report.run(reference_data=adult_ref, current_data=adult_cur)
data_drift_dataset_report
综上所述,数据和模型漂移对机器学习形成严重挑战,了解漂移原因、实施有效监测实践可保持模型准确可靠。监控模型性能、使用漂移检测、定期更新数据重新训练是减轻风险的最佳实践,积极监控漂移确保机器学习系统持续为组织创造价值。MLOps 的概念对数据科工程师和领导者至关重要,这使得模型从jupyter试验环境转移到生产环境。