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

Ruby 我需要提高朴素贝叶斯文本分类的准确性,ruby,machine-learning,artificial-intelligence,naivebayes,Ruby,Machine Learning,Artificial Intelligence,Naivebayes,我正在使用Ruby实现朴素贝叶斯。 我需要将文本分类为一个类别(我有4个不同的类别) 我试着用几种方法来优化它,但似乎都不起作用。 我删除了“Stopwords”,在单词中添加了词干分析器、参数化等 我用170个文本数据进行了训练。但是当我试图预测一个新的文本时,结果往往是错误的。 最后,所有4个类别的概率都非常相似 我还能做些什么来提高准确性 代码如下所示: require 'nbayes' require 'csv' require 'active_support/all' require

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

我试着用几种方法来优化它,但似乎都不起作用。 我删除了“Stopwords”,在单词中添加了词干分析器、参数化等

我用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 "´´´´´´´´´´´´´´´´´´´´´´´"
需要“nbayes”
需要“csv”
需要“主动支持/全部”
需要“语言/词干分析器”
def remove_stopwords(列表)
stopwords_数组=[]
CSV.foreach(“stopwords.CSV”)do|行|
stopwords_数组“pt”)
list.map{| x | stemmer.stem(x)}
结束
def准备_字符串(文本)
list=text.parameterize.split(“-”)
列表=删除停止字(列表)
词干分析器数组(列表)
结束
nbayes=nbayes::Base.new
CSV.foreach(“contacts.CSV”)do|行|
如果行[7]!={:value=>nil,:label=>nil}
nbayes.train(准备字符串(“{row[4]}}{row[5]}”),第[7]行)
结束
结束
new_text=“要预测的文本”
结果=nbayes.classify(准备字符串(新文本))
放置“文本:{new_Text}\n\n”
将“''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
放置“预测:{result.max_class}\n\n”
将“''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

数据集很少用于训练文本分类模型。还要确保检查目标变量的分布。正如你提到的,有4个级别,确保没有级别不平衡。例如,如果一个类有100个数据点,而3个不同类有剩余数据点,那么模型将给出此类输出(其中所有预测类都属于1个类)。同时绘制一个混乱矩阵,看看你的模型实际表现如何。

170项数据还不够……就像Coldspeed说的,170项可能还不够。。你还没有告诉我们分类是什么。。根据分离它们的难易程度,即使使用大型数据集,任务也可能非常困难。此外,最后的“相似概率”也毫无意义。典型的朴素贝叶斯将返回所有类别的非常低的分数。(顺便说一句,它们不是课堂概率——它们是在课堂上观察课文的概率,这就是分数如此低的原因)。重要的是具有最高值的类别,即:最有可能生成文本的类别。