scikit-learn中文本数据的监督降维

时间:2013-10-31 18:33:06

标签: python machine-learning scikit-learn dimensionality-reduction

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

高级问题描述是我有一个文档集合,每个文档都可以有多个标签,我想根据内容确定哪些标签会被新文档打包。文档。

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

谢谢!

5 个答案:

答案 0 :(得分:2)

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

但是,减少数据的大小和复杂性始终是好的,并且您可以通过各种方式使用文本数据。适用性和性能取决于您拥有的矢量类型(频率计数,tfidf),您将始终必须确定输出中所需的尺寸(组件)数量。 scikit-learn中的实现主要在decomposition module

自然语言处理中最流行的方法是Singular Value Decomposition(SVD),它是潜在语义分析(LSA,也是LSI)的核心。坚持使用scikit-learn,您只需对数据应用TruncatedSVD()即可。类似的方法是Non-negative matrix factorization,以scikit-learn NMF()实现。

越来越流行的方法使用随机投影转换Random Indexing。您可以使用random_projection中的函数进行scikit-learn。

正如有人在另一个答案中指出的那样,Latent Dirichlet Allocation也是一种替代方案,尽管它比上述方法要慢得多且计算量要求更高。此外,它还是在scikit-learn中无法写入时。

如果您想要简化数据以便将其提供给分类器,我建议使用介于100和500之间的n_components进行SVD​​,或者使用介于500和2000之间的n_components进行随机投影(文献中的常用值)。 / p>

如果您有兴趣将缩小尺寸用作某种分类/聚类(人们称之为主题提取,尽管您实际上并不是提取主题,而是潜在的维度),那么LDA可能是更好的选择。请注意,它很慢,只需要纯粹的频率计数(没有tfidf)。组件数量是您必须提前确定的参数(无法估计)。

回到你的问题,我会使用矢量化器,降维选项和分类器制作一个sckit-learn管道,并进行大规模的参数搜索。通过这种方式,您将看到使用您拥有的标签集可以获得最佳效果的内容。

答案 1 :(得分:1)

您可以使用latent dirichlet allocation(此处为wiki)来发现文档中的主题。对于为文档分配标签,您可以使用文档标签的条件概率分布(给定文档中主题的分布)。如果你已经有了文件的标签,那么你只需要学习CPD,这是微不足道的。不幸的是,scikit-learn没有LDA实现,但gensim确实如此。

PS:这是另一个可能有帮助的paper。如果你不是非常精通统计推理/学习或机器学习,我建议你从这里开始(注意:它仍然假定数学成熟度很高)。

答案 2 :(得分:1)

现有几个scikit模块的功能与您要求的类似。

  • Linear Discriminant Analysis可能与您要求的最接近。它找到了数据的投影,它最大化了类质心之间相对于投影方差的距离。

  • Cross decomposition包括像偏最小二乘法这样的方法,它通过下部的dimentonial中间空间投影拟合多维目标的线性回归模型。它很像没有sigmoids的单个隐藏层神经网络。 这些是线性回归方法,但您可以对目标信号应用0-1编码 并且无论如何都要使用这些模型。

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

答案 3 :(得分:0)

尝试ISOMAP。在scikits.learn中有一个超级简单的内置函数。即使它没有你想要的一些保存属性,也值得一试。

答案 4 :(得分:0)

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

你应该记得在输出层使用softmax激活,在隐藏层(tanh或sigmoid)上使用非线性的东西。