是否可以使用sklearn在大数据文件上应用在线算法?

时间:2012-09-17 13:18:57

标签: scikit-learn online-algorithm large-data

我想在大文本语料库中应用快速在线降维技术,如(在线/小批量)字典学习。 我的输入数据自然不适合内存(这就是我想使用在线算法的原因)所以我正在寻找一种可以迭代文件而不是将所有内容加载到内存中的实现。 是否可以使用sklearn执行此操作?有其他选择吗?

由于 注册

3 个答案:

答案 0 :(得分:25)

对于某些支持partial_fit的算法,可以在脚本中编写外部循环来进行核外的大规模文本分类。但是,有一些缺少的元素:数据集读取器,它将磁盘上的数据作为平面文件或SQL数据库服务器的文件夹进行迭代,或者NoSQL存储或带有存储字段的Solr索引。我们也缺少在线文本矢量化器。

这是一个示例集成模板,用于解释它如何组合在一起。

import numpy as np
from sklearn.linear_model import Perceptron

from mymodule import SomeTextDocumentVectorizer
from mymodule import DataSetReader

dataset_reader = DataSetReader('/path/to/raw/data')

expected_classes = dataset_reader.get_all_classes()  # need to know the possible classes ahead of time

feature_extractor = SomeTextDocumentVectorizer()
classifier = Perceptron()

dataset_reader = DataSetReader('/path/to/raw/data')

for i, (documents, labels) in enumerate(dataset_reader.iter_chunks()):

    vectors = feature_extractor.transform(documents)
    classifier.partial_fit(vectors, labels, classes=expected_classes)

    if i % 100 == 0:
        # dump model to be able to monitor quality and later analyse convergence externally
        joblib.dump(classifier, 'model_%04d.pkl' % i)

数据集读取器类是特定于应用程序的,并且可能永远不会进入scikit-learn(除了平面文本文件或CSV文件的文件夹,不需要向库中添加新的依赖项)。

文本向量化器部分更成问题。当前的矢量化器没有partial_fit方法,因为我们构建内存中的词汇表(根据max_df和min_df修剪的python dict)。我们可以使用外部存储构建一个并删除max_df和min_df功能。

或者我们可以构建一个HashingTextVectorizer,它将使用散列技巧来删除字典要求。目前还没有这些存在(尽管我们已经有一些构建块,例如murmurhash包装器和对哈希特征的拉取请求)。

与此同时,我建议您查看Vowpal Wabbitthose python bindings

编辑: sklearn.feature_extraction.FeatureHasher类已合并到scikit-learn的主分支中,并将在下一个版本中提供(0.13)。请查看feature extraction上的文档。

编辑2 0.13现已发布,FeatureHasherHashingVectorizer可以直接处理文本数据。

编辑3:项目的官方示例库中现在有example on out-of-core learning with the Reuters dataset

答案 1 :(得分:7)

由于Sklearn 0.13确实存在HashingVectorizer的实现。

编辑:这是full-fledged example of such an application

基本上,这个例子表明你可以学习(例如分类文本)数据,这些数据不适合计算机的主存储器(而不是磁盘/网络/ ......)。

答案 2 :(得分:4)

除了Vowpal Wabbit之外,gensim也可能很有趣 - 它也具有在线Latent Dirichlet分配功能。