我有一个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)
因此,我寻求有关如何优化此过程的建议,以便我可以处理整个数据库。
最佳答案
您可以利用warm_start=True
并调用.partial_fit()
(而不是.fit()
)。
请参阅文档 here对于您正在使用的模型,它分别描述了该参数和函数。
基本上,您一次仅加载一部分数据,通过管道运行它并在循环中调用partial_fit。这将降低内存需求,同时还允许您对所有数据进行训练,无论数据量有多少。
编辑
正如评论中所述,上述循环仅适用于预测模型,因此数据预处理需要单独进行。
Here is a solution for training the CountVectorizer iteratively.
所以最终的解决方案是分两个阶段预处理数据。第一个用于 CountVectorizer,第二个用于 TFIDF 加权。
然后,为了训练模型,您可以按照最初建议的相同流程进行训练,但不使用 Pipeline,因为不再需要 Pipeline。
关于python - 如何使用 scikit-learn 对大文本数据进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56243043/