前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Naive Bayes 分类器中概率计算错误

Naive Bayes 分类器中概率计算错误

原创
作者头像
华科云商小徐
发布2024-07-03 09:26:53
700
发布2024-07-03 09:26:53
举报
文章被收录于专栏:小徐学爬虫

在 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 分类器中概率计算错误的常见问题。如果问题仍然存在,建议提供具体的错误信息或代码片段,以便更详细地帮助您解决问题。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档