8.1. 计算规模策略:更大规模的数据#
对于某些应用,样本数量、特征数量(或两者兼有)以及需要处理这些数据的速度对传统方法来说都极具挑战性。在这些情况下,scikit-learn 提供了一些选项,可以帮助您扩展系统。
8.1.1. 使用核外学习扩展实例#
核外(或“外部内存”)学习是一种用于学习无法容纳在计算机主内存 (RAM) 中的数据的技术。
这是一个旨在实现此目标的系统草图
一种流式传输实例的方法
一种从实例中提取特征的方法
一种增量算法
8.1.1.1. 流式传输实例#
基本上,1. 可以是一个从硬盘上的文件、数据库或网络流中生成实例的读取器,等等。但是,如何实现这一点的细节超出了本文档的范围。
8.1.1.2. 提取特征#
2. 可以是 scikit-learn 支持的各种特征提取方法中的任何一种相关方法。但是,当处理需要向量化且特征或值的集合事先未知的数据时,应该格外小心。一个很好的例子是文本分类,在训练过程中可能会发现未知的术语。如果从应用程序的角度来看多次遍历数据是合理的,则可以使用有状态向量化器。否则,可以使用无状态特征提取器来增加难度。目前首选的方法是使用所谓的哈希技巧,如sklearn.feature_extraction.FeatureHasher
(用于以 Python 字典列表表示的类别变量的数据集)或sklearn.feature_extraction.text.HashingVectorizer
(用于文本文档)中实现的那样。
8.1.1.3. 增量学习#
最后,对于 3.,我们在 scikit-learn 中有很多选择。虽然并非所有算法都可以增量学习(即无需一次看到所有实例),但所有实现了 partial_fit
API 的估计器都是候选者。实际上,能够从少量实例(有时称为“在线学习”)中增量学习对于核外学习至关重要,因为它保证在任何给定时间主内存中只有少量实例。选择一个平衡相关性和内存占用的小批量大小可能需要一些调整[1]。
以下是不同任务的增量估计器列表
对于分类任务,需要注意一个比较重要的方面:虽然无状态特征提取例程能够处理新的/未见过的属性,但增量学习器本身可能无法处理新的/未见过的目标类别。在这种情况下,您必须使用 classes=
参数将所有可能的类别传递给第一次 partial_fit
调用。
选择合适的算法时,另一个需要考虑的方面是,并非所有算法都对每个样本随着时间的推移给予相同的重视。具体来说,即使在许多样本之后,Perceptron
仍然对标记错误的样本敏感,而 SGD*
和 PassiveAggressive*
系列则对这种类型的伪影更鲁棒。反之,当这些样本较晚出现在数据流中时,由于它们的学习率随着时间推移而降低,后者往往会对显著不同但标记正确的样本给予较少的重视。
8.1.1.4. 示例#
最后,我们有一个完整的 文本文档的 Out-of-core 分类 示例。其目的是为想要构建 Out-of-core 学习系统的人们提供一个起点,并演示了上面讨论的大多数概念。
此外,它还显示了不同算法的性能随着处理样本数量的演变。
现在来看不同部分的计算时间,我们可以看到向量化比学习本身要昂贵得多。MultinomialNB
是最昂贵的算法,但可以通过增加小批量的大小来减轻其开销(练习:将程序中的 minibatch_size
更改为 100 和 10000 并进行比较)。