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

我使用朴素贝叶斯分类器将数千份文档分类到30个不同的类别中。我已经实现了一个朴素贝叶斯分类器,并通过一些特征选择(主要是过滤无用词),在测试集上获得了约30%的准确率,训练集上达到了45%的准确率。这比随机分类要好很多,但我希望能进一步提高准确性。

我尝试过将AdaBoost与NB结合使用,但似乎没有显著改善结果(文献对此意见不一,有些论文称AdaBoost与NB结合使用没有改善效果,有些则认为有)。您知道有哪些其他对NB的扩展可能提高准确性吗?


回答:

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

因此,当您想提高分类器的预测性能时,可以从几个方面入手:

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

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

  • 查看输入到分类器的数据——要么增加更多数据,改进基本解析,或者优化从数据中选择的特征。

关于朴素贝叶斯分类器,参数调整的空间有限;我建议您关注数据——即预处理的质量和特征选择。

I. 数据解析(预处理)

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

  • 词干提取:手动进行还是使用词干提取库?流行的开源库有Porter、Lancaster和Snowball。例如,如果您在一个数据点中有术语程序员、程序、编程、已编程,词干提取器会将它们简化为一个词干(可能是程序),这样该数据点的术语向量中,程序特征的值将为4,这可能是您想要的效果。

  • 同义词查找:与词干提取类似的想法——将相关词汇折叠成一个词;因此,同义词查找器可以识别开发者、程序员、编码员和软件工程师,并将它们归为一个术语

  • 中性词:在各类别中频率相似的词汇是较差的特征

II. 特征选择

考虑NBC的典型用例:过滤垃圾邮件;您可以很快看到它的失败之处,也能同样迅速地看到如何改进。例如,高于平均水平的垃圾邮件过滤器具有细微的特征,如:全大写词的频率、标题中词的频率,以及标题中感叹号的出现。此外,最佳特征往往不是单个词,而是例如,词对或更大的词组

III. 特定分类器优化

不要使用30个类别,而是采用“一对多”方案——换句话说,您从一个两类分类器(类别A和“其他所有”)开始,然后将“其他所有”类别的结果返回给算法,进行分类到类别B和“其他所有”,依此类推。

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

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注