我需要提高朴素贝叶斯文本分类的准确性

Posted

技术标签:

【中文标题】我需要提高朴素贝叶斯文本分类的准确性【英文标题】:I need to improve Naive Bayes text classification accuracy 【发布时间】:2017-11-18 14:54:29 【问题描述】:

我正在使用 Ruby 来实现朴素贝叶斯。 我需要将文本分类(我有 4 个不同的类别)。

我尝试以多种方式对其进行优化,但似乎都没有奏效。 我删除了“停用词”,在词中做了词干、参数化等。

我使用 170 个文本数据进行了训练。但是当我尝试预测一个新文本时,结果往往是错误的。 最后所有 4 个类别的概率都非常相似。

我还能做些什么来提高准确性?

代码如下:

require 'nbayes'
require 'csv'
require 'active_support/all'
require 'lingua/stemmer'

def remove_stopwords(list)
  stopwords_array = []

  CSV.foreach("stopwords.csv") do |row|
    stopwords_array << row[0]
  end

  list - stopwords_array
end

def stemmer_array(list)
  stemmer = Lingua::Stemmer.new(:language => "pt")
  list.map |x| stemmer.stem(x)
end

def prepare_string(text)
  list = text.parameterize.split('-')
  list = remove_stopwords(list)
  stemmer_array(list)
end

nbayes = NBayes::Base.new

CSV.foreach("contacts.csv") do |row|
  if row[7] != ":value=>nil, :label=>nil"
    nbayes.train(prepare_string("#row[4] #row[5]"), row[7])
  end
end

new_text = "TEXT TO PREDICT"

result = nbayes.classify(prepare_string(new_text))

puts "Text: #new_text\n\n"

puts "´´´´´´´´´´´´´´´´´´´´´´´"
puts "Prediction: #result.max_class\n\n"
puts "´´´´´´´´´´´´´´´´´´´´´´´"

【问题讨论】:

170 项数据还不够... 就像 Coldspeed 说的那样,170 可能还不够……而且您还没有告诉我们类别是什么……取决于将它们分开的难易程度,任务可能非常困难即使是大型数据集。此外,最后的“相似概率”是没有意义的。通常,朴素贝叶斯将返回所有类别的非常低的分数。 (顺便说一句,它们不是班级概率 - 它们是观察给定班级的文本的概率,这就是分数如此低的原因)。重要的是具有最高值的类别,即:最有可能生成文本的类别。 【参考方案1】:

用于训练文本分类模型的数据集非常少。还要确保检查目标变量的分布。正如你提到的,有 4 个班级确保没有班级不平衡。例如,如果您有 100 个数据点用于单个类,剩余数据点用于 3 个不同的类,在这种情况下,您的模型将给出这种输出(其中所有预测的类都属于 1 个类)。还要绘制一个混淆矩阵,看看你的模型的实际表现如何。

【讨论】:

以上是关于我需要提高朴素贝叶斯文本分类的准确性的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯文本分类在一个类别中失败。为啥? [关闭]

提高准确性朴素贝叶斯分类器

朴素贝叶斯分类——大道至简

朴素贝叶斯分类算法的sklearn实现

朴素贝叶斯-商品评论情感分析

具有 top-k 输出的大规模朴素贝叶斯分类器