使用scikit-learn预测时内存错误,但拟合时无此问题
我正在使用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。如果需要的话,我可以把虚拟内存设置得更高,但我想先弄清楚问题是什么,而不是像过去几天那样盲目尝试解决方案……我尝试过几种不同的分类器:主要是PassiveAggressiveClassifier
、Perception
、MultinomialNB
和LinearSVC
。
我还要提到,有一次我使用了一个350,000行和472,000列的稀疏矩阵,里面有1200万个存储的元素。尽管花了一些时间,我还是能把数据拟合进去。不过在预测时也遇到了内存错误。
1 个回答
scikit-learn库经过了很好的优化,并且使用了NumPy和SciPy这两个工具。TfidVectorizer
可以存储稀疏矩阵,这种矩阵的大小相对较小,跟普通的密集矩阵比起来要小很多。
如果你觉得这是内存的问题,可以在创建Tfidfvectorizer
的时候设置max_features
这个属性。这可能对你验证自己的想法有帮助(关于Tfidfvectorizer
的更多细节,可以查看官方文档)。
另外,我建议你减少训练数据集的大小,然后再检查一次;这也可能对你验证自己的想法有帮助。