【问题标题】:Multi-label classification for large dataset大型数据集的多标签分类
【发布时间】:2013-12-15 08:57:04
【问题描述】:

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

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

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

【问题讨论】:

  • 尝试使用 partial_fit API 为每个标签训练一个 SGDClassifier。还可以考虑使用HashingVectorizer 而不是count + tf-idf。
  • 是否需要对HashingVectorizer的输出进行缩放或规范化,或者可以直接输入SGDClassifier
  • 您是否考虑过切换到随机森林分类器?它的扩展性比 SVM 好得多。

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


【解决方案1】:

HashingVectorizer 将在您将数据迭代地分块成批处理的 10k 或 100k 文档以适合内存的情况下工作。

然后,您可以将转换后的文档批次传递给支持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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 2017-11-01
      • 2017-11-21
      • 2017-07-22
      • 2017-11-08
      • 2020-10-23
      相关资源
      最近更新 更多