我正在使用Naive Bayes分类器将数千个文档分类为30个不同的类别。我已经实现了Naive Bayes分类器,并且通过一些特征选择(主要是过滤无用的单词),我获得了大约30%的测试精度,45%的训练准确度。这明显优于随机,但我希望它更好。
我尝试用NB实现AdaBoost,但它似乎没有给出明显更好的结果(文献似乎对此有所分歧,有些论文称AdaBoost与NB没有给出更好的结果,其他人则这样做)。你知道NB的任何其他扩展可能会提供更好的准确性吗?
答案 0 :(得分:100)
根据我的经验,经过适当训练的Naive Bayes分类器通常非常准确(并且训练速度非常快 - 明显快于我曾经使用过的任何分类器构建器)。
因此,当您想要改进分类器预测时,您可以查看以下几个位置:
调整分类器(调整分类器的可调参数);
应用某种分类器组合技术(例如, 集结,提升,装袋);或者你可以
查看提供给分类器的数据 - 添加更多数据, 改进基本解析,或优化您选择的功能 数据。
<强>予。数据解析(预处理)
我假设您的原始数据类似于每个数据点的一串原始文本,通过一系列处理步骤,您将每个字符串转换为每个数据点的结构化矢量(1D数组),使得每个偏移对应于一个特征(通常是一个单词),该偏移中的值对应于频率。
阻止:手动还是使用词干库?流行的开源软件是Porter,Lancaster和Snowball。因此对于 例如,如果你有术语程序员,程序,编程, 在给定的数据点中编程,一个词干分析器将它们减少到a 单个词干(可能是程序)所以您的术语向量为该数据 对于要素程序,point的值为4,即 可能是你想要的。
同义词发现:与词干相同的想法 - 将相关单词折叠成单个词;所以同义词查找器可以识别开发人员,程序员, 编码员和软件工程师将他们整理成一个单词
中性词:各类频率相近的词语功能不佳
<强> II。特征选择
考虑NBC的典型用例:过滤垃圾邮件;您可以快速查看它是如何失败的,并且您可以快速了解如何改进它。例如,高于平均水平的垃圾邮件过滤器具有细微差别的功能,例如:所有大写字词的频率,标题中单词的频率以及标题中感叹号的出现。此外,最佳功能通常不是单个单词,而是例如单词对或更大的单词组。
<强> III。特定的分类器优化
而不是30个类使用'one-against-many'方案 - 换句话说,你从一个两级分类器(A类和'all else')开始,然后结果在'all else'类中返回算法以分类为B类和'all else'等。
Fisher方法(可能是优化朴素贝叶斯分类器的最常用方法。)对我来说, 我认为Fisher为规范化(更准确地说,标准化)输入概率NBC使用特征概率来构建“整个文档”概率。 Fisher方法计算文档的每个特征的类别的概率,然后组合这些特征概率,并将该组合概率与随机特征集的概率进行比较。
答案 1 :(得分:4)
我建议在this中使用 SGDClassifier ,并根据正则化强度进行调整。
同时尝试通过调整TFIFVectorizer的参数来调整您使用的TFIDF中的公式。
我经常看到,对于文本分类问题, SVM或Logistic Regressioin 在训练时,一对一优于NB。正如您在this nice article by Stanford people中看到的更长文档,SVM优于NB。使用SVM和NB( NBSVM )组合的论文代码为here。
其次,调整您的TFIDF公式(例如,次线性tf,smooth_idf)。
使用l2或l1标准化(Tfidfvectorization中的默认值)对样本进行标准化,因为它可以补偿不同的文档长度。
多层感知器,通常比NB或SVM获得更好的结果,因为引入的非线性是许多文本分类问题所固有的。我使用Theano / Lasagne实现了一个高度并行的,易于使用和可下载的here。
尝试调整l1 / l2 / elasticnet正则化。它在SGDClassifier / SVM / Logistic回归中产生了巨大的差异。
尝试使用可在tfidfvectorizer中配置的 n-gram 。
如果您的文档具有结构(例如标题),请考虑为不同的部分使用不同的功能。例如,如果word1出现在文档的标题中,则将title_word1添加到文档中。
考虑使用文档的长度作为功能(例如,字数或字符数)。
考虑使用元信息关于文档(例如创建时间,作者姓名,文档网址等)。
最近 Facebook 发布了他们的FastText classification code,它在很多任务中都表现得很好,请务必尝试。
答案 2 :(得分:0)
使用拉普拉斯校正和AdaBoost。
在AdaBoost中,首先为训练数据集中的每个数据元组分配权重。使用init_weights
方法设置初始权重,该方法将每个权重初始化为1/d
,其中d
是训练数据集的大小。
然后,调用generate_classifiers
方法,该方法运行k
次,创建NaïveBayes分类器的k
个实例。然后对这些分类器进行加权,并在每个分类器上运行测试数据。分类器的加权“投票”总和构成最终分类。
答案 3 :(得分:0)
由于我们通过乘以概率来计算概率,因此将概率空间更改为对数概率空间,结果将非常小。当我们更改为对数概率特征时,我们可以解决运行不足问题。
当我们在要素之间具有相关性时,朴素的Byes会基于独立性的假设进行工作,这意味着一个要素依赖于其他要素,那么我们的假设将失败。 有关关联的更多信息,请参见here
朴素贝叶斯需要的数据少于逻辑回归,因为它仅需要数据来了解每个属性与输出变量(而不是交互作用)的概率关系。
如果测试数据集的频率为零,则应用平滑技术“拉普拉斯校正”来预测测试数据集的类别。
以下文章对此进行了详细描述 请参考以下帖子。
答案 4 :(得分:-1)
答案 5 :(得分:-3)
选择它们之间相关性较低的要素。并尝试一次使用不同的功能组合。