Sklearn:如何在庞大的数据集上应用降维?
Posted
技术标签:
【中文标题】Sklearn:如何在庞大的数据集上应用降维?【英文标题】:Sklearn: How to apply dimensionality reduction on huge data set? 【发布时间】:2016-04-19 10:17:54 【问题描述】:问题:在对 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 的文档进行分类。
由于 OutOfMemory 错误,我被卡住了。
【问题讨论】:
【参考方案1】:我也遇到过类似的问题。使用受限玻尔兹曼机 (RBM) 而不是 PCA 解决了这个问题。从数学上讲,这是因为 PCA 只查看特征矩阵的特征值和特征向量,而 RBM 作为神经网络来考虑数据中特征的所有乘法可能性。因此,在决定哪些特征更重要时,RBM 需要考虑的范围要大得多。然后,它将特征的数量减少到比 PCA 更重要的特征更小的尺寸。但是,请务必在将 RBM 应用于数据之前对数据进行特征缩放和规范化。
【讨论】:
【参考方案2】:我想,traindata_tfidf
实际上是稀疏形式。尝试使用scipy sparse 格式之一而不是数组。另请查看SparsePCA 方法,如果没有帮助,请使用MiniBatchSparsePCA。
【讨论】:
感谢您的建议,我正在执行您的建议。此外,800 万个特征中的 10000 个还可以吗? 一如既往,视情况而定。有几种确定最佳 PC 数量的技术。就个人而言,我会从 50 这样的小数字开始,然后根据整体模型性能决定是否增加它。 我尝试使用 sparcepca from sklearn.decomposition import SparsePCA, MiniBatchSparsePCA spca = SparsePCA(n_components=100, random_state=42) newtfidf = spca.fit_transform(X_train_tfidf.todense()) OutOfMemory 错误...有什么问题吗? Ram 120GB 和 24GB 的可用内存仍然...... 可能你不应该打电话给todense()
。 X_train_tfidf
的类型是什么?还要检查RandomizedPCA
,稀疏格式可能会更好。
PCA 为 O(n^3)(需要 SVD 分解)我认为它不是 8e6 功能的正确工具。以上是关于Sklearn:如何在庞大的数据集上应用降维?的主要内容,如果未能解决你的问题,请参考以下文章
菜菜的sklearn课堂笔记支持向量机-探索核函数在不同数据集上的表现