Sklearn:如何在大型数据集上应用降维?

4

问题:在对800万个特征应用PCA时,出现了OutOfMemory错误。

这是我的代码片段:

from sklearn.decomposition import PCA as sklearnPCA
sklearn_pca = sklearnPCA(n_components=10000)
pca_tfidf_sklearn = sklearn_pca.fit(traindata_tfidf.toarray())

我希望能够使用PCA /降维技术来处理提取的文本特征(使用tf-idf)。目前我有大约800万个这样的特征,我想要减少这些特征并使用MultiNomialNB对文档进行分类。

但是,我因为内存不足的错误而卡住了。

2个回答

2

我曾经遇到过类似的问题。使用受限玻尔兹曼机(RBM)代替PCA解决了这个问题。从数学上来说,这是因为PCA仅查看特征矩阵的特征值和特征向量,而RBM作为神经网络考虑数据中所有特征的乘法可能性。因此,RBM在确定哪些特征更重要时有一个更大的集合可供考虑。然后,它通过比PCA更多地减少特征数量,并保留更重要的特征。但是,在将RBM应用于数据之前,请确保对数据进行特征缩放和归一化。


1

我猜,traindata_tfidf实际上是以稀疏形式存在的。尝试使用scipy sparse格式之一而不是数组。还要查看SparsePCA方法,如果没有帮助,则使用MiniBatchSparsePCA


谢谢您的建议,我将会实现它。另外,从800万个特征中提取1万个是否合适? - Aman Tandon
像往常一样,这要看情况。有几种确定最佳主成分数量的技术。个人建议从较小的数量开始,比如50个,并根据整体模型表现来决定是否增加数量。 - cyberj0g
我尝试使用sparcepca<br /> 从sklearn.decomposition导入SparsePCA和MiniBatchSparsePCA spca = SparsePCA(n_components=100, random_state=42) newtfidf = spca.fit_transform(X_train_tfidf.todense())但是又出现了OutOfMemory错误... 有什么问题吗? 内存为120GB,还剩下24GB的空闲内存..... - Aman Tandon
PCA是O(n^3)的(需要SVD分解),我认为它不适合处理800万个特征。 - toasted_flakes
尝试使用RandomizedPCA,它的fit_transform方法肯定支持稀疏数据。 - cyberj0g
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接