首页 文章

提高朴素贝叶斯分类器准确性的方法?

提问于
浏览
59

我正在使用朴素贝叶斯分类器将数千个文档分类为30个不同的类别 . 我已经实现了朴素贝叶斯分类器,并且通过一些特征选择(主要是过滤无用的词),我获得了大约30%的测试精度,45%的训练准确度 . 这明显优于随机,但我希望它更好 .

我已经尝试用NB实现AdaBoost,但它似乎没有给出明显更好的结果(文献似乎对此有所分歧,有些论文称AdaBoost与NB没有给出更好的结果,其他人这样做) . 你知道NB的任何其他扩展可能会提供更好的准确性吗?

5 回答

  • 4

    选择它们之间相关性较低的要素 . 并尝试一次使用不同的功能组合 .

  • 95

    使用拉普拉斯校正和AdaBoost .

    在AdaBoost中,首先为训练数据集中的每个数据元组分配权重 . 使用 init_weights 方法设置初始权重,该方法将每个权重初始化为 1/d ,其中 d 是训练数据集的大小 .

    然后,调用 generate_classifiers 方法,该方法运行 k 次,创建NaïveBayes分类器的 k 实例 . 然后对这些分类器进行加权,并在每个分类器上运行测试数据 . 分类器的加权"votes"的总和构成最终分类 .

  • -3

    保持n尺寸小也使NB得到高精度的结果 . 而在核心,随着n尺寸的增加,其精度降低,

  • 0

    根据我的经验,经过适当训练的Naive Bayes分类器通常非常准确(而且训练速度非常快 - 明显快于我曾经使用过的任何分类器 - 建造者) .

    因此,当您想要改进分类器预测时,您可以查看以下几个位置:

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

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

    • 查看提供给分类器的数据 - 添加更多数据,改进基本解析或优化从数据中选择的功能 .

    w / r / t朴素贝叶斯分类器,参数调整有限;我建议您专注于您的数据 - 即预处理的质量和功能选择 .

    I. Data Parsing (pre-processing)

    我假设您的原始数据类似于每个数据点的一串原始文本,通过一系列处理步骤,您将每个字符串转换为每个数据点的结构化矢量(1D数组),使每个偏移对应一个特征(通常是一个单词),该偏移中的值对应于频率 .

    • 词干:手动还是使用词干库?流行的开源软件是Porter,Lancaster和Snowball . 因此,例如,如果你有一个程序员,程序,编程,在给定数据点编程的术语,一个词干分析器将它们减少到一个词干(可能是程序),所以你的那个数据点的术语向量的值为4功能程序,这可能是你想要的 .

    • 同义词发现:与词干相同的想法 - 将相关单词折叠成单个词;因此,同义词查找器可以识别开发人员,程序员,编码人员和软件工程师,并将其转换为单个术语

    • 中性词:跨类具有相似频率的词会产生不良特征

    II. Feature Selection

    考虑NBC的典型用例:过滤垃圾邮件;您可以快速查看它是如何失败的,并且您可以快速了解如何改进它 . 例如,高于平均水平的垃圾邮件过滤器具有细微差别的功能,例如:所有大写字词的频率, Headers 中单词的频率以及 Headers 中感叹号的出现 . 另外,最佳特征通常不是单个单词,而是例如单词对或更大的单词组 .

    III. Specific Classifier Optimizations

    而不是30个类使用 'one-against-many' scheme - 换句话说,您从一个两类分类器(A类和'all else')开始,然后将'all else'类中的结果返回到算法以分类为B类和'all else'等 .

    The Fisher Method (可能是优化朴素贝叶斯分类器的最常用方法 . )对我来说,我认为Fisher正常化(更准确地说,标准化)输入概率NBC使用特征概率来构造'whole-document'概率 . Fisher方法计算文档的每个特征的类别概率,然后组合这些特征概率,并将该组合概率与随机特征集的概率进行比较 .

  • -1

    我建议在this中使用 SGDClassifier 并根据正则化强度进行调整 .

    还尝试通过调整TFIFVectorizer的参数来调整您正在使用的TFIDF中的公式 .

    • 我经常看到,对于文本分类问题 SVM or Logistic Regressioin ,当训练时,一对一优于NB . 正如您在this nice article by Stanford people中可以看到的,对于更长的文档,SVM优于NB . 使用SVM和NB( NBSVM )组合的论文代码是here .

    • 其次,调整您的TFIDF公式(例如,次线性tf,smooth_idf) .

    • Normalize 您的样本具有l2或l1标准化(默认为Tfidfvectorization),因为它可以补偿不同的文档长度 .

    999 Multilayer Perceptron ,通常比NB或SVM获得更好的结果,因为引入了非线性,这是许多文本分类问题所固有的 . 我使用Theano / Lasagne实现了一个高度并行的,易于使用和下载here .

    • 尝试 tune your l1/l2/elasticnet regularization . 它在SGDClassifier / SVM / Logistic回归中产生了巨大的差异 .

    • 尝试使用可在tfidfvectorizer中配置的 n-grams .

    • 如果您的文档具有结构(例如, titles ),请考虑为不同的部分使用不同的功能 . 例如添加如果word1出现在文档的 Headers 中,则为title_word1 .

    • 考虑将 length of the document 用作特征(例如,单词或字符的数量) .

    • 考虑使用 meta information 关于文档(例如创建时间,作者姓名,文档的URL等) .

    • 最近 Facebook 发布了他们的FastText classification code,它在许多任务中都表现得非常好,请务必尝试一下 .

相关问题