大型数据集的多标签分类

use*_*524 6 python nlp classification machine-learning scikit-learn

我正在解决多标签分类问题.我有大约6百万行要处理,这些行是巨大的文本块.它们在单独的列中标记有多个标记.

关于scikit库可以帮助我扩展代码的任何建议.我在其中使用One-vs-Rest和SVM.但它们的规模不超过90-100k行.

classifier = Pipeline([
('vectorizer', CountVectorizer(min_df=1)), 
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(LinearSVC()))])
Run Code Online (Sandbox Code Playgroud)

Sim*_*mon 3

随着列数的增加,SVM 的扩展性很好,但随着行数的增加,支持向量机的扩展性较差,因为它们本质上是在学习哪些行构成支持向量。我认为这是对 SVM 的常见抱怨,但大多数人不明白为什么,因为它们通常可以很好地适应最合理的数据集。

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