如何提高朴素贝叶斯分类器的准确性?


69

我正在使用朴素贝叶斯分类器将数千个文档分类为30个不同的类别。我已经实现了朴素贝叶斯分类器,并且通过一些功能选择(主要是过滤无用的单词),我获得了大约30%的测试准确度和45%的训练准确度。这明显好于随机,但我希望它会更好。

我已经尝试过用NB实现AdaBoost,但是它似乎并没有给出明显更好的结果(关于这方面的文献似乎有些分歧,有些论文说使用NB的AdaBoost不会给出更好的结果,另一些则给出了)。您是否知道对NB的其他扩展可能会带来更高的准确性?


使用贝叶斯网络分类器而不是朴素贝叶斯分类器。
乔治,2010年

Answers:


103

以我的经验,训练有素的朴素贝叶斯分类器通常令人惊讶地准确(且训练速度非常快,比我曾经使用的任何分类器构建器都要快)。

因此,当您要改进分类器预测时,可以在几个地方查看:

  • 调整您的分类器(调整分类器的可调参数);

  • 应用某种分类器组合技术(例如,合奏,增强,装袋);或者你可以

  • 查看提供给分类器的数据-添加更多数据,改善基本分析或优化从数据中选择的功能。

w / r / t天真贝叶斯分类器,参数调整有限;我建议重点关注您的数据,即预处理的质量和功能选择。

I.数据解析(预处理)

我假设您的原始数据类似于每个数据点的原始文本字符串,通过一系列处理步骤,您可以将每个字符串转换为每个数据点的结构化矢量(一维数组),以使每个偏移量对应一个特征(通常是一个字),并且该偏移量中的值对应于频率。

  • 词干:手动还是使用词干库?最受欢迎的开源软件有Porter,Lancaster和Snowball。因此,举例来说,如果您在给定的数据点中有术语“程序员”,“程序”,“编程”,“编程器”,则词干分析器会将它们简化为单个词干(可能是program),因此该数据点的术语向量的值为功能程序,这可能是您想要的。

  • 同义词发现:与词干相同的想法-将相关单词折叠成一个单词;因此同义词查找器可以识别开发人员,程序员,编码人员和软件工程师,并将其合并为一个术语

  • 中性字词:跨班级出现频率相似的字词的功能较差


二。功能选择

考虑NBC的典型用例:过滤垃圾邮件;您可以快速看到它如何失败,也可以很快看到如何改进它。例如,高于平均水平的垃圾邮件过滤器具有细微的特征,例如:所有大写字母的单词出现频率,标题中单词的出现频率以及标题中出现感叹号。另外,最佳特征通常不是单个单词,而是例如成对的单词或较大的单词组

三,特定分类器优化

而不是使用“一对多”计划而不是30个类-换句话说,您从一个两类分类器(A类和“所有其他”)开始,然后将“所有其他”类中的结果返回到分类为B类和“所有其他”等的算法。

费舍尔方法(可能是最优化朴素贝叶斯分类器的最常用方法。)对我而言,我认为费舍尔将输入概率归一化(更正确地说是标准化)NBC使用特征概率构建“整个文档”概率。Fisher方法为文档的每个特征计算类别的概率,然后组合这些特征概率,并将该组合的概率与特征的随机集合的概率进行比较。


谢谢-这正是我想要的。
10年

1
我认为您应该引用托比·塞加兰(Toby Segaran)的“集体智慧”书。描述费舍尔方法的部分几乎全部从此处引用。
2014年

你好道格,你能帮忙用Java查找同义词吗?
Divyang Shah 2015年

Devavrat我用了你的话。错误:线程“ main”中的异常edu.smu.tspell.wordnet.impl.file.RetrievalException:打开索引文件时出错:./index.sense(无此类文件或目录)
Divyang Shah

4
实际上,“集合,增强,打包”是无济于事的,因为它们的目的是减少差异。朴素贝叶斯(Naive Bayes)没有可减少的方差。这些是应用于神经网络的好方法。
film42 2015年

6

我建议像这样使用SGDClassifier并根据正则化强度对其进行调整。

也可以尝试通过调整TFIFVectorizer的参数来调整正在使用的TFIDF中的公式。

  • 我通常会看到针对文本分类问题的SVM或Logistic回归训练得比所有人都胜过NB。正如您在斯坦福大学的一篇不错的文章中所见,SVM的性能优于NB。针对使用SVM和NB(的组合的纸代码NBSVM)是这里

  • 其次,调整您的TFIDF公式(例如,亚线性tf,smooth_idf)。

  • 规范化与L2或L1正常化(默认Tfidfvectorization)的样品,因为它弥补了不同的文档的长度。

  • 多层Perceptron通常会比NB或SVM获得更好的结果,因为引入了许多文本分类问题所固有的非线性。我使用Theano / Lasagne实现了一个高度并行的应用程序,可在此处轻松使用和下载。

  • 尝试调整l1 / l2 / elasticnet正则化。它在SGDClassifier / SVM / Logistic回归中具有巨大的差异。

  • 尝试使用可在tfidfvectorizer中配置的n-gram

  • 如果您的文档具有结构(例如,标题),请考虑对不同部分使用不同的功能。例如,如果word1出现在文档标题中,则将title_word1添加到文档中。

  • 考虑使用文档长度作为特征(例如,单词或字符的数量)。

  • 考虑使用有关文档的元信息(例如,创建时间,作者姓名,文档的网址等)。

  • 最近,Facebook发布了他们的FastText分类代码,该代码在许多任务中都表现出色,请务必尝试一下。


0

将Laplacian校正与AdaBoost一起使用。

在AdaBoost中,首先为训练数据集中的每个数据元组分配一个权重。使用该init_weights方法设置初始权重,该方法将每个权重初始化为1/d,其中d是训练数据集的大小。

然后,generate_classifiers调用一个运行k时间的方法,创建kNaïveBayes分类器的实例。然后对这些分类器加权,并在每个分类器上运行测试数据。分类器的加权“票数”之和构成最终分类。


0

改进一般情况下的朴素贝叶斯分类器

  1. 将概率的对数作为输入特征

因为我们通过乘以概率来计算概率,所以将概率空间更改为对数概率空间,结果将非常小。当我们更改为对数概率特征时,我们可以解决运行不足问题。 预测y的公式

  1. 删除相关功能。

当我们在要素之间建立关联时,朴素的Byes会基于独立性的假设进行工作,这意味着一个要素依赖于另一个要素,那么我们的假设就会失败。有关关联的更多信息,请参见此处

  1. 处理足够的数据而不是海量数据

朴素贝叶斯需要的数据少于逻辑回归,因为它仅需要数据来了解每个属性与输出变量(而不是交互作用)隔离的概率关系。

  1. 检查零频误差

如果测试数据集的频率为零,则应用平滑技术“拉普拉斯校正”来预测测试数据集的类别。

以下帖子中对此进行了详细说明,请参阅以下帖子。

  1. 机器学习掌握站点帖子
  2. Analyticvidhya网站发布

-2

保持n尺寸较小也可使NB获得高精度结果。从本质上讲,随着n大小的增加,其精度会降低,


你能解释一下这个建议吗?或添加链接以提供良好的解释?
艾尔

TBH我看到了。为什么会这样呢?
Volatil3'9

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.