大型数据集的多标签分类

时间:2013-11-29 08:12:42

标签: python machine-learning nlp classification scikit-learn

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

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

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

2 个答案:

答案 0 :(得分:3)

随着列数的增加,SVM的规模也会提高,但行数很少,因为它们基本上是在知道哪些行构成了支持向量。我已经将此视为对SVM的常见抱怨,但大多数人都不理解为什么,因为它们通常适用于大多数合理的数据集。

  1. 正如您所使用的那样,您将需要1与其他人相比。 One vs One不能很好地扩展(n(n-1)分类器,与n)。
  2. 我为您考虑的条件设置了最小df至少5,甚至更高,这将大大减少您的行大小。你会发现很多单词出现一次或两次,并且它们在你的分类中没有增加任何值,因为算法不可能一概而论。茎秆可能有助于那里。
  3. 同时删除停用词(a,a,an,介词等,在google上查看)。这将进一步减少列数。
  4. 如上所述缩小列大小后,我会尝试删除一些行。如果有文件非常嘈杂,或者在步骤1-3之后非常短,或者可能很长,我会想要消除它们。看看s.d.和平均文档长度,并绘制文档的长度(以字数计)与该长度的频率决定
  5. 如果数据集仍然太大,我会建议一个决策树,或天真的贝叶斯,两者都存在于sklearn中。 DT的规模非常好。我会设置一个深度阈值来限制树的深度,否则它会尝试生长一棵巨大的树来记住该数据集。另一方面,NB非常快速地训练和处理大量的列。如果DT运行良好,您可以尝试使用少量树进行RF,并将ipython并行化用于多线程。
  6. 或者,将数据划分为较小的数据集,在每个数据集上训练分类器,将其保存到磁盘,然后从这些分类器构建集合分类器。

答案 1 :(得分:0)

如果您将数据迭代地分块为适合内存的10k或100k文档批处理,那么

HashingVectorizer将起作用。

然后,您可以将批量转换后的文档传递给支持partial_fit方法的线性分类器(例如SGDClassifierPassiveAggressiveClassifier),然后迭代新批次。

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

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

我在2013年3月在PyData上发表的演讲中讨论过这个问题:http://vimeo.com/63269736

tutorial on paralyzing scikit-learn with IPython.parallel中的示例代码取自:https://github.com/ogrisel/parallel_ml_tutorial