如何使用scikit-learn对大文本数据进行分类?

时间:2019-05-21 16:52:32

标签: python machine-learning scikit-learn text-classification

我有一个容量为50GB的大型数据库,其中包含780个专业的486,000篇论文的摘录。 为了科学目的,有必要根据这些数据进行培训。但是可惜的是,资源仅限于移动处理器,16 GB内存(+ 16Gb SWAP)

使用一组40,000个项目(占基础的10%)(4.5 GB)和SGDClassifier分类器进行了分析,并且内存消耗约为16-17 GB。

因此,我要求社区对此提供帮助。

目前我的代码很相似

text_clf = Pipeline([
     ('count', CountVectorizer()),
     ('tfidf', TfidfTransformer()),
     ('clf', SGDClassifier(n_jobs=8),)
 ],
 )
texts_train, texts_test, cat_train, cat_test = train_test_split(texts, categories_ids, test_size=0.2)
text_clf.fit(texts_train, cat_train)

因此,我寻求有关如何优化此过程的建议,以便我可以处理整个数据库。

1 个答案:

答案 0 :(得分:1)

您可以使用warm_start=True并致电.partial_fit()(而不是.fit())。

有关正在使用的模型的描述,请参见文档here,该模型分别描述了该参数和函数。

基本上,您一次只能加载一部分数据,通过管道运行它,然后在循环中调用partial_fit。这样可以降低内存需求,同时还可以训练所有数据,而不论其数量如何。

编辑

如评论中所述,上述循环仅适用于预测模型,因此数据预处理将需要单独进行。

Here is a solution for training the CountVectorizer iteratively.

This question contains a TFIDF implementation that doesn't require all of the data to be loaded into memory.

因此,最终的解决方案是分两个阶段对数据进行预处理。第一个用于CountVectorizer,第二个用于TFIDF加权。

然后按照最初提议的相同过程训练模型,除了不需要管道之外,因为不再需要管道。