这可能是看起来要么很奇怪,要么很明显的陈述,但机器学习训练数据来自 某处 。也许你的数据集来自很多地方,比如另一个部门的同事或一个学术项目,并且是在那里创建的。但数据集都是在某个时间点通过某种过程创建的。这里的数据创建是指在 一些 数据存储系统而不是 我们的 数据存储系统中生成或捕获数据的过程。例如,来自服务系统的日志、从一个事件中捕获的大量图像集合、来自医疗程序的诊断数据等。在这个过程中隐含的是,我们将希望设计新系统并调整现有系统以生成更多的数据,这样我们的机器学习系统就有数据可用了。
有些数据集在静态(或至少变化不频繁)时效果很好,而其他数据集只有在频繁更新时才有用。例如,一个照片识别数据集可能可以使用很多个月,只要它能准确地代表我们的模型想要识别的照片类型。另外,如果户外的照片只代表温带气候的冬季环境,那么照片集的分布将与我们需要识别的期望图像集有很大的不同。因此,当这些地方的环境在春季变暖时,它将没有用处。同样,如果试图自动识别 yarnit.ai 的交易中的欺诈行为,我们会希望在最近的交易中不断训练自己的模型,同时提供关于这些交易是否具有欺诈性的信息。否则,有人可能会想出难以检测的欺诈方法偷走我们的所有编织用品,而我们可能永远无法让模型学会如何发现它。
我们收集的数据种类和创建的数据集可以是非结构化的、半结构化的,或者是结构化的(如图2-3所示)。
结构化数据 使用预定义的数据模型/模式进行量化,是高度组织化的,并且以表格格式(如电子表格或关系数据库)存储。姓名、地址、地理位置、日期和支付信息都是结构化数据的常见示例。由于结构化数据具有良好的格式,可以通过启发法用相对简单的代码轻松处理。
另一方面, 非结构化数据 是定性的,没有标准的数据模型或模式,所以它不能用传统的数据方法和工具来处理和分析。非结构化数据的示例包括电子邮件正文、产品描述、网络文本以及视频和音频文件。半结构化数据没有特定的数据模型/模式,但包括标签和语义标记,因此是介于结构化数据和非结构化数据之间的一种结构化数据类型。半结构化数据的示例包括电子邮件和社交媒体内容,前者可以按发件人、收件人、收件箱、已发送、草稿等进行检索,而后者则可以被归类为公共、私人和朋友,也可以从用户维护的角度分类,如散列标签。数据内部结构的特点对我们处理、存储和使用数据的方式影响很大。
图2-3:机器学习训练数据的分类
尽管模型中的偏见来自模型的结构和数据,但数据创建的环境对正确性、公平性和道德也有深远的影响。尽管我们会在第5章和第6章中对此进行更详细的论述,但我们在此可以提出的主要建议是,你要有某种程序来确定你的模型是否有偏见。我们可以用许多方法来做这件事,最简单的方法可能是模型卡( https://oreil.ly/h7E8h ),然而无论用何种程序来做此事并且让它在组织上被接受,都要比没有这样的程序好得多 [2] 。当我们开始在自己的机器学习系统中处理道德和公平性的问题时,这绝对是第一件要做的事。例如,将检测偏见的工作结合到数据起源或数据生命周期会议或跟踪过程中是相对容易的。但每个做机器学习的组织都应该建立这种程序,并将其作为持续改进的一部分来审查。
回顾一下,偏见来自许多方面,并且会在整个过程的很多阶段显现出来。没有能够完全保证数据公平性的方法。在这方面,成功的先决条件是一种有包容性的公司文化且公司内充满了来自各种背景的人,他们有不同的和创造性的观点。有充分的证据表明,具有非常不同的背景和观点的人,在信任和尊重的环境中工作时,会产生比背景全都相似的团队更好和更有用的想法。这可以成为针对经前述检查后漏掉的各种偏见的有力防御的一部分。然而,在没有任何流程和工具的帮助下阻止所有不好的结果,就像在没有系统的帮助下,人类的努力不能阻止所有的坏结果一样。
关于数据集的创建,或者说数据集的增加,还有最后一点需要注意:如果我们有少量的训练数据,但不足以训练出高质量的模型,那么可能需要增加数据。有些工具可以做到这一点。例如,Snorkel( https://www.snorkel.org/features )提供了一个程序化的接口,可以将少量的数据移植到更多的、变化更丰富的数据中,从本质上组成想象中的但统计上有效的训练数据。这是一个很好的开始,因为它允许我们轻松地将一个小的数据集扩展成一个大的。尽管看起来这些通过程序创建的数据集在某种程度上不那么有价值或不那么有用,但存在十分有力的证据表明,这种方法可以以较低的成本产生十分出色的结果,即使这种方法确实需要谨慎使用 [3] 。