9.1. 计算扩展策略:更大的数据#
对于某些应用程序来说,示例、特征(或两者)的数量和/或需要处理的速度对于传统方法来说是具有挑战性的。在这些情况下,scikit-learn有许多选项可以考虑来扩展您的系统。
9.1.1. 使用核心外学习使用实例进行扩展#
核外(或“外部存储器”)学习是一种用于从无法容纳计算机主存储器(RAM)的数据中学习的技术。
以下是为实现这一目标而设计的系统草图:
流媒体实例的一种方法
一种从实例中提取特征的方法
增量算法
9.1.1.1. 流媒体实例#
基本上,1。可能是从硬盘驱动器上的文件、数据库、网络流等中生成实例的阅读器。但是,有关如何实现这一点的详细信息超出了本文档的范围。
9.1.1.2. 提取特征#
2.可以是提取不同特征的任何相关方法 feature extraction scikit-learn支持的方法。然而,在处理需要进行载体化并且预先不知道特征或值集的数据时,应该明确注意。一个很好的例子是文本分类,其中在训练期间可能会发现未知术语。如果从应用程序的角度来看,对数据进行多次传递是合理的,则可以使用有状态向量器。否则,使用无状态特征提取器可能会增加困难。目前首选的方法是使用所谓的 hashing trick 实施的将 sklearn.feature_extraction.FeatureHasher
对于具有表示为Python字典列表的分类变量的数据集,或 sklearn.feature_extraction.text.HashingVectorizer
对于文本文档。
9.1.1.3. 增量学习#
最后,对于3。我们在scikit-learn内部有很多选择。尽管并非所有算法都可以增量学习(即不同时看到所有实例),但所有实现 partial_fit
API是候选人。事实上,从小批量实例中渐进式学习的能力(有时称为“在线学习”)是核心外学习的关键,因为它保证在任何给定时间主内存中只有少量实例。为迷你批处理选择一个平衡相关性和内存占用的良好大小可能涉及一些调整 [1].
以下是不同任务的增量估计器列表:
对于分类来说,需要注意的一件重要的事情是,尽管无状态特征提取例程可能能够应对新的/未看到的属性,但增量学习器本身可能无法应对新的/未看到的目标类别。在这种情况下,您必须将所有可能的类传递给第一个 partial_fit
使用 classes=
参数.
选择合适的算法时需要考虑的另一个方面是,随着时间的推移,并非所有算法都对每个示例给予相同的重要性。即 Perceptron
即使在很多例子之后,仍然对标签不佳的例子敏感,而 SGD*
和 PassiveAggressive*
家庭对这类文物更加稳健。相反,当它们在流中出现较晚时,后者也往往会不太重视显着不同但标签正确的示例,因为它们的学习率随着时间的推移而下降。
9.1.1.4. 示例#
最后,我们有一个完整的例子 sphx_glr_auto_examples_applications_plot_out_of_core_classification.py .它旨在为想要构建非核心学习系统的人们提供一个起点,并展示了上面讨论的大部分概念。
此外,它还展示了不同算法的性能随着处理的示例数量的变化。
现在看看不同部分的计算时间,我们看到矢量化比学习本身要昂贵得多。从不同的算法, MultinomialNB
是最昂贵的,但可以通过增加迷你批次的大小来减轻其负担(练习:更改 minibatch_size
到程序中的100和10000并进行比较)。