大型数据集的有效降维

数据挖掘 Python scikit-学习 降维
2021-10-05 02:24:17

我有一个包含 ~1M 行和 ~500K 稀疏特征的数据集。我想将维度降低到 1K-5K 密集特征的数量级。

sklearn.decomposition.PCA不适用于稀疏数据,我尝试过使用sklearn.decomposition.TruncatedSVD但很快就会出现内存错误。对于这种规模的有效降维,我有哪些选择?

2个回答

您听说过统一流形逼近和投影 (UMAP)吗?

UMAP(统一流形近似和投影)是一种用于非线性降维的新颖流形学习技术。UMAP 是从基于黎曼几何和代数拓扑的理论框架构建的。结果是一种适用于现实世界数据的实用可扩展算法。UMAP 算法在可视化质量方面与 t-SNE 具有竞争力,并且可以说以卓越的运行时性能保留了更多的全局结构。此外,所描述的 UMAP 对嵌入维度没有计算限制,使其成为机器学习的通用降维技术。

检查他们的代码原始论文以获取优缺点列表,它非常易于使用。

Quick Facts: UMAP 可以处理大型数据集,比 t-SNE 更快,还支持对稀疏矩阵数据的拟合,与 t-SNE 相反,一种通用的降维技术,这意味着它不仅可以用于可视化,还可以用于用于减少输入其他机器学习模型的特征空间。

具体示例:我已经对该方法进行了基准测试,并将其与其他一些降维技术基准笔记本进行了比较,如果有兴趣快速查看并快速开始。

以防万一看到这篇文章的人发现 UMAP 不够高效,这里有一些我遇到的其他更有效的技术(但质量不高):

  • 随机投影:本质上是制作形状的随机矩阵d × m 在哪里 d 是原始维度和 m是所需的维度,并将数据矩阵与投影矩阵相乘以生成简化的数据集。sklearn.random_projection有一些实现。如果投影矩阵的大小和分布合适,那么点之间的成对距离几乎可以保留在投影空间中。

  • 特征哈希:取特征值的哈希,取模m 在哪里 m是所需的维度。哈希冲突是通过获取冲突值的总和来处理的。您可以将其视为打乱特征的顺序,将数据矩阵拆分为一系列垂直切片,然后将它们按元素添加在一起。对于稀疏数据,碰撞非常罕见。sklearn.feature_extraction.FeatureHasher是一种(我相信)仅适用于字符串输入的实现;我认为它通常用于词袋文本样式数据。