可扩展或在线离核多标签分类器

在过去的2-3周里,我一直在为这个问题绞尽脑汁。我有一个多标签(不是多类别)问题,每个样本可以属于多个标签。

我有大约450万份文本文档作为训练数据,大约100万份作为测试数据。标签大约有3.5万个。

我使用的是scikit-learn。之前我使用TfidfVectorizer进行特征提取,但它完全无法扩展,现在我使用HashVectorizer,情况有所改善,但在文档数量如此之多的情况下,它的扩展性仍然有限。

vect = HashingVectorizer(strip_accents='ascii', analyzer='word', stop_words='english', n_features=(2 ** 10))

SKlearn提供了一个OneVsRestClassifier,我可以将任何估算器输入其中。对于多标签问题,我发现只有LinearSVC和SGDClassifier能够正常工作。根据我的基准测试,SGD在内存和时间上都优于LinearSVC。所以,我有类似这样的代码

clf = OneVsRestClassifier(SGDClassifier(loss='log', penalty='l2', n_jobs=-1), n_jobs=-1)

但这存在一些严重的问题:

  1. OneVsRest没有partial_fit方法,这使得离核学习变得不可能。有没有替代方案?
  2. HashingVectorizer/Tfidf都只能在单核上运行,并且没有n_jobs参数。哈希文档花费的时间太长。有没有替代方案/建议?另外,n_features的值是否正确?
  3. 我在100万份文档上进行了测试。哈希过程需要15分钟,当执行clf.fit(X, y)时,我收到了MemoryError,因为OvR内部使用了LabelBinarizer,它试图分配一个维度为(y x classes)的矩阵,这几乎是不可能分配的。我应该怎么办?
  4. 有没有其他库提供可靠且可扩展的多标签算法?我知道genism和mahout,但它们都没有针对多标签情况的解决方案?

回答:

我会手动处理多标签部分。OneVsRestClassifier无论如何都将它们视为独立问题。你可以创建n_labels个分类器,然后对它们调用partial_fit。如果你只想哈希一次(我建议这样做),你就不能使用管道。至于如何加速哈希向量化,你得问@Larsmans和@ogrisel才行;)

在OneVsRestClassifier上添加partial_fit会是一个不错的补充,实际上我看不出有什么特别的问题。你也可以尝试自己实现并发送一个PR。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注