在过去的 2-3 周里,我一直在为这个问题绞尽脑汁。我有一个多标签(不是多类)问题,其中每个样本都可以属于多个标签。
我有大约 450 万个文本文档作为训练数据,大约 100 万个作为测试数据。标签约为 35K。
我正在使用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)
但这存在一些严重的问题:
- OneVsRest 没有 partial_fit 方法,这使得核外学习成为不可能。有没有其他选择?
- HashingVectorizer/Tfidf 都在单核上工作并且没有任何 n_jobs 参数。散列文档花费了太多时间。任何替代方案/建议?n_features 的值也正确吗?
- 我测试了 100 万份文档。散列需要 15 分钟,当涉及到 clf.fit(X, y) 时,我收到 MemoryError,因为 OvR 内部使用 LabelBinarizer 并且它试图分配一个几乎不可能分配的维度矩阵(yx 类)。我应该怎么办?
- 还有其他任何具有可靠且可扩展的多标签算法的库吗?我知道 genism 和 mahout,但他们都没有任何多标签情况?