大型数据集的多标签分类

Posted

技术标签:

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

【讨论】:

以上是关于大型数据集的多标签分类的主要内容,如果未能解决你的问题,请参考以下文章

涉及数字范围作为标签的多标签分类

使用 TensorFlow 的多标签文本分类

一个序列的多标签分类,怎么做?

多标签文本分类《基于标签语义注意力的多标签文本分类》

多标签文本分类《基于标签语义注意力的多标签文本分类》

Keras CNN:图像的多标签分类