8.1. 计算规模策略:更大规模的数据#

对于某些应用,样本数量、特征数量(或两者兼有)以及需要处理这些数据的速度对传统方法来说都极具挑战性。在这些情况下,scikit-learn 提供了一些选项,可以帮助您扩展系统。

8.1.1. 使用核外学习扩展实例#

核外(或“外部内存”)学习是一种用于学习无法容纳在计算机主内存 (RAM) 中的数据的技术。

这是一个旨在实现此目标的系统草图

  1. 一种流式传输实例的方法

  2. 一种从实例中提取特征的方法

  3. 一种增量算法

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 学习系统的人们提供一个起点,并演示了上面讨论的大多数概念。

此外,它还显示了不同算法的性能随着处理样本数量的演变。

accuracy_over_time

现在来看不同部分的计算时间,我们可以看到向量化比学习本身要昂贵得多。MultinomialNB 是最昂贵的算法,但可以通过增加小批量的大小来减轻其开销(练习:将程序中的 minibatch_size 更改为 100 和 10000 并进行比较)。

computation_time

8.1.1.5. 注释#