scikit-learn中用于文本数据的监督降维技术

13

我正在尝试使用scikit-learn处理自然语言数据上的机器学习问题。我已经将我的语料库转换为词袋向量(采用稀疏的CSR矩阵形式),我想知道是否有一个监督降维算法在sklearn中能够将高维度、受控数据投影到保留这些类之间差异方差的低维空间中。

高层次的问题描述是:我有一系列文档,每个文档都可以有多个标签,并且我希望根据文档内容预测哪些标签将被添加到新文档中。

从本质上讲,这是一个使用BoW向量的稀疏表示的有监督的多标签、多类问题。在sklearn中是否有一种可以处理这种类型数据的降维技术?还有其他人在使用supervised BoW数据时在scikit-learn中使用的技术吗?

谢谢!


一个不错的降维方法是使用自编码器。虽然我不确定scikit-learn是否有自编码器。自编码器只是一个神经网络,其输出是输入的尝试重建,而隐藏层(通常)具有比输入更低的维度。这样,输入被强制通过较低维度的表示,该表示必须足够好以从中重构输入。因此,可以使用隐藏层作为输入的压缩表示。请参阅:http://www.cs.toronto.edu/~hinton/science.pdf另外,Theano和Pylearn2非常适合神经网络。 - Ethan
有人正在开发一个自编码器,但它还没有完成。 - Fred Foo
5个回答

2
我对你的问题有点困惑。根据我的经验,降维通常并不是有监督的...但是似乎你想要一些受启发的特征选择,这在分类之前是不可能做到的。换句话说,在你的分类器被训练和验证之前,你无法知道哪些特征更具信息量。

然而,减少数据的大小和复杂性总是好的,你有各种方法可以用文本数据来实现。适用性和性能取决于你拥有的向量类型(频率计数、tfidf),你还需要确定输出中要保留的维度(分量)数量。在scikit-learn中的实现大多在decomposition module中。

自然语言处理中最流行的方法是奇异值分解(Singular Value Decomposition,SVD),它是潜在语义分析(Latent Semantic Analysis,LSA,也称为LSI)的核心。使用scikit-learn,您可以简单地在数据上应用TruncatedSVD()。类似的方法是非负矩阵分解,它在scikit-learn中实现为NMF()
越来越流行的方法是随机投影变换,即随机索引(Random Indexing)。您可以使用random_projection中的函数在scikit-learn中执行此操作。
正如其他答案中指出的那样,潜在狄利克雷分配也是一种选择,尽管它比上述方法要慢得多且需要更多计算资源。此外,在撰写本文时,它在scikit-learn中不可用。
如果您只是想简化数据以便将其馈送给分类器,我建议使用n_components在100到500之间的SVD或n_components在500到2000之间的随机投影(这些是文献中常见的值)。
如果您有兴趣将降维后的维度用作某种分类/聚类(人们称之为主题提取,尽管您实际上并不是在提取主题,而是潜在维度),那么LDA可能是更好的选择。请注意,它速度较慢,并且仅采用纯频率计数(没有tfidf)。并且组件数量是一个必须事先确定的参数(无法估计)。
回到您的问题,我会使用sckit-learn管道,包括向量化器、降维选项和分类器,并进行大规模参数搜索。通过这种方式,您将看到使用您拥有的标签集时哪种方法能够给出最佳结果。

监督降维的一个例子是监督UMAP。 - glmorous

1

有几个现有的scikit模块与您的要求相似。

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

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

  • 您可以使用L1正则化分类器,如LogisticRegressionSGDClassifier进行特征选择。RandomizedLogisticRegression结合了引导法,以获得更稳定的特征集。


1
你可以使用潜在狄利克雷分配(这里是维基百科链接)来发现文档中的主题。对于给文档打标签的任务,您可以使用文档标签的条件概率分布(给定文档中主题的分布)。如果您的文档已经有标签,则只需学习CPD即可,这很简单。不幸的是,scikit-learn没有LDA实现,但gensim有。

PS:这里还有另一篇论文可能会有所帮助。如果您对统计推断/学习或机器学习不是很熟悉,我建议您从这里开始(注意:它仍然假设具有高水平的数学素养)。


谢谢回复!我喜欢gensim,并且过去已经用它进行过LDA,但不幸的是它们都主要用于无监督问题。我很想知道是否有一种技术在降维时考虑标签信息。 - follyroof
1
它被称为监督式LDA https://www.cs.princeton.edu/~blei/papers/BleiMcAuliffe2007.pdf - Raff.Edward

0

尝试使用ISOMAP。scikits.learn中有一个超级简单的内置函数可供使用。即使它没有您寻找的某些保留属性,也值得一试。


Isomap 看起来非常有前途,但显然页面上的文档与代码对于 Isomap 是否支持稀疏矩阵存在分歧。看起来目前不支持... 不管怎样,还是谢谢! - follyroof
我不太清楚。文档显示它可以接受稀疏矩阵。你能否提供项目源代码的链接,以证明这是错误的?你是否向他们提交了错误报告?这可能只是一个小问题,他们对错误报告非常敏感,很快就会解决。 - ely
1
糟糕,链接到了错误的东西。这里是 Github 问题链接。 - follyroof

0
使用多层神经网络进行分类。如果您想查看输入在降维中的表示,请查看隐藏层的激活。隐藏层的作用是通过定义来优化区分类别,因为这是在设置权重时直接优化的内容。
您应该记得在输出层上使用softmax激活,在隐藏层上使用某些非线性函数(tanh或sigmoid)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接