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

问题描述 投票:63回答:5

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

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

machine-learning naivebayes
5个回答
101
投票

根据我的经验,经过适当训练的朴素贝叶斯分类器通常非常准确(而且训练速度非常快 - 明显快于我曾经使用的任何分类器 - 建造者)。

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

  • 调整分类器(调整分类器的可调参数);
  • 应用某种分类器组合技术(例如,整合,提升,装袋);或者你可以
  • 查看提供给分类器的数据 - 添加更多数据,改进基本解析或优化从数据中选择的功能。

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

I.数据分析(预处理)

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

  • 干预:手动还是使用词干库?流行的开源软件是Porter,Lancaster和Snowball。因此,例如,如果你有一个程序员,程序,编程,在给定数据点编程的术语,一个词干分析器会将它们减少到一个词干(可能是程序),所以你的那个数据点的术语向量的值为4功能程序,这可能是你想要的。
  • 同义词发现:与词干相同的想法 - 将相关词汇折叠成单个词;因此,同义词查找器可以识别开发人员,程序员,编码人员和软件工程师,并将其转换为单个术语
  • 中性词:不同类别频率相似的词会产生不良特征

II。特征选择

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

III。特定的分类器优化

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

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


5
投票

我建议在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添加到文档中。
  • 考虑使用文档的长度作为特征(例如,单词或字符的数量)。
  • 考虑使用关于文档的元信息(例如,创建时间,作者姓名,文档的URL等)。
  • 最近Facebook发布了他们的FastText classification code,它在很多任务中都表现得很好,一定要试一试。

0
投票

使用拉普拉斯校正和AdaBoost。

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

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


-1
投票

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


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.