提高朴素贝叶斯分类器准确性的方法?

时间:2010-08-13 03:06:00

标签: machine-learning naivebayes

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

我尝试用NB实现AdaBoost,但它似乎没有给出明显更好的结果(文献似乎对此有所分歧,有些论文称AdaBoost与NB没有给出更好的结果,其他人则这样做)。你知道NB的任何其他扩展可能会提供更好的准确性吗?

6 个答案:

答案 0 :(得分:100)

根据我的经验,经过适当训练的Naive Bayes分类器通常非常准确(并且训练速度非常快 - 明显快于我曾经使用过的任何分类器构建器)。

因此,当您想要改进分类器预测时,您可以查看以下几个位置:

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

  • 应用某种分类器组合技术(例如, 集结,提升,装袋);或者你可以

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

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

<强>予。数据解析(预处理)

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

  • 阻止:手动还是使用词干库?流行的开源软件是Porter,Lancaster和Snowball。因此对于 例如,如果你有术语程序员,程序,编程, 在给定的数据点中编程,一个词干分析器将它们减少到a 单个词干(可能是程序)所以您的术语向量为该数据 对于要素程序,point的值为4,即 可能是你想要的。

  • 同义词发现:与词干相同的想法 - 将相关单词折叠成单个词;所以同义词查找器可以识别开发人员,程序员, 编码员和软件工程师将他们整理成一个单词

  • 中性词:各类频率相近的词语功能不佳


<强> II。特征选择

考虑NBC的典型用例:过滤垃圾邮件;您可以快速查看它是如何失败的,并且您可以快速了解如何改进它。例如,高于平均水平的垃圾邮件过滤器具有细微差别的功能,例如:所有大写字词的频率,标题中单词的频率以及标题中感叹号的出现。此外,最佳功能通常不是单个单词,而是例如单词对或更大的单词组

<强> III。特定的分类器优化

而不是30个类使用'one-against-many'方案 - 换句话说,你从一个两级分类器(A类和'all else')开始,然后结果在'all else'类中返回算法以分类为B类和'all else'等。

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

答案 1 :(得分:4)

我建议在this中使用 SGDClassifier ,并根据正则化强度进行调整。

同时尝试通过调整TFIFVectorizer的参数来调整您使用的TFIDF中的公式。

  • 我经常看到,对于文本分类问题, SVM或Logistic Regressioin 在训练时,一对一优于NB。正如您在this nice article by Stanford people中看到的更长文档,SVM优于NB。使用SVM和NB( NBSVM )组合的论文代码为here

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

  • 使用l2或l1标准化(Tfidfvectorization中的默认值)对样本进行标准化,因为它可以补偿不同的文档长度。

  • 多层感知器,通常比NB或SVM获得更好的结果,因为引入的非线性是许多文本分类问题所固有的。我使用Theano / Lasagne实现了一个高度并行的,易于使用和可下载的here

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

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

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

  • 考虑使用文档的长度作为功能(例如,字数或字符数)。

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

  • 最近 Facebook 发布了他们的FastText classification code,它在很多任务中都表现得很好,请务必尝试。

答案 2 :(得分:0)

使用拉普拉斯校正和AdaBoost。

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

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

答案 3 :(得分:0)

针对一般情况改进了朴素贝叶斯分类器

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

由于我们通过乘以概率来计算概率,因此将概率空间更改为对数概率空间,结果将非常小。当我们更改为对数概率特征时,我们可以解决运行不足问题。 Formula of predicted y

  1. 删除相关功能。

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

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

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

  1. 检查零频错误

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

以下文章对此进行了详细描述 请参考以下帖子。

  1. machinelearningmastery site post
  2. Analyticvidhya site post

答案 4 :(得分:-1)

保持n尺寸小也使NB得到高精度的结果。并且在核心,随着n尺寸的增加,其精度降低,

答案 5 :(得分:-3)

选择它们之间相关性较低的要素。并尝试一次使用不同的功能组合。