使用scikit-learn进行多标签朴素贝叶斯分类

4
我有一个分类问题,大致描述如下:在工作中,我们使用问题跟踪软件进行大部分内部沟通。例如,当你需要另一个团队的帮助时,你可以在这个软件中提交一个问题。每个问题可以分配一个或多个标签。
例如,可能会为新员工的笔记本电脑设置第一次提出问题,标题为“约翰·史密斯的笔记本电脑设置”,并标记为“笔记本电脑问题”和“新员工入职”。因此,对于给定的问题,可能有多个标签。
我正在尝试构建一个分类器,它可以接受一个问题的标题,并提供一个建议标签列表。我的主管要求我使用朴素贝叶斯算法来完成这项任务,所以这就是我正在尝试的。我正在使用scikit-learn。
首先,按照scikit-learn文档(http://scikit-learn.org/stable/modules/multiclass.html)中的描述,将其描述为“多标签”分类任务是否准确?这就是我认为的,但我不太理解“多输出-多类别分类”的描述,因此我无法排除它。再次强调,我要为每个样本预测一个或多个类别。
其次,看起来Naive-Bayes(至少在scikit-learn中)并不支持多标签。由于我现在被迫使用Naive-Bayes,所以我想我可以使用以下方法来创建自己的多标签分类器。这种方法是否合理?
  • 为每个类训练一个Naive-Bayes二进制分类器(将训练数据转换为每个样本,如果该样本在其各种类别中具有该类,则标签仅为1,否则为0)。
  • 然后,当我需要对样本进行预测时,我将使用每个二进制分类器进行预测,并且我的整体预测将是其二进制分类器预测出的标签。
最后,您能想到更好的方法吗?我计划的巨大缺点是由于大约有2,000个标签,我需要创建2,000个分类器。这可能并不完全禁止,但也不是理想的。Naive-bayes确实支持多类分类,因此我想知道是否有某种方式可以在单个分类器上“黑客攻击”它(通过查看每个类别生成的概率,如果存在的话)。

1
你应该使用多标签分类。在多输出-多类任务中,分类器必须从不同的输出任务中进行预测,因此我认为这与你的情况不符。无论如何,目前scikit还不支持它。 - Vivek Kumar
1个回答

3
你提出的方法是有效的;实际上,它是针对多标签分类问题推广的一对多方法,也被称为二元相关性方法。由于你已经在使用 scikit-learn,所以你想要的功能已经在 sklearn.multiclass.OneVsRestClassifier module 中实现了。
唯一的要求是将标签格式化为适当形状的数组[n_samples, n_classes],但这也可以通过 scikit-learn 的标签编码器轻松完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接