我有一个容量为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)
因此,我寻求有关如何优化此过程的建议,以便我可以处理整个数据库。
答案 0 :(得分:1)
您可以使用warm_start=True
并致电.partial_fit()
(而不是.fit()
)。
有关正在使用的模型的描述,请参见文档here,该模型分别描述了该参数和函数。
基本上,您一次只能加载一部分数据,通过管道运行它,然后在循环中调用partial_fit。这样可以降低内存需求,同时还可以训练所有数据,而不论其数量如何。
编辑
如评论中所述,上述循环仅适用于预测模型,因此数据预处理将需要单独进行。
Here is a solution for training the CountVectorizer iteratively.
因此,最终的解决方案是分两个阶段对数据进行预处理。第一个用于CountVectorizer,第二个用于TFIDF加权。
然后按照最初提议的相同过程训练模型,除了不需要管道之外,因为不再需要管道。