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

我用一个朴素贝叶斯分类器把几千份文件分成30个不同的类别。我已经实现了一个朴素贝叶斯分类器,通过一些特征选择(主要是过滤无用的词) ,我已经得到了大约30% 的测试准确率和45% 的训练准确率。这比随机选择要好得多,但我希望它更好。

我曾经尝试用 NB 实现 AdaBoost,但它似乎并没有给出明显更好的结果(文献似乎在这一点上存在分歧,一些论文说用 NB 实现 AdaBoost 并没有给出更好的结果,其他论文却给出了更好的结果)。你知道 NB 还有什么其他的扩展可能提供更好的精度吗?

53647 次浏览

根据我的经验,经过适当训练的朴素贝叶斯分类器通常是惊人的准确(而且训练起来非常快——明显比我曾经使用过的任何分类器构建器都要快)。

所以当你想要改进分类器预测的时候,你可以从以下几个方面着手:

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

  • 应用某种 分类器组合技术分类器组合技术(例如, 或者你可以

  • 看看提供给分类器的 数据要么添加更多数据, 改进您的基本解析,或者改进您从中选择的特性 数据

W/r/t 朴素的贝叶斯分类器,参数调优是有限的; 我建议将重点放在数据上——即,预处理的质量和特性选择。

数据解析(预处理)

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

  • 词干提取 : 是手动还是使用词干提取库? 流行的开放源码库是 Porter、 Lancaster 和 Snowball 例如,如果您有 < em > 程序员、程序员、编程员、, 在一个给定的数据点中,一个词干分析器将它们减少到一个 单个茎(可能是 程序) ,所以你的术语矢量的数据 点将有一个值为4的功能程序,这是 可能是你想要的

  • 同义词查找 : 与词干分析相同的想法——将相关的单词折叠成一个单词; 因此,同义词查找器可以识别开发人员、程序员、, 编码人员和软件工程师,并将他们卷成一个术语

  • 中性词 : 在不同类别中频率相似的词会造成不好的特征


二、特征选择

考虑一个全国广播公司的原型用例: 过滤垃圾邮件; 您可以很快看到它是如何失败的,同样也可以很快看到如何改进它。例如,高于平均水平的垃圾邮件过滤器有一些细微的特征,比如: 全部大写字母的单词频率、标题中单词的频率以及标题中出现叹号的频率。此外,最好的特征通常不是单个的单词,而是成对的单词或者更大的单词组。< br > < br >

特定分类器的优化

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

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

保持 n 的尺寸小也使 NB 给出高精度的结果。在核心,随着 n 的大小增加其精度下降,

选择它们之间相关性较小的特征,并尝试一次使用不同的特征组合。

我建议使用 分类器作为在 这个和调整它的规则化强度方面。

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

  • 我通常看到,在文本分类问题 支持向量机或逻辑回归时,训练一对一优于 NB。正如您在 这篇斯坦福人写的好文章中看到的,对于较长的文档,SVM 的性能优于 NB。这篇论文的代码是 给你,它使用了 SVM 和 NB (NBSVM)的结合。

  • 其次,调整 TFIDF 公式(例如,次线性 tf,light _ idf)。

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

  • 由于许多文本分类问题所固有的非线性多层感知机,因此通常比 NB 或 SVM 得到更好的结果。我已经实现了一个高度并行的使用 Theano/Lasagne,这是很容易使用和下载 给你

  • 尝试使用 调整 l1/l2/elasticnet 正则化,它在新广义系统分类器/支持向量机/Logit模型方面有很大的不同。

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

  • 如果你的文档有结构(例如有 头衔) ,考虑对不同的部分使用不同的特性。例如,如果 word1出现在文档的标题中,则将 title _ word1添加到文档中。

  • 考虑使用 文件的长度作为一个特性(例如单词或字符的数量)。

  • 考虑对文档使用 元信息(例如,创建时间、作者姓名、文档的 url 等)。

  • 最近 脸书发布了他们的 快速文本分类代码,它在很多任务中都表现得很好,一定要尝试一下。

与 AdaBoost 一起使用 Laplacian 校正。

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

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

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

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

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

  1. 删除相关特征。

朴素拜斯的工作基于独立性的假设,当我们有一个特征之间的相关性,这意味着一个特征依赖于其他人,那么我们的假设将失败。 关于相关性的更多信息可以在这里找到

  1. 使用足够的数据而不是巨大的数据

朴素贝叶斯比 Logit模型需要更少的数据,因为它只需要数据来理解每个属性与输出变量之间的概率关系,而不是相互作用。

  1. 检查零频率误差

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

不仅如此,下面的文章对此进行了很好的描述 请参阅以下文章。

  1. 机器学习精通站点职位
  2. Analyticvidhya 网站的帖子