java - 如何改进朴素贝叶斯的特征选择?

标签 java machine-learning

我正在处理数千份需要分为 5 类的文件。我正在为此使用朴素贝叶斯分类器。当我在一些样本邮件上测试它时它工作正常但是当我实际将它应用到原始数据集时计算变得非常复杂因为有更多的特征。在某一时刻,这些值非常小,几乎为零。所以我的问题是如何避免这个获取非常小的值的问题以及如何改进特征选择?

最佳答案

我们还观察到,朴素贝叶斯在使用大量特征时往往会给出较差的概率估计。所以特征选择在这里确实是个好主意。此外,研究特征选择总是一个好主意,尤其是当你的特征集非常大的时候。如果做得对,它可以提高学习模型的泛化能力。

朴素贝叶斯的特征选择有多种方式:

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

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

Weka ML 库中提供了上述所有方法。还请确保当您选择功能时,您仅通过考虑您的训练数据来做到这一点。您永远不应使用部分测试数据来进行特征选择。

关于java - 如何改进朴素贝叶斯的特征选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20600388/

相关文章:

machine-learning - 带有 HOG 描述符的词袋

java - 如何使用 try 和 catch 验证用户输入?

java 。创建类似于List的新类

machine-learning - 如何让机器学习程序学会如何自行计算平均值

r - R : Error in names(resamples) <- gsub ("^\\.", ""、names(resamples)) 中带有 SVM 的插入符号:尝试在 NULL 上设置属性

machine-learning - Keras:具有一个输入和两个输出的模型,在不同数据上联合训练(半监督学习)

python - 如何从词序中区分句子型和非句子型?

java - Apache Tomcat - 使文件可从 bin 文件夹下载

java - 获取 JVM 上所有 Bootstrap 类的列表?

javax.net.ssl.SSLPeerUnverifiedException : No peer certificate during amazons3 multipart upload