Python 标签预测的特征空间缩减

Python 标签预测的特征空间缩减,python,machine-learning,scikit-learn,feature-extraction,tf-idf,Python,Machine Learning,Scikit Learn,Feature Extraction,Tf Idf,我正在编写一个ML模块(python)来预测stackoverflow问题(tag+body)的标记。我的语料库大约有500万个问题,每个问题都有标题、正文和标签。我把这个分成3:2进行训练和测试。我被这场灾难折磨着 完成的工作 预处理:标记删除、停止字删除、特殊字符删除和一些位和段。存储到MySQL中。这几乎是测试数据大小的一半 ngram关联:对于每个问题的标题和正文中的每个单字符和双字符,我维护一个关联标签列表。存储到redis中。这导致了大约一百万个唯一的单图和2000万个唯一的双图,

我正在编写一个ML模块(python)来预测stackoverflow问题(tag+body)的标记。我的语料库大约有500万个问题,每个问题都有标题、正文和标签。我把这个分成3:2进行训练和测试。我被这场灾难折磨着


完成的工作
  • 预处理:标记删除、停止字删除、特殊字符删除和一些位和段。存储到MySQL中。这几乎是测试数据大小的一半
  • ngram关联:对于每个问题的标题和正文中的每个单字符和双字符,我维护一个关联标签列表。存储到redis中。这导致了大约一百万个唯一的单图和2000万个唯一的双图,每个都有相应的标签频率列表。前

    "continuous integration": {"ci":42, "jenkins":15, "windows":1, "django":1, ....}
    
  • 注意:这里有两个问题:a)并非所有的单图和双图都是重要的,b)并非所有与ngram相关的标签都是重要的,尽管这并不意味着频率为1的标签都是等效的或可以随意删除。与给定ngram相关联的标签数量很容易达到数千个,其中大多数是无关的

  • tfidf:为了帮助选择要保留的ngram,我计算了每个单图和双图的整个语料库的tfidf分数,并用相关标签存储了相应的idf值。前

    "continuous integration": {"ci":42, "jenkins":15, ...., "__idf__":7.2123}
    
    tfidf分数存储在
    documentxfeature
    中,目前我不确定如何利用它。(由生成)


  • 问题
  • 如何使用这些经过处理的数据来减小功能集的大小?我读过关于SVD和PCA的文章,但这些例子总是讨论一组文档和一个词汇表。我不确定我的电视机的标签能放在哪里。此外,根据我的数据存储方式(redis+稀疏矩阵),很难使用已经实现的模块(sklearn、nltk等)来完成此任务
  • 一旦功能集减少,我计划使用它的方式如下:

    • 对测试数据进行预处理
    • 找到单格图和双格图
    • 对于存储在redis中的标签,找到相应的best-k标签
    • 为标题和正文文本应用某种权重
    • 除此之外,我还可能在文档中搜索确切的已知标记匹配。例如,如果“RubyonRails”出现在标题/正文中,那么它很可能也是一个相关的标记
    • 另外,对于以高概率预测的标记,我可能会利用标记图(一个无向图,其中标记经常一起出现,并且它们之间有加权边)来预测更多的标记
    有没有关于如何改进的建议?分类器能派上用场吗


  • 脚注
    我有一台16核、16GB内存的机器。redis服务器(我将移动到另一台机器)存储在RAM中,容量约为10GB。上述所有任务(tfidf除外)都是使用ipython集群并行完成的

    基线统计方法将把这视为一个分类问题。特征是由最大熵分类器(如Mallet)处理的单词包。Maxent(又名逻辑回归)擅长处理大型特征空间。获取与每个标记(即类标签)相关联的概率,并选择一些决策阈值,该阈值为您的项目提供精度/召回权衡。一些Mallet文档甚至提到了主题分类,这与您试图做的非常相似

    开放性的问题是Mallet如何处理数据的大小(不是那么大),以及这个特定的工具是否不是您提到的技术堆栈的初学者。您可能能够脱机训练(将reddis数据库转储到Mallet特性格式的文本文件中),并在Python中运行Mallet学习模型。评估maxent模型很简单。如果您想继续使用Python并使其更加自动化,那么NLTK和scikit learn中都有基于Python的maxent实现。这种方法根本不是最先进的,但它可以很好地工作,是比较更复杂方法的一个不错的基准。

    使用的公共Api,这是一个很好的解决方案。

    它从文本中提取概念,因此,为了减少维度,您可以使用这些概念,而不是单词袋范式。

    您可能会得到更好的交叉验证建议。那里的用户在机器学习和统计方面更有经验。交叉张贴-