8.1. 大数据的计算策略

​ 对于一些应用场景,比如许多的样本或者许多的特征(或者样本特征都很多),又或者这个速度问题(太慢)都是一些常规传统技术无法解决的。正因如此,scikit-learn提供了几种方法来解决大家的问题。

8.1.1 基于外核(“out-of-core”)学习的解决方式

外核(也有的称核外或“外部存储器”)学习是用来从那种无法在内存(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 是耗时最多的,但通过增加其 mini-batches 的大小可以减轻开销。(练习:minibatch_size 在程序中更改为100和10000,并进行比较)。

computation_time

8.1.1.5. 注释

  • 1

    根据算法,mini-batch 大小可以影响结果。SGD*,PassiveAggressive* 和离散的 NaiveBayes 是真正在线的,不受 batch 大小的影响。相反,MiniBatchKMeans 收敛速度受 batch 大小影响。此外,其内存占用可能会随 batch 大小而显着变化。