我有一个大小为50GB的大型数据库,其中包含486,000篇论文摘要,涉及780个专业领域。为了科研目的,需要基于这些数据进行训练。但遗憾的是,资源有限,仅有移动处理器和16GB内存(另加16GB交换空间)。
我使用了40,000个项目(基础的10%,约4.5GB)进行分析,并使用了SGDClassifier分类器,内存消耗约为16-17GB。
因此,我请求社区帮助解决这个问题。
目前我的代码大致如下:
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()
)。
请查看这里的文档,了解你所使用的模型中关于该参数和函数的描述。
基本思路是每次只加载一部分数据,通过你的管道处理,并在循环中调用partial_fit。这将降低内存需求,同时也允许你训练所有数据,无论数据量有多大。
编辑
正如评论中提到的,上述循环仅适用于预测模型,因此数据预处理需要单独进行。
这里有一个关于如何迭代训练CountVectorizer的解决方案。
这个问题中包含了一个不需要将所有数据加载到内存中的TFIDF实现方案。
因此,最终的解决方案将是分两阶段预处理数据。第一阶段用于CountVectorizer,第二阶段用于TFIDF加权。
然后,训练模型时,你可以遵循最初提出的相同过程,但不再需要使用Pipeline,因为它已经不再需要了。