我对你的问题有点困惑。以我的经验,降维从来没有真正受到监督......但似乎你想要的是某种知情的特征选择,这在分类完成之前是不可能做到的。换句话说,在您的分类器经过训练和验证之前,您无法知道哪些特征信息量更大。
但是,减少数据的大小和复杂性总是好的,并且您可以通过多种方式来处理文本数据。适用性和性能取决于您拥有的向量类型(频率计数、tfidf),并且您始终必须确定输出中所需的维数(分量)。scikit-learn 中的实现主要在分解模块中。
自然语言处理中最流行的方法是奇异值分解(SVD),它是潜在语义分析(LSA,也称为 LSI)的核心。继续使用 scikit-learn,您可以简单地应用TruncatedSVD()
您的数据。类似的方法是非负矩阵分解,在 scikit-learn 中实现为NMF()
。
一种越来越流行的方法使用随机投影的变换,即随机索引。您可以使用random_projection中的函数在 scikit-learn 中执行此操作。
正如有人在另一个答案中指出的那样,潜在狄利克雷分配也是一种替代方法,尽管它比上述方法慢得多,计算要求也更高。此外,它在写作时在 scikit-learn 中是不可用的。
如果您只想简化数据以将其提供给分类器,我建议使用 n_components 介于 100 和 500 之间的 SVD,或使用 n_components 介于 500 和 2000 之间的随机投影(文献中的常用值)。
如果您已经对使用缩减维度作为某种分类/聚类感兴趣(人们称之为主题提取,尽管您实际上不是在提取主题,而是在提取潜在维度),那么 LDA 可能是更好的选择。当心,它很慢,只需要纯频率计数(没有 tfidf)。组件的数量是您必须提前确定的参数(无法估计)。
回到您的问题,我将创建一个带有矢量化器、降维选项和分类器的 sckit-learn 管道,并执行大量参数搜索。通过这种方式,您将看到使用您拥有的标签集可以获得最佳结果的内容。