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

我有一个大小为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,因为它已经不再需要了。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注