如何使用 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 对大文本数据进行分类?的主要内容,如果未能解决你的问题,请参考以下文章