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

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

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


回答:

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

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

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

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

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

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

I. 数据解析(预处理)

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

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

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

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

II. 特征选择

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

III. 特定分类器优化

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

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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