在 Naive Bayes 分类器中,概率计算错误通常可以归结为几个常见的问题和解决方法。以下是可能导致概率计算错误的一些常见情况及其解决方法,希望本文能对你有帮助。
1、问题背景
在实现一个朴素贝叶斯分类器时,作者发现分类器的准确率只有61%左右,并且分类器计算出的概率值与预期不符,即两类的概率值之和不等于1。
2、解决方案
- 朴素贝叶斯分类器不会直接计算概率,而会计算一个“原始分数”,然后将该分数与其他标签的分数进行比较,以对实例进行分类。
- 这个分数很容易转换成[0, 1]范围内的“概率”: total = sum(probs.itervalues()) for label, score in probs.iteritems(): probs[label] = score / total
- 然而,需要记住的是,这仍然不是一个真正的概率,正如这个答案中提到的: 朴素贝叶斯倾向于预测概率,这些概率几乎总是非常接近于零或非常接近于一。
代码例子:
代码语言:javascript复制import csv
# 加载数据
def load_data(filename):
data = []
tgts = []
with open(filename, 'r') as fil:
reader = csv.reader(fil)
for line in reader:
d = [x.strip() for x in line]
if '?' in d:
continue
if not len(d):
continue
data.append(d[:-1])
tgts.append(d[-1:][0])
return data, tgts
# 训练朴素贝叶斯分类器
def train(data, targets):
global words_stats, words_cnt, targets_stats, items_cnt, class_stats
num = len(data)
for item in xrange(num):
class_stats[targets[item]] = class_stats.get(targets[item], 0) 1
for i in xrange(len(data[item])):
word = data[item][i]
if not words_stats.has_key(word):
words_stats[word] = {}
tgt = targets[item]
cnt = words_stats[word].get(tgt, 0)
words_stats[word][tgt] = cnt 1
targets_stats[tgt] = targets_stats.get(tgt, 0) 1
words_cnt = 1
items_cnt = num
# 对新数据进行分类
def classify(doc, tgt_set):
global words_stats, words_cnt, targets_stats, items_cnt
probs = {} #the probability itself P(c|W) = P(W|c) * P(c) / P(W)
pc = {} #probability of the class in document set P(c)
pwc = {} #probability of the word set in particular class. P(W|c)
pw = 1 #probability of the word set in documet set
for word in doc:
if word not in words_stats:
continue #dirty, very dirty
pw = pw * float(sum(words_stats[word].values())) / words_cnt
for tgt in tgt_set:
pc[tgt] = class_stats[tgt] / float(items_cnt)
for word in doc:
if word not in words_stats:
continue #dirty, very dirty
tgt_wrd_cnt = words_stats[word].get(tgt, 0)
pwc[tgt] = pwc.get(tgt, 1) * float(tgt_wrd_cnt) / targets_stats[tgt]
probs[tgt] = (pwc[tgt] * pc[tgt]) / pw
l = sorted(probs.items(), key = lambda i: i[1], reverse=True)
print probs
return l[0][0]
# 检查分类结果
def check_results(dataset, targets):
num = len(dataset)
tgt_set = set(targets)
correct = 0
incorrect = 0
for item in xrange(num):
res = classify(dataset[item], tgt_set)
if res == targets[item]:
correct = correct 1
else:
incorrect = incorrect 1
print 'correct:', float(correct) / num, ' incorrect:', float(incorrect) / num
if __name__ == '__main__':
filename = 'adult.data'
data, tgt = load_data(filename)
train(data, tgt)
test_filename = 'adult.test'
test_data, test_tgt = load_data(test_filename)
check_results(test_data, tgt)
通过以上代码,相信大家应该能够诊断和解决 Naive Bayes 分类器中概率计算错误的常见问题。如果问题仍然存在,建议提供具体的错误信息或代码片段,以便更详细地帮助您解决问题。