.. _scaling_strategies: 计算扩展策略:更大的数据 ======================== 对于某些应用来说,示例、特征(或两者)的数量以及/或处理它们所需的速度对传统方法构成了挑战。在这些情况下,scikit-learn 提供了多种选项供您考虑,以使您的系统能够扩展。 使用外存学习进行实例扩展 -------------------------- 外存(或“外部内存”)学习是一种用于从无法装入计算机主内存(RAM)的数据中学习的技术。 以下是一个旨在实现这一目标的系统草图: 1. 一种流式实例的方法 2. 一种从实例中提取特征的方法 3. 一种增量算法 流式实例 ........ 基本上,1. 可能是一个从硬盘上的文件、数据库、网络流等中生成实例的读取器。然而,如何实现这一点的细节超出了本文档的范围。 提取特征 ........ 2. 可以是 scikit-learn 支持的不同 :ref:`特征提取 ` 方法中的任何相关方式。然而,当处理需要向量化的数据且特征集或值预先未知时,应格外小心。一个很好的例子是文本分类,其中在训练过程中可能会遇到未知术语。如果从应用角度来看,多次遍历数据是合理的,则可以使用有状态的向量化器。否则,可以通过使用无状态特征提取器来增加难度。目前,首选的方法是使用所谓的 :ref:`哈希技巧` ,如 :class:`sklearn.feature_extraction.FeatureHasher` 实现的那样,用于以 Python 字典列表表示的分类变量的数据集。 :class:`sklearn.feature_extraction.text.HashingVectorizer` 用于文本文档。 增量学习 .......... 最后,对于 3,我们在 scikit-learn 中有多种选择。虽然并非所有算法都能增量学习(即不需要一次性看到所有实例),但所有实现 ``partial_fit`` API 的估计器都是候选对象。实际上,从一小批实例中增量学习的能力(有时称为“在线学习”)是核心外学习的关键,因为它保证了在任何给定时间,主内存中只有少量实例。选择一个平衡相关性和内存占用的好批次大小可能需要一些调优 [1]_。 以下是不同任务的增量估计器列表: - 分类 + :class:`sklearn.naive_bayes.MultinomialNB` + :class:`sklearn.naive_bayes.BernoulliNB` + :class:`sklearn.linear_model.Perceptron` + :class:`sklearn.linear_model.SGDClassifier` + :class:`sklearn.linear_model.PassiveAggressiveClassifier` + :class:`sklearn.neural_network.MLPClassifier` - 回归 + :class:`sklearn.linear_model.SGDRegressor` + :class:`sklearn.linear_model.PassiveAggressiveRegressor` + :class:`sklearn.neural_network.MLPRegressor` - 聚类 + :class:`sklearn.cluster.MiniBatchKMeans` + :class:`sklearn.cluster.Birch` - 分解 / 特征提取 + :class:`sklearn.decomposition.MiniBatchDictionaryLearning` + :class:`sklearn.decomposition.IncrementalPCA` + :class:`sklearn.decomposition.LatentDirichletAllocation` + :class:`sklearn.decomposition.MiniBatchNMF` - 预处理 + :class:`sklearn.preprocessing.StandardScaler` + :class:`sklearn.preprocessing.MinMaxScaler` + :class:`sklearn.preprocessing.MaxAbsScaler` 对于分类,有一点需要注意的是,虽然无状态特征提取例程可能能够处理新/未见过的 属性,增量学习器本身可能无法应对新的/未见过的目标类别。在这种情况下,您必须使用 ``classes=`` 参数在第一次 ``partial_fit`` 调用时传递所有可能的类别。 选择合适算法的另一个方面是,并非所有算法都会随着时间的推移对每个示例赋予相同的重视程度。也就是说,即使在经过许多示例之后, ``Perceptron`` 仍然对错误标记的示例敏感,而 ``SGD*`` 和 ``PassiveAggressive*`` 系列则对此类缺陷更具鲁棒性。相反,后者在示例流中较晚出现时,对于显著不同但正确标记的示例也倾向于给予较少的重视,因为它们的学习率随时间下降。 示例 .......... 最后,我们有一个完整的示例::ref:`sphx_glr_auto_examples_applications_plot_out_of_core_classification.py` 。它旨在为希望构建外存学习系统的人提供一个起点,并展示了上述大多数概念。 此外,它还展示了不同算法在处理示例数量增加时的性能演变。 .. |accuracy_over_time| image:: ../auto_examples/applications/images/sphx_glr_plot_out_of_core_classification_001.png :target: ../auto_examples/applications/plot_out_of_core_classification.html :scale: 80 .. centered:: |accuracy_over_time| 现在来看不同部分的计算时间,我们看到向量化比学习本身要昂贵得多。在不同的算法中, ``MultinomialNB`` 是最昂贵的,但其开销可以通过增加小批量的大小来缓解(练习:在程序中将 ``minibatch_size`` 改为 100 和 10000,并进行比较)。 .. |computation_time| image:: ../auto_examples/applications/images/sphx_glr_plot_out_of_core_classification_003.png :target: ../auto_examples/applications/plot_out_of_core_classification.html :scale: 80 .. centered:: |computation_time| 笔记 ...... .. [1] 根据算法,小批量大小可能会影响结果,也可能不会。SGD*、PassiveAggressive* 和离散的 NaiveBayes 是真正的在线算法,不受批量大小的影响。相反,MiniBatchKMeans 的收敛速度受批量大小的影响。此外,其内存占用也会随着批量大小的变化而显著变化。