使用scikit-learn预测时内存错误,但拟合时无此问题

1 投票
1 回答
1514 浏览
提问于 2025-04-18 02:23

我正在使用scikit-learn中的TfidfVectorizer来对文本数据进行分类。

我把数据集转换了一下,结果变成了一个75,000行和172,000列的稀疏矩阵,里面有865,000个存储的元素。(我使用了1到3的ngram范围)

虽然花了很长时间,但我还是能把数据拟合进去。

不过,当我尝试预测测试集时,却遇到了内存问题。这是为什么呢?我本以为最耗内存的部分应该是拟合,而不是预测吧?

我尝试了一些方法来解决这个问题,但都没有成功。首先,我试着用joblib.dump把数据保存在本地,然后退出Python再重启,但这并没有解决问题。

接着,我尝试换用HashingVectorizer,结果讽刺的是,HashingVectorizer在同一个数据集上也出现了内存问题。我原以为Hashing Vectorizer会更节省内存呢?

hashing = HashingVectorizer(analyzer='word',ngram_range=(1,3))
tfidf = TfidfVectorizer(analyzer='word',ngram_range=(1,3))

xhash = hashing.fit_transform(x)
xtfidf = tfidf.fit_transform(x)

pac.fit(xhash,y) # causes memory error
pac.fit(xtfidf,y) # works fine

我使用的是scikit-learn 0.15(最新版本),操作系统是Windows 8。

我的电脑有8GB的内存,硬盘上有100GB的空闲空间。为了这个项目,我把虚拟内存设置成了50GB。如果需要的话,我可以把虚拟内存设置得更高,但我想先弄清楚问题是什么,而不是像过去几天那样盲目尝试解决方案……我尝试过几种不同的分类器:主要是PassiveAggressiveClassifierPerceptionMultinomialNBLinearSVC

我还要提到,有一次我使用了一个350,000行和472,000列的稀疏矩阵,里面有1200万个存储的元素。尽管花了一些时间,我还是能把数据拟合进去。不过在预测时也遇到了内存错误。

1 个回答

1

scikit-learn库经过了很好的优化,并且使用了NumPy和SciPy这两个工具。TfidVectorizer可以存储稀疏矩阵,这种矩阵的大小相对较小,跟普通的密集矩阵比起来要小很多。

如果你觉得这是内存的问题,可以在创建Tfidfvectorizer的时候设置max_features这个属性。这可能对你验证自己的想法有帮助(关于Tfidfvectorizer的更多细节,可以查看官方文档)。

另外,我建议你减少训练数据集的大小,然后再检查一次;这也可能对你验证自己的想法有帮助。

撰写回答