Python 大数据集的多标签分类

Python 大数据集的多标签分类,python,machine-learning,nlp,classification,scikit-learn,Python,Machine Learning,Nlp,Classification,Scikit Learn,我正在解决一个多标签分类问题。我有大约600万行需要处理,它们是大块的文本。它们在单独的列中使用多个标记进行标记 关于哪些scikit库可以帮助我扩展代码的任何建议。我使用的是One vs Rest和SVM。但它们的规模不会超过9万到10万行 classifier = Pipeline([ ('vectorizer', CountVectorizer(min_df=1)), ('tfidf', TfidfTransformer()), ('clf', OneVsRestClassifier(L

我正在解决一个多标签分类问题。我有大约600万行需要处理,它们是大块的文本。它们在单独的列中使用多个标记进行标记

关于哪些scikit库可以帮助我扩展代码的任何建议。我使用的是One vs Rest和SVM。但它们的规模不会超过9万到10万行

classifier = Pipeline([
('vectorizer', CountVectorizer(min_df=1)), 
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(LinearSVC()))])

支持向量机的规模随着列数的增加而增大,但随着行数的增加而减小,因为它们基本上是在学习哪些行构成支持向量。我认为这是SVM的一个常见问题,但大多数人不明白为什么,因为它们通常能够很好地扩展最合理的数据集

  • 您将需要1对其余的,因为您正在使用。一对一不能很好地扩展(n(n-1)分类器,vs n)
  • 我为你认为至少5,也许更高的术语设置了最小的DF,这将大大减少你的行大小。你会发现很多单词出现一次或两次,它们对你的分类没有任何价值,因为在这种频率下,算法不可能概括。堵塞可能会有所帮助
  • 同时删除停止词(the、a、an、介词等,在谷歌上查看)。这将进一步减少列数
  • 一旦您如前所述减小了列大小,我将尝试删除一些行。如果有非常嘈杂的文档,或者在步骤1-3之后很短,或者很长,我会设法消除它们。查看s.d.和平均文档长度,并根据该长度的频率绘制文档长度(根据字数),以确定
  • 如果数据集仍然太大,我建议在sklearn中使用决策树或朴素贝叶斯。DT的刻度非常好。我会设置一个深度阈值来限制树的深度,否则它会试图生长一棵巨大的树来记忆数据集。另一方面,NB的训练速度非常快,能够很好地处理大量列。如果DT运行良好,您可以尝试使用少量树的RF,并利用ipython并行化来实现多线程
  • 或者,将数据分割成更小的数据集,在每个数据集上训练一个分类器,将其保存到磁盘,然后从这些分类器中构建一个集成分类器

  • HashingVectorizer
    如果您迭代地将数据分块成10k或100k个适合内存的文档批,那么它将起作用

    然后,您可以将转换后的文档批传递给支持
    部分拟合
    方法的线性分类器(例如
    sgdclassizer
    PassiveAggressiveClassifier
    ),然后迭代新批

    在监控部分训练模型的准确性时,您可以开始在保留的验证集(例如10k文档)上对模型进行评分,而无需等待看到所有样本

    您还可以在数据分区上的多台计算机上并行执行此操作,然后对生成的
    coef_
    intercept_
    属性进行平均,以获得所有数据集的最终线性模型

    我在2013年3月在PyData的演讲中讨论了这一点:


    本文中还有一个示例代码取自:

    尝试使用
    部分匹配的
    API对每个标签的
    sgdclassizer
    进行训练。还考虑使用<代码> HashingVectorizer <代码>代替计数+ TF IDF。是否需要缩放或规范<代码> HashingVectorizer <代码>的输出,或者是否可以直接输入到<代码> sgd分类器< /代码>?您是否考虑切换到随机森林分类器?它的伸缩性比SVM好得多。