使用朴素贝叶斯和 R 进行多类分类

Multiclass classification with Naive Bayes and R

所以我正在尝试 class使用朴素贝叶斯根据其文本对文档进行验证。每个文档可能属于 1 到 n 个类别(将其视为博客中的标签 post)。

我目前的方法是为 R 提供如下所示的 csv

+-------------------------+---------+-------+-------+
|    TEXT TO CLASSIFY     | Tag 1   | Tag 2 | Tag 3 |
+-------------------------+---------+-------+-------+
| Some text goes here     | Yes     | No    | No    |
+-------------------------+---------+-------+-------+
| Some other text here    | No      | Yes   | Yes   |
+-------------------------+---------+-------+-------+
| More text goes here     | Yes     | No    | Yes   |
+-------------------------+---------+-------+-------+

当然,期望的行为是让输入看起来像

Some new text to classify

输出类似

+------+------+-------+
| Tag 1| Tag 2| Tag 3 |
+------+------+-------+
| 0.12 | 0.75 | 0.65  |
+------+------+-------+

然后根据一定的阈值,判断给定的文本是否属于标签1、2、3。

现在的问题是,在我找到的教程中,看起来输入应该更像

+--------------------------+---------+
|    TEXT TO CLASSIFY      | Class   |
+--------------------------+---------+
| Some other text here     | No      |
+--------------------------+---------+
| Some other text here     | Yes     |
+--------------------------+---------+
| Some other text here     | Yes     |
+--------------------------+---------+

也就是说,每个文本一个行 class...然后使用它,我可以训练朴素贝叶斯,然后使用一对一来确定哪些文本属于哪些标签。问题是,我可以用更优雅的方式来做到这一点吗(也就是说,训练数据看起来像我提到的第一个例子)?

我找到的一个例子是 http://blog.thedigitalgroup.com/rajendras/2015/05/28/supervised-learning-for-text-classification/

概念上有两种方法。

  1. 您将标签合并为组合标签。然后你会得到联合概率。主要缺点是组合爆炸,这意味着您还需要更多的训练数据
  2. 您为每个标签构建一个单独的 NB 模型。

与概率建模一样,问题是您是否假设您的标签是独立的。本着朴素贝叶斯的精神,独立性假设是很自然的。在那种情况下 2. 将是要走的路。如果独立性假设不合理并且您害怕组合爆炸,则可以使用标准贝叶斯网络。如果您保留某些假设,您的表现将不会受到影响。

但是,您也可以采用混合方法。

  1. 您可以使用分层朴素贝叶斯模型。如果标签中有一些逻辑结构,您可以为 类 引入一个父变量。基本上,如果两个标签同时出现,您就有一个值 tag1/tag2。
  2. 基本思想可以扩展到你不观察的潜在变量。这可以使用 EM 方案进行训练。这会稍微影响您的训练表现,因为您需要 运行 训练,但多次迭代可能会给您最好的结果。

http://link.springer.com/article/10.1007%2Fs10994-006-6136-2#/page-1