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. 示例#

最后,我们有一个完整的文本文档的核心外分类示例。它旨在为想要构建核心外学习系统的人提供一个起点,并展示了上面讨论的大多数概念。

此外,它还展示了不同算法的性能随着处理示例数量的变化而变化。

accuracy_over_time

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

computation_time

8.1.1.5. 注意#