我有一个包含 ~1M 行和 ~500K 稀疏特征的数据集。我想将维度降低到 1K-5K 密集特征的数量级。
sklearn.decomposition.PCA
不适用于稀疏数据,我尝试过使用sklearn.decomposition.TruncatedSVD
但很快就会出现内存错误。对于这种规模的有效降维,我有哪些选择?
我有一个包含 ~1M 行和 ~500K 稀疏特征的数据集。我想将维度降低到 1K-5K 密集特征的数量级。
sklearn.decomposition.PCA
不适用于稀疏数据,我尝试过使用sklearn.decomposition.TruncatedSVD
但很快就会出现内存错误。对于这种规模的有效降维,我有哪些选择?
您听说过统一流形逼近和投影 (UMAP)吗?
UMAP(统一流形近似和投影)是一种用于非线性降维的新颖流形学习技术。UMAP 是从基于黎曼几何和代数拓扑的理论框架构建的。结果是一种适用于现实世界数据的实用可扩展算法。UMAP 算法在可视化质量方面与 t-SNE 具有竞争力,并且可以说以卓越的运行时性能保留了更多的全局结构。此外,所描述的 UMAP 对嵌入维度没有计算限制,使其成为机器学习的通用降维技术。
Quick Facts: UMAP 可以处理大型数据集,比 t-SNE 更快,还支持对稀疏矩阵数据的拟合,与 t-SNE 相反,一种通用的降维技术,这意味着它不仅可以用于可视化,还可以用于用于减少输入其他机器学习模型的特征空间。
具体示例:我已经对该方法进行了基准测试,并将其与其他一些降维技术基准笔记本进行了比较,如果有兴趣快速查看并快速开始。
以防万一看到这篇文章的人发现 UMAP 不够高效,这里有一些我遇到的其他更有效的技术(但质量不高):
随机投影:本质上是制作形状的随机矩阵 在哪里 是原始维度和 是所需的维度,并将数据矩阵与投影矩阵相乘以生成简化的数据集。sklearn.random_projection
有一些实现。如果投影矩阵的大小和分布合适,那么点之间的成对距离几乎可以保留在投影空间中。
特征哈希:取特征值的哈希,取模 在哪里 是所需的维度。哈希冲突是通过获取冲突值的总和来处理的。您可以将其视为打乱特征的顺序,将数据矩阵拆分为一系列垂直切片,然后将它们按元素添加在一起。对于稀疏数据,碰撞非常罕见。sklearn.feature_extraction.FeatureHasher
是一种(我相信)仅适用于字符串输入的实现;我认为它通常用于词袋文本样式数据。