如何改善朴素贝叶斯的特征选择?

时间:2013-12-15 22:02:55

标签: java machine-learning

我正在研究需要分类为5类的几千份文件。我正在使用朴素贝叶斯分类器。当我在一些示例邮件上测试时,它工作正常,但是当我实际将它应用于原始数据集时,由于功能数量越来越多,计算变得非常复杂。在某一点上,这些值非常小,几乎为零。所以我的问题是如何避免获得非常小的值以及如何改进特征选择的问题?

3 个答案:

答案 0 :(得分:2)

我们还观察到,当使用大量特征时,朴素贝叶斯倾向于给出较差的概率估计。所以功能选择确实是一个好主意。另外,特别是如果您的功能集非常大,那么查看功能选择总是一个好主意。如果做得好,它可以提高学习模型的泛化能力。

有多种方法可以为Naive Bayes执行特征选择:

  • 第一步通常用于计算每个要素的信息增益或增益比(见Weka),并按这些值进行排名。此第一次排名评估有助于确定最相关的功能和可以删除的功能。这种方法的优点是,即使在大型数据集上也能非常快速地工作。另一方面,它没有考虑功能可能相关的事实。
  • 尝试Weka的Cfs评估(与BestFirst-Search配合得很好)。它通过特征与类变量(与信息增益相关)和特征间相关性的相关性来计算子集的价值。由于您需要搜索最佳功能集,因此这种方法要贵得多。但是,它可以帮助显着减少功能的数量。对我们来说,它有助于将功能数量从30,000减少到50。
  • 另一种方法是使用PCA(主成分分析)。使用生成的原始分量向量作为要素时,可以仅选择解释数据集中主要方差的那些向量。使用这种方法,您实际上仍然需要为方法注入所有特征,但Naive Bayes具有较少的特征来处理,因此可以提供更好的概率估计。

显然,有更多方法可以执行特征选择,例如使用朴素贝叶斯分类器来评估不同的特征集。但是,在大规模数据集的背景下,我们发现这样的方法太慢了。

以上所有方法均可在Weka ML库中找到。请确保在选择功能时,只需考虑您的训练数据即可。您永远不应该使用部分测试数据进行特征选择。

答案 1 :(得分:1)

只是为了避免接近零的值的特征选择是不必要的 - 如果你的朴素贝叶斯分类器在日志空间中工作,那么\ prod_i p(f_i | c_j)变为\ sum_i log p(f_i | c_j),它赢了' t下溢。您可以通过以下方式计算后验概率:

p(c_j | f)= exp([log p(c_j)+ log p(f | c_j)] - sum_j'[log p(c_j')+ log p(f | c_j')])

至于是否出于其他原因需要进行特征选择......根据问题的不同,它可以是。维度降低通常更适用于文档分类,因为它可以发现类似/同义词。但最终你必须实现它们才能看到---首先尝试LSA / PCA,因为它们是最简单的。如果你有足够的数据,你可以直接使用Naive Bayes并直接进行多层神经网络(你将得到非线性和降低维度,直接有助于分类任务)。

答案 2 :(得分:0)

Weka通过搜索数据中所有可能的特征组合来支持特征选择,以找到最适合预测的子集(基于得分和排名)。查看example code以获取参考。