在面对大规模数据集时,传统的数据处理方法可能会遇到挑战,尤其是当数据量巨大或者需要快速处理时。在这种情况下,扩展学习技术可以提供有效的解决方案。本文将探讨如何利用扩展学习技术来处理那些无法完全装入计算机主存储器(RAM)中的数据。
流式实例处理是一种技术,它允许从硬盘上的文件、数据库或网络流等来源逐个读取数据实例。虽然具体的实现细节超出了本文的讨论范围,但基本原理是使用一个读取器来逐个产生实例。这种方法特别适用于数据量巨大,无法一次性加载到内存中的情况。
特征提取是机器学习中的关键步骤,它涉及到从数据实例中提取出有用的信息。在处理需要向量化的数据时,如果特征集或值集事先未知,就需要特别小心。例如,在文本分类中,训练过程中可能会遇到未知的术语。在这种情况下,可以使用状态化的向量化器,如果从应用的角度来看,多次遍历数据是合理的。否则,可以通过使用无状态的特征提取器来增加难度。目前,推荐的方法之一是使用所谓的哈希技巧,这在scikit-learn中通过FeatureHasher和HashingVectorizer实现,分别用于处理分类变量和文本文档。
对于增量学习,scikit-learn提供了多种选项。虽然不是所有的算法都能增量学习(即不需要一次性看到所有实例),但所有实现了partial_fit API的估计器都是候选者。实际上,从一小批实例中增量学习的能力(有时也称为“在线学习”)是扩展学习的关键,因为它保证了在任何给定时间,主内存中只有少量的实例。选择一个合适的小批量大小,以平衡相关性和内存占用,可能需要一些调整。
以下是不同任务的增量估计器列表:
sklearn.naive_bayes.MultinomialNB
,
sklearn.naive_bayes.BernoulliNB
,
sklearn.linear_model.Perceptron
,
sklearn.linear_model.SGDClassifier
,
sklearn.linear_model.PassiveAggressiveClassifier
,
sklearn.neural_network.MLPClassifier
sklearn.linear_model.SGDRegressor
,
sklearn.linear_model.PassiveAggressiveRegressor
,
sklearn.neural_network.MLPRegressor
sklearn.cluster.MiniBatchKMeans
,
sklearn.cluster.Birch
sklearn.decomposition.MiniBatchDictionaryLearning
,
sklearn.decomposition.IncrementalPCA
,
sklearn.decomposition.LatentDirichletAllocation
,
sklearn.decomposition.MiniBatchNMF
sklearn.preprocessing.StandardScaler
,
sklearn.preprocessing.MinMaxScaler
,
sklearn.preprocessing.MaxAbsScaler
对于分类任务,需要注意的是,尽管无状态特征提取程序可能能够处理新的/未见过的属性,但增量学习器本身可能无法处理新的/未见过的目标类别。在这种情况下,需要在第一次partial_fit调用中使用classes参数传入所有可能的类别。
在选择适当的算法时,还需要考虑它们对每个样本的重要性是否随时间相同。例如,Perceptron即使在许多样本之后,仍然对错误标记的样本敏感,而SGD*和PassiveAggressive*系列则对这类问题更加健壮。相反,后者也倾向于在流的后期出现显著不同但正确标记的样本时,由于学习率随时间降低,对这些样本的重要性给予较少的重视。
最后,提供了一个完整的示例,展示了如何进行文本文档的扩展分类。这个示例旨在为想要构建扩展学习系统的人员提供一个起点,并展示了上述讨论的大多数概念。此外,它还展示了不同算法随着处理样本数量的增加,性能的变化情况。
从不同部分的计算时间来看,可以看到向量化比学习本身要昂贵得多。在不同的算法中,MultinomialNB是最昂贵的,但其开销可以通过增加小批量大小来减轻(练习:在程序中将minibatch_size更改为100和10000,然后进行比较)。