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. 示例#
最后,我们有一个完整的示例:文本文档的外存分类 。它旨在为希望构建外存学习系统的人提供一个起点,并展示了上述大多数概念。
此外,它还展示了不同算法在处理示例数量增加时的性能演变。
现在来看不同部分的计算时间,我们看到向量化比学习本身要昂贵得多。在不同的算法中, MultinomialNB
是最昂贵的,但其开销可以通过增加小批量的大小来缓解(练习:在程序中将 minibatch_size
改为 100 和 10000,并进行比较)。