12

我正在尝试使用 scikit-learn 对自然语言数据进行一些机器学习。我已经将我的语料库转换为词袋向量(采用稀疏 CSR 矩阵的形式),我想知道 sklearn 中是否有监督降维算法能够获取高维、监督数据并进行投影它进入一个较低维度的空间,该空间保留了这些类之间的差异。

高级问题描述是我有一个文档集合,每个文档上都可以有多个标签,我想根据文档的内容预测哪些标签会被贴在新文档上。

在其核心,这是一个使用 BoW 向量的稀疏表示的有监督、多标签、多类问题。sklearn 中是否有可以处理此类数据的降维技术?人们在处理 scikit-learn 中的受监督的 BoW 数据时是否使用过其他类型的技术?

谢谢!

4

5 回答 5

2

我对你的问题有点困惑。以我的经验,降维从来没有真正受到监督......但似乎你想要的是某种知情的特征选择,这在分类完成之前是不可能做到的。换句话说,在您的分类器经过训练和验证之前,您无法知道哪些特征信息量更大。

但是,减少数据的大小和复杂性总是好的,并且您可以通过多种方式来处理文本数据。适用性和性能取决于您拥有的向量类型(频率计数、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 管道,并执行大量参数搜索。通过这种方式,您将看到使用您拥有的标签集可以获得最佳结果的内容。

于 2014-02-22T11:41:42.313 回答
1

几个现有的 scikit 模块执行与您要求的类似的操作。

  • 线性判别分析可能最接近您的要求。它找到数据的投影,使类质心之间的距离相对于投影方差最大化。

  • 交叉分解包括偏最小二乘法等方法,这些方法通过通过较低维中间空间的投影来拟合多维目标的线性回归模型。它很像没有 sigmoid 的单个隐藏层神经网络。这些是线性回归方法,但您可以对目标信号应用 0-1 编码并使用这些模型。

  • 您可以使用 L1 正则化分类器,例如LogisticRegressionSGDClassifier进行特征选择。RandomizedLogisticRegression将此与自举相结合,可以获得更稳定的功能集。

于 2014-05-12T03:12:11.363 回答
1

您可以使用潜在狄利克雷分配(这里是wiki)来发现文档中的主题。对于为文档分配标签,您可以使用文档标签的条件概率分布(给定文档中主题的分布)。如果您的文档已经有了标签,那么您只需要学习 CPD,这很简单。不幸的是,scikit-learn 没有 LDA 实现,但gensim有。

PS:这是另一篇可能有帮助的论文。如果您不太精通统计推断/学习或机器学习,我建议您从这里开始(注意:它仍然假设数学成熟度很高)。

于 2013-10-31T19:08:28.490 回答
0

试试 ISOMAP。在 scikits.learn 中有一个超级简单的内置函数。即使它没有您正在寻找的一些保存特性,也值得一试。

于 2013-10-31T19:13:05.790 回答
0

使用多层神经网络进行分类。如果您想查看输入在降维中的表示形式,请查看隐藏层的激活。隐藏层的作用根据定义进行了优化以区分类别,因为这是在设置权重时直接优化的。

您应该记住在输出层上使用 softmax 激活,在隐藏层上使用非线性(tanh 或 sigmoid)。

于 2013-11-01T09:52:07.633 回答