在生产环境中,你会发现数据的重要性令人深思。我们采访了Uber和Gojek的机器学习从业者——在这两个数据和机器学习至关重要的企业中,他们对此有以下看法:
“数据是机器学习中最难的部分,也是最重要的一环……在生产ML系统中,数据损坏是最常见的问题原因。”
—— Uber的机器学习从业者
“在机器学习生命周期的所有活动中,没有比改善模型可用数据更具投资回报率的事情了。”
—— Gojek的机器学习从业者
事实上,如果你询问任何一位生产环境中的机器学习团队成员关于数据的重要性,你都会得到类似的回答。这也是我们要讨论数据的原因:它对成功至关重要,而且生产环境中的数据问题与学术或研究环境中的情况截然不同。
好了,说完这些,我们开始深入探讨吧!
数据收集中的重要考量
在编程语言设计中,一种编程语言中的“一等公民”是指能够支持其他实体通常可用的所有操作的实体。在机器学习中,数据就是“一等公民”。找到具有预测内容的数据听起来容易,但实际上可能非常困难。
在收集数据时,确保数据能够代表你试图构建的应用和要解决的问题至关重要。也就是说,你需要确保数据的特征空间覆盖尽可能接近你将收到的预测请求。
数据收集的另一个关键部分是负责地获取、存储和监控数据。这意味着在收集数据时,需要识别数据集中的潜在问题。例如,数据可能来自不同类型的不同测量(例如,数据集中可能混合了来自两种不同温度计的测量值,而它们的测量结果可能有所不同)。此外,像整数与浮点数的差异,或缺失值的编码方式等简单问题,也可能引发问题。另一个例子是,如果你的数据集测量的是海拔,那么0英尺的记录是表示海平面,还是表示该记录没有接收到海拔数据?如果你的模型的输入数据集来自其他机器学习模型的输出数据,也需要意识到错误可能会随着时间的推移而传播。因此,在数据收集的早期阶段监控数据源中的系统问题和中断,能帮助你尽早发现潜在问题。
在收集数据时,你还需要通过分析哪些特征具有预测价值来了解数据的有效性。特征工程有助于最大化数据的预测信号,而特征选择则有助于衡量预测信号的强度。
负责任的数据收集
在本节中,我们将讨论如何负责任地获取数据。这涉及确保数据安全和用户隐私、检查并确保公平性,以及设计能够减轻偏见的标注系统。
机器学习系统的数据可能来自不同的来源,包括自建的合成数据集、开源数据集、网络爬取以及实时数据收集。在收集数据时,数据安全和数据隐私是重要考量。数据安全指的是保护个人数据的政策、方法和手段;而数据隐私则涉及数据的合理使用、收集、保存、删除和存储。
数据管理不仅仅关乎机器学习产品。用户也应当能够控制所收集的数据。此外,必须建立机制以防止系统意外泄露用户数据。关于用户隐私,关键是保护个人身份信息(PII)。通过汇总、匿名化、编辑处理并赋予用户对数据共享的控制权,可以有效防止PII相关的问题。数据隐私和数据安全的处理方式取决于数据的性质、运行条件以及现有的法规(例如《通用数据保护条例》或GDPR,这是欧盟关于信息隐私的法规)。
除了安全性和隐私性,还需要考虑公平性。机器学习系统需要在公平性、准确性、透明性和可解释性之间保持微妙的平衡。然而,这类系统可能会以以下方式对用户产生不利影响:
- 代表性伤害
当系统放大或反映特定群体的负面刻板印象时 - 机会剥夺
当系统的预测带来负面现实后果,可能产生持久影响时 - 不成比例的产品失效
当特定用户群体的结果偏差显著更频繁出现时 - 通过劣势产生的伤害
当系统在不同的人口特征与用户行为之间推断出不利关联时
在考虑公平性时,需要确保模型不会以问题性的方式为某些群体持续预测出不同的体验,可以通过群体公平性(如人口统计平等和等化机会)和等精度来实现这一目标。
其中一个方面是考察人为标注数据中的潜在偏差。对于监督学习,需要准确的标签来训练模型和提供预测。这些标签通常来自两个来源:自动化系统和人工标注人员。人工标注人员指的是那些查看数据并为其分配标签的人。人工标注人员包括通用标注员、受训的专业人员和用户。人类能够以自动系统无法实现的方式标注数据。此外,数据越复杂,可能越需要人类专家进行标注。
在评估与人为标注数据相关的公平性时,有许多因素需要考虑。例如,需要确保标注人员的多样性,并且要考虑标注人员的背景和激励因素。此外,还应评估标注工具,考虑成本,因为需要足够大的数据集。同时还要考虑数据的新鲜度要求。
数据标注:生产环境中的数据变化与漂移
在考虑数据时,还必须意识到数据经常发生变化。数据变化或问题的原因有很多,可以分为引起渐变的原因和引起突变的原因。
渐变可能反映了数据本身的变化和/或影响数据的外界变化。渐变的原因包括趋势或季节性变化、特征分布的变化或特征相对重要性的变化。影响数据的外界变化则包括风格变化、业务范围和流程的变化、竞争者的变化以及业务扩展到不同市场或区域。
突变可能涉及数据收集问题和系统问题。引起数据突变的数据收集问题包括传感器或摄像头的移动、禁用或故障,或者日志记录的问题。导致数据突变的系统问题包括错误的软件更新、网络连接中断或系统延迟或故障。
关于数据变化,需要考虑数据漂移和概念漂移的问题。数据漂移指的是模型输入数据的分布发生了变化。因此,模型训练时的数据分布与当前输入数据分布不同,这可能导致模型性能随着时间的推移而下降。数据漂移的一个例子是,如果你的模型是用主要来自青少年的数据训练的,用来预测顾客的服装偏好,那么当模型接收到来自年长成年人的数据时,模型的准确性可能会下降。
概念漂移则是指模型输入与输出之间的关系随时间发生变化,这同样会导致模型性能变差。例如,一个预测消费者服装偏好的模型可能会随着新趋势、季节性变化以及其他之前未见的因素改变而性能下降,因为顾客的偏好本身发生了变化。
为应对潜在的数据变化,必须持续监控数据和模型性能,并在模型性能随着时间的推移而下降时及时响应。当真实情况缓慢变化(即历时数月或数年)时,处理数据变化相对容易。模型重训练可以由模型改进、更好的数据或软件或系统的变化来驱动。在这种情况下,可以使用基于人群标注的精心制作的数据集。
当真实情况变化较快(即历时数周)时,处理数据变化变得更加困难。在这些情况下,模型重训练的驱动因素除了前述的因素外,还包括模型性能的下降。在这里,数据集通常通过直接反馈或人群标注进行标注。
当真实情况变化更快(即历时数天、数小时甚至数分钟)时,情况变得更为复杂。在这种情况下,模型重训练可能由模型性能下降、希望改进模型、可用的更好训练数据或软件系统的变化来驱动。在这种情境中,可以通过直接反馈(将在后续讨论)或弱监督快速应用标签来进行标注。
数据标注:直接标注与人工标注
训练数据集需要使用组织可用的数据进行创建,并且模型通常需要在一定频率上使用新数据重新训练。为了创建一个最新的训练数据集,必须为数据样本加上标签。因此,对于从事生产机器学习的组织来说,标注成为一项持续的、任务关键的过程。
我们将从直接标注和人工标注开始讨论数据标注。直接标注是指从系统中获取信息,例如,通过跟踪点击率来获取数据。而人工标注是指由人手为样本标注真实值,例如,让心脏病学家作为专业领域的标注员来标注MRI扫描。此外,还有半监督标注、主动学习和弱监督等其他方法,我们将在后续章节中讨论这些高级标注方法。
直接标注有几个优势:它允许训练数据集持续创建,因为随着数据到达,可以从日志或系统收集的信息中添加标签;它使标签能够随着环境变化而快速适应和演变;它还能提供强有力的标签信号。然而,在某些情况下,直接标注不可用或存在缺点。例如,对于某些类型的机器学习问题,标签无法从系统中获得。此外,直接标注可能需要定制设计,以便使标注过程适应系统。
在适合直接标注的场景下,有一些开源工具可以用于日志分析。其中两个工具是Logstash和Fluentd。Logstash是一个数据处理管道,用于从不同来源收集、转换和存储日志。收集到的日志可以发送到多种输出类型之一。Fluentd是一个数据收集器,可以收集、解析、转换和分析数据。处理后的数据可以存储或与各种平台连接。此外,Google Cloud提供日志分析服务,用于存储、搜索、分析、监控和报警来自Google Cloud和AWS的日志数据和事件。其他系统,如AWS Elasticsearch和Azure Monitor,也可用于日志处理,并可应用于直接标注。
在人工标注中,标注员检查数据并手动分配标签。通常,标注员会被招聘并获得指导其分配真实值的说明。未标注数据会被收集并分配给标注员,通常为提高质量,会将相同的数据分配给多个标注员。标签收集后,需对冲突标签进行解决。
人工标注可以使标注数量超过其他方式的可能数量。然而,这种方法也有缺点。根据数据集的不同,标注员可能难以分配正确标签,导致数据集质量较低。由于标注员的经验不足等因素,质量可能进一步受损。此外,人工标注过程成本高、耗时长,生成的训练数据集可能比其他方法创建的数据集小,尤其是在需要显著专业化或专业知识的领域中,例如医学影像。此外,人工标注也受到本章前面讨论的公平性考虑的影响。
数据验证:检测数据问题
如前所述,数据可能发生多种变化,或者影响数据的系统可能引发意料之外的问题。鉴于数据对机器学习系统的重要性,检测此类问题至关重要。在本节中,我们将讨论数据中常见的问题及检测这些问题涉及的概念。下一节中,我们将探讨一种检测此类数据问题的特定工具。
如之前提到的,数据集差异可能导致问题。其中一种或一组问题是漂移,这涉及数据随时间变化。数据漂移是指由于季节性、事件或其他外界变化导致输入特征的统计特性发生变化。而概念漂移则是指标签的统计特性随时间变化,从而使训练期间建立的映射关系失效。
偏差指的是数据集之间的变化,通常发生在训练数据集和服务数据集之间。当训练数据集和服务数据集不符合相同的模式时,称为模式偏差。分布偏差则发生在训练和服务数据集中数值分布不一致的情况下。
数据验证:TensorFlow Data Validation
现在你已经了解了数据问题的基础知识和检测流程,我们来看看TensorFlow Data Validation(TFDV),这是一个可以使用Python和Apache Beam来分析和验证数据的库。谷歌每天使用TFDV分析和验证数百或数千个生产应用中的PB级数据。该库帮助用户了解数据,检测本章讨论的数据问题,从而维持机器学习管道的健康状态。
TFDV使用户能够执行以下操作:
- 生成数据的汇总统计信息
- 可视化这些统计信息,包括对两个数据集进行可视化比较
- 推断一个表达数据预期的模式
- 使用该模式检查数据是否存在异常
- 检测漂移和训练-服务偏差
TFDV的数据验证从为数据集生成汇总统计信息开始。统计信息可以包括特征的存在性、值和数量等。TFDV利用Apache Beam的数据处理能力来计算这些统计信息以应对大数据集。
一旦TFDV计算了这些汇总统计信息,它就可以自动创建一个描述数据的模式,通过定义各种约束(如特征的存在性、值数量、类型和范围)来实现。虽然自动生成的模式作为起点很有用,但用户通常需要调整或优化生成的模式以更好地反映他们对数据的预期。
使用优化后的模式后,用户可以使用TFDV进行异常检测。TFDV可以执行几种类型的异常检测,包括将单个汇总统计信息与模式进行比较,以确保生成统计信息的数据符合用户的预期。TFDV还可以比较两个数据集的数据分布——同样使用TFDV生成的汇总统计信息——以帮助识别潜在的漂移或训练-服务偏差(将在下一节进一步讨论)。
TFDV的异常检测结果可以帮助用户进一步完善模式或识别数据中的潜在问题不一致之处。模式随后可以随着时间的推移加以维护,并用于验证新到达的数据。
使用TFDV检测偏差
让我们深入了解TFDV检测数据集之间异常(如数据漂移和训练-服务偏差)的能力。在这里,漂移指的是训练数据不同迭代之间的差异,而偏差指的是训练数据与服务数据之间的差异。
可以使用TFDV检测三种类型的偏差:模式偏差、特征偏差和分布偏差,如图2-1所示。
偏差类型
模式偏差发生在训练数据和服务数据不符合相同的模式时;例如,如果特征A在训练数据中是浮点型,但在服务数据中是整数型。模式偏差的检测类似于单一数据集的异常检测,通过将数据集与指定模式进行比较来识别偏差。
特征偏差发生在训练数据和服务数据中应当相同的特征值不一致的情况下。为了识别特征偏差,TFDV会基于一个或多个指定的标识符特征,将训练和服务样本进行匹配,然后比较特征值以识别结果对。如果它们不同,TFDV会报告该差异为特征偏差。由于特征偏差是基于样本计算的而不是汇总统计,因此它的计算独立于其他验证步骤。
分布偏差则指的是两个数据集中特征值的分布发生了偏移。TFDV使用L无穷距离(仅用于分类特征)和Jensen-Shannon散度(用于数值和分类特征)来识别和衡量此类偏移。如果该度量超过用户指定的阈值,TFDV会提出分布偏差异常并指出差异。
导致服务数据集和训练数据集分布显著不同的原因有多种,包括训练时的采样错误、使用不同的数据源进行训练和服务,以及趋势、季节性或其他时间上的变化。一旦TFDV帮助识别出潜在的偏差,你可以进一步调查该偏移,确定是否是需要解决的问题。
示例:使用TensorFlow Data Validation检测不平衡数据集
假设你希望通过可视化和编程方式检测数据集是否不平衡。如果每个标签的样本数量相差悬殊(例如,一个类别有100个样本,另一个类别有1,000个样本),我们认为数据集是不平衡的。现实世界中的数据集由于各种原因几乎总是不平衡的,例如,获取某个类别样本的成本可能太高,但过于不平衡的数据集会妨碍模型训练过程中的泛化能力。
TFDV提供了简单的方法来生成数据集的统计信息并检查是否存在不平衡。在本节中,我们将带你完成使用TFDV检测不平衡数据集的步骤。
首先,安装TFDV库:
$ pip install tensorflow-data-validation
如果你已安装TFX,TFDV将作为其中一个依赖自动安装。
只需几行代码,我们就可以分析数据。首先,让我们生成数据统计信息:
import tensorflow_data_validation as tfdv
stats = tfdv.generate_statistics_from_csv(
data_location='your_data.csv',
delimiter=',')
TFDV提供了从多种格式加载数据的功能,例如Pandas数据框(generate_statistics_from_dataframe)或TensorFlow的TFRecords(generate_statistics_from_tfrecord):
stats = tfdv.generate_statistics_from_tfrecord(
data_location='your_data.tfrecord')
TFDV甚至允许你定义自己的数据连接器。有关更多信息,请参考TFDV文档。
如果希望通过编程方式检查标签分布,可以读取生成的统计信息。在我们的示例中,我们加载了一个垃圾邮件检测数据集,数据样本被标记为垃圾(spam)或正常(ham)。和所有现实案例一样,数据集中包含的正常邮件示例多于垃圾邮件示例。但是多多少呢?让我们检查一下:
print(stats.datasets[0].features[0].string_stats.rank_histogram)
输出结果:
buckets {
label: "ham"
sample_count: 4827.0
}
buckets {
low_rank: 1
high_rank: 1
label: "spam"
sample_count: 747.0
}
输出显示,我们的数据集中包含747个垃圾邮件示例和4,827个正常(良性)邮件示例。
此外,你可以使用TFDV快速生成统计信息的可视化图,如图2-2所示的另一个数据集,使用以下函数:
tfdv.visualize_statistics(stats)
TensorFlow Data Validation的替代方案
虽然TFDV的简便性令人赞叹,但数据科学家可能更偏爱其他分析工具,特别是在他们不使用TensorFlow作为主要机器学习框架的情况下。与TFDV一同发布了一些开源数据分析工具。以下是一些替代方案:
- Great Expectations
起初是一个开源项目,现在已成为一个商业云解决方案。它支持直接连接多个数据源,包括内存数据库。- Evidently
允许用户分析和可视化数据集,重点在于数据集监控。它支持对非结构化文本数据的漂移检测。
总结
在本章中,我们讨论了在收集和标注用于训练机器学习模型的数据时需要考虑的许多因素。鉴于数据对于机器学习系统健康的重要性,数据收集和标注过程中可能出现的问题,以及数据因各种原因(有时是难以预见的原因)发生变化的可能性,开发有效的数据管理和验证系统至关重要。