scikit-learn 中文本数据的监督降维
Posted
技术标签:
【中文标题】scikit-learn 中文本数据的监督降维【英文标题】:Supervised Dimensionality Reduction for Text Data in scikit-learn 【发布时间】:2013-10-31 18:33:05 【问题描述】:我正在尝试使用 scikit-learn 对自然语言数据进行一些机器学习。我已经将我的语料库转换为词袋向量(采用稀疏 CSR 矩阵的形式),我想知道 sklearn 中是否有监督降维算法能够获取高维、监督数据并进行投影它进入一个较低维度的空间,该空间保留了这些类之间的差异。
高级问题描述是我有一个文档集合,每个文档上都可以有多个标签,我想根据文档的内容预测哪些标签会被贴在新文档上文件。
本质上,这是一个使用 BoW 向量的稀疏表示的有监督、多标签、多类问题。 sklearn 中是否有可以处理此类数据的降维技术?人们在 scikit-learn 中使用有监督的 BoW 数据时是否使用过其他类型的技术?
谢谢!
【问题讨论】:
使用自动编码器是一种减少暗淡的好方法。不过,我不确定 scikit-learn 是否有一个。自编码器只是一个神经网络,其中输出是输入的尝试重建,隐藏层(通常)的维数低于输入。这样,输入被强制通过低维表示,该表示必须至少足以重建输入。因此可以使用隐藏层作为输入的压缩表示。请参阅:cs.toronto.edu/~hinton/science.pdf 另外,theano 和 pylearn2 非常适合神经网络。 有人在做自动编码器,但还没完成。 【参考方案1】:我对你的问题有点困惑。以我的经验,降维从来没有真正受到监督......但似乎你想要的是某种知情的特征选择,这在分类完成之前是不可能做到的。换句话说,在您的分类器经过训练和验证之前,您无法知道哪些特征信息量更大。
但是,减少数据的大小和复杂性总是好的,而且您可以通过多种方式来处理文本数据。适用性和性能取决于您拥有的向量类型(频率计数、tfidf),并且您始终必须确定输出中所需的维数(分量)。 scikit-learn 中的实现大多在decomposition module。
自然语言处理中最流行的方法是Singular Value Decomposition (SVD),它是潜在语义分析(LSA,也称为 LSI)的核心。继续使用 scikit-learn,您可以简单地将 TruncatedSVD()
应用于您的数据。类似的方法是Non-negative matrix factorization,在 scikit-learn 中实现为NMF()
。
一种越来越流行的方法是使用随机投影进行变换,Random Indexing。您可以在 scikit-learn 中使用 random_projection 中的函数执行此操作。
正如有人在另一个答案中指出的那样,潜在狄利克雷分配也是一种替代方法,尽管它比上述方法慢得多,计算要求也更高。此外,它在 scikit-learn 中是不可用的。
如果您只想简化数据以将其提供给分类器,我建议使用 n_components 介于 100 和 500 之间的 SVD,或使用 n_components 介于 500 和 2000 之间的随机投影(文献中的常用值)。
如果您已经对使用缩减维度作为某种分类/聚类感兴趣(人们称之为主题提取,尽管您实际上不是在提取主题,而是在提取潜在维度),那么 LDA 可能是更好的选择。当心,它很慢,只需要纯频率计数(没有 tfidf)。并且组件的数量是您必须提前确定的参数(无法估算)。
回到您的问题,我将创建一个带有矢量化器、降维选项和分类器的 sckit-learn 管道,并执行大量参数搜索。通过这种方式,您将看到使用您拥有的标签集的最佳结果。
【讨论】:
【参考方案2】:您可以使用latent dirichlet allocation(这里是wiki)来发现文档中的主题。对于为文档分配标签,您可以使用文档标签的条件概率分布(给定文档中主题的分布)。如果您的文档已经有了标签,那么您只需要学习 CPD,这很简单。不幸的是,scikit-learn 没有 LDA 实现,但 gensim 有。
PS:这是另一个paper,可能会有所帮助。如果您不太精通统计推断/学习或机器学习,我建议您从这里开始(注意:它仍然假设数学成熟度很高)。
【讨论】:
感谢您的回复!我喜欢 gensim,过去曾将其用于 LDA,但不幸的是,它们都主要用于解决无监督问题。我很想知道是否有一种技术可以在降低维度时记住标签信息。 它被称为监督 lda cs.princeton.edu/~blei/papers/BleiMcAuliffe2007.pdf【参考方案3】:几个现有的 scikit 模块执行与您要求的类似的操作。
Linear Discriminant Analysis 可能最接近您的要求。它找到数据的投影,使类质心之间的距离相对于投影方差最大化。
Cross decomposition 包括偏最小二乘法等方法,这些方法通过通过较低维度中间空间的投影来拟合多维目标的线性回归模型。它很像没有 sigmoid 的单个隐藏层神经网络。 这些是线性回归方法,但您可以对目标信号应用 0-1 编码 无论如何都要使用这些模型。
您可以使用像LogisticRegression
或SGDClassifier
这样的L1 正则化分类器来进行特征选择。 RandomizedLogisticRegression
将此与引导相结合,获得更稳定的功能集。
【讨论】:
【参考方案4】:试试 ISOMAP。在 scikits.learn 中有一个超级简单的内置函数。即使它没有您想要的一些保存特性,也值得一试。
【讨论】:
isomap 看起来很有希望,但显然页面上的文档与 Isomap 是否支持稀疏矩阵的代码不一致。 it looks like at this point in time it doesn't...谢谢! 我不清楚。文档表明它确实接受稀疏矩阵。您可以链接到可以显示为错误的项目源代码吗?您是否向他们提交了错误报告?这可能是一个快速修复,他们对错误报告非常敏感。 哎呀,完全链接到错误的东西。 here'sgithub问题的链接【参考方案5】:使用多层神经网络进行分类。如果您想查看输入在降维中的表示形式,请查看隐藏层的激活。隐藏层的作用根据定义进行了优化以区分类别,因为这是在设置权重时直接优化的。
您应该记住在输出层使用 softmax 激活,在隐藏层使用非线性函数(tanh 或 sigmoid)。
【讨论】:
以上是关于scikit-learn 中文本数据的监督降维的主要内容,如果未能解决你的问题,请参考以下文章