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

高层问题描述是我有一个文档集合,每个文档上都可以有多个标签,并且我想根据文档的内容来预测将在新文档上拍哪些标签。

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

谢谢!

最佳答案

你的问题让我有些困惑。以我的经验,降维从未真正受到过监督……但是似乎您想要的是某种明智的特征选择,这在完成分类之前是不可能做到的。换句话说,在训练和验证分类器之前,您无法知道哪些功能会提供更多信息。

但是,减小数据的大小和复杂性始终是件好事,并且您可以通过多种方法来处理文本数据。适用性和性能取决于您拥有的向量的类型(频率计数,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中使用。

如果您只是想简化数据以便将其输入分类器,我建议SVD的n_components在100到500之间,或者随机投影的n_components在500到2000之间(文献中的常用值)。

如果您已经对使用降维作为某种分类/聚类感兴趣(人们称此为主题抽取,尽管您实际上并不是在抽取主题,而是潜在的维度),那么LDA可能是更好的选择。当心,它很慢并且只需要纯频率计数(没有tfidf)。组件数量是您必须预先确定的参数(无法估算)。

回到您的问题,我将建立一个带有矢量化器,降维选项和分类器的sckit-learn管道,并进行大量的参数搜索。通过这种方式,您将看到什么使您拥有的标签集具有最佳效果。

关于python - scikit-learn中文本数据的监督降维,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19714108/

10-12 23:07