我使用朴素贝叶斯分类器将数千份文档分类到30个不同的类别中。我已经实现了一个朴素贝叶斯分类器,并通过一些特征选择(主要是过滤无用词),在测试集上获得了约30%的准确率,训练集上达到了45%的准确率。这比随机分类要好很多,但我希望能进一步提高准确性。
我尝试过将AdaBoost与NB结合使用,但似乎没有显著改善结果(文献对此意见不一,有些论文称AdaBoost与NB结合使用没有改善效果,有些则认为有)。您知道有哪些其他对NB的扩展可能提高准确性吗?
回答:
根据我的经验,经过适当训练的朴素贝叶斯分类器通常具有惊人的准确性(而且训练速度非常快——明显比我使用过的任何分类器构建工具都要快)。
因此,当您想提高分类器的预测性能时,可以从几个方面入手:
-
调整分类器(调整分类器的可调参数);
-
应用某种分类器组合技术(例如,集成、提升、装袋);或者您可以
-
查看输入到分类器的数据——要么增加更多数据,改进基本解析,或者优化从数据中选择的特征。
关于朴素贝叶斯分类器,参数调整的空间有限;我建议您关注数据——即预处理的质量和特征选择。
I. 数据解析(预处理)
我假设您的原始数据是每个数据点的原始文本字符串,通过一系列处理步骤,您将每个字符串转换为每个数据点的结构化向量(一维数组),每个偏移量对应一个特征(通常是一个词),该偏移量的值对应频率。
-
词干提取:手动进行还是使用词干提取库?流行的开源库有Porter、Lancaster和Snowball。例如,如果您在一个数据点中有术语程序员、程序、编程、已编程,词干提取器会将它们简化为一个词干(可能是程序),这样该数据点的术语向量中,程序特征的值将为4,这可能是您想要的效果。
-
同义词查找:与词干提取类似的想法——将相关词汇折叠成一个词;因此,同义词查找器可以识别开发者、程序员、编码员和软件工程师,并将它们归为一个术语
-
中性词:在各类别中频率相似的词汇是较差的特征
II. 特征选择
考虑NBC的典型用例:过滤垃圾邮件;您可以很快看到它的失败之处,也能同样迅速地看到如何改进。例如,高于平均水平的垃圾邮件过滤器具有细微的特征,如:全大写词的频率、标题中词的频率,以及标题中感叹号的出现。此外,最佳特征往往不是单个词,而是例如,词对或更大的词组。
III. 特定分类器优化
不要使用30个类别,而是采用“一对多”方案——换句话说,您从一个两类分类器(类别A和“其他所有”)开始,然后将“其他所有”类别的结果返回给算法,进行分类到类别B和“其他所有”,依此类推。
费舍尔方法(可能是优化朴素贝叶斯分类器最常见的方法)。对我来说,我认为费舍尔方法是标准化(更准确地说,是规范化)输入概率。一个NBC使用特征概率来构建“整个文档”的概率。费舍尔方法计算文档的每个特征的类别概率,然后结合这些特征概率,并将该组合概率与一组随机特征的概率进行比较。