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

Posted

技术标签:

【中文标题】如何使用 scikit-learn 对大文本数据进行分类?【英文标题】:How can I classify big text data with scikit-learn? 【发布时间】:2019-10-08 03:05:27 【问题描述】:

我有 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】:

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

请参阅文档here,了解您正在使用的模型,其中分别描述了该参数和函数。

基本上,您一次只加载一部分数据,通过管道运行它并在循环中调用 partial_fit。这将降低内存需求,同时还允许您对所有数据进行训练,无论数量如何。

编辑

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

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 加权。

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

【讨论】:

在这种情况下,TfidfTransformer 和 CountVectorizer 将无法正确处理。所以 OP 需要在内存中拥有完整的数据。

以上是关于如何使用 scikit-learn 对大文本数据进行分类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scikit-learn 中正确加载文本数据?

如何正确使用 scikit-learn 进行文本聚类

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

scikit-learn 为机器学习

scikit-learn 中为文本分类排列文本数据的标准方法是啥?

scikit-learn“使用文本数据教程”忽略了我的目标类别