大型数据集的多标签分类
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
方法的线性分类器(例如SGDClassifier
或PassiveAggressiveClassifier
),然后迭代新批次。
您可以开始在保留的验证集(例如 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 并行化来实现多线程。
或者,将您的数据分割成更小的数据集,在每个数据集上训练一个分类器,将其保存到磁盘,然后从这些分类器构建一个集成分类器。
【讨论】:
以上是关于大型数据集的多标签分类的主要内容,如果未能解决你的问题,请参考以下文章