使用朴素贝叶斯和 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/
概念上有两种方法。
- 您将标签合并为组合标签。然后你会得到联合概率。主要缺点是组合爆炸,这意味着您还需要更多的训练数据
- 您为每个标签构建一个单独的 NB 模型。
与概率建模一样,问题是您是否假设您的标签是独立的。本着朴素贝叶斯的精神,独立性假设是很自然的。在那种情况下 2. 将是要走的路。如果独立性假设不合理并且您害怕组合爆炸,则可以使用标准贝叶斯网络。如果您保留某些假设,您的表现将不会受到影响。
但是,您也可以采用混合方法。
- 您可以使用分层朴素贝叶斯模型。如果标签中有一些逻辑结构,您可以为 类 引入一个父变量。基本上,如果两个标签同时出现,您就有一个值 tag1/tag2。
- 基本思想可以扩展到你不观察的潜在变量。这可以使用 EM 方案进行训练。这会稍微影响您的训练表现,因为您需要 运行 训练,但多次迭代可能会给您最好的结果。
http://link.springer.com/article/10.1007%2Fs10994-006-6136-2#/page-1
所以我正在尝试 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/
概念上有两种方法。
- 您将标签合并为组合标签。然后你会得到联合概率。主要缺点是组合爆炸,这意味着您还需要更多的训练数据
- 您为每个标签构建一个单独的 NB 模型。
与概率建模一样,问题是您是否假设您的标签是独立的。本着朴素贝叶斯的精神,独立性假设是很自然的。在那种情况下 2. 将是要走的路。如果独立性假设不合理并且您害怕组合爆炸,则可以使用标准贝叶斯网络。如果您保留某些假设,您的表现将不会受到影响。
但是,您也可以采用混合方法。
- 您可以使用分层朴素贝叶斯模型。如果标签中有一些逻辑结构,您可以为 类 引入一个父变量。基本上,如果两个标签同时出现,您就有一个值 tag1/tag2。
- 基本思想可以扩展到你不观察的潜在变量。这可以使用 EM 方案进行训练。这会稍微影响您的训练表现,因为您需要 运行 训练,但多次迭代可能会给您最好的结果。
http://link.springer.com/article/10.1007%2Fs10994-006-6136-2#/page-1