当前位置:   article > 正文

机器学习-朴素贝叶斯分类算法

机器学习-朴素贝叶斯分类算法

 引言:

朴素贝叶斯分类是机器学习中常用的一种文本分类算法。它基于贝叶斯定理和特征独立性假设,具有简单、高效和易于理解的特点。它在自然语言处理、垃圾邮件过滤、情感分析等领域具有广泛的应用。

一.贝叶斯定理

首先,让我们来了解一下贝叶斯定理,它是朴素贝叶斯分类算法的基础。贝叶斯定理描述了在已知一些条件下,另一事件发生的概率。假设有事件A和事件B,贝叶斯定理可以表示为:

P(B|A) = \frac{P(A|B)P(B)}{P(A)}

其中:

( P(A|B) ) 是在事件B发生的条件下事件A发生的概率;

( P(B|A) ) 是在事件A发生的条件下事件B发生的概率;

( P(A) ) 和 ( P(B) ) 分别是事件A和事件B发生的概率。

二.朴素贝叶斯分类

1.基本思想:

朴素贝叶斯分类基于贝叶斯定理和条件独立性假设。贝叶斯定理是基于条件概率的一种统计推断方法,它描述了如何根据已有的观察结果来更新一个事件的概率。而条件独立性假设是指在给定类别的情况下,特征之间是相互独立的。

2.原理:

朴素贝叶斯分类将输入文本表示为一个向量,其中每个维度对应于一个特征值。假设有 N 个特征,分类任务有 K 个类别。对于一个给定的文本样本 X,朴素贝叶斯分类通过计算以下公式来预测它所属的类别:

P(Y = c|X) = P(X|Y = c) * P(Y = c) / P(X)

其中,P(Y = c|X) 表示给定输入文本 X 情况下,它属于类别 c 的概率。P(X|Y = c) 是朴素贝叶斯分类器的核心部分,它表示在类别 c 的情况下,特征向量 X 出现的概率。P(Y = c) 表示类别 c 的先验概率,即在没有任何观察之前,样本属于类别 c 的概率。P(X) 是一个归一化因子,用于确保概率的和等于 1。

3.公式:

y=f(x)=argmax_{(c_k)}\frac{P(y={c_k})\prod_j{P(X^{(j)}|Y=c_k)}}{\sum_kP(Y=c_k)\prod_j{P(X^{(j)}=x^{(j)}|Y=c_k)}}

4.实际应用

朴素贝叶斯分类算法在文本分类、垃圾邮件过滤、情感分析等领域得到广泛应用。以文本分类为例,我们可以利用朴素贝叶斯分类器对新闻文章进行分类,帮助用户快速找到感兴趣的内容;在垃圾邮件过滤方面,朴素贝叶斯分类器可以有效地识别并过滤掉用户收件箱中的垃圾邮件;在情感分析中,朴素贝叶斯分类器可以分析文本中的情感色彩,帮助企业了解用户对其产品或服务的评价。

三.代码实现:

(1)中文的垃圾邮件分类:

  1. import nltk.classify as cf
  2. import nltk.classify.util as cu
  3. import jieba
  4. import snownlp
  5. def setiment(sentences):
  6. # 文本转换为特征及特征选取
  7. pos_data = []
  8. with open('D:\Desktop\垃圾体育文本.txt', 'r+', encoding='utf-8') as pos:
  9. while True:
  10. words = pos.readline()
  11. if words:
  12. positive = {}
  13. words = jieba.cut(words) # 数据结巴分词
  14. for word in words:
  15. positive[word] = True
  16. pos_data.append((positive, 'POSITIVE'))
  17. else:
  18. break
  19. neg_data = []
  20. with open('D:\Desktop\垃圾旅游文本.txt', 'r+', encoding='utf-8') as neg:
  21. while True:
  22. words = neg.readline()
  23. if words:
  24. negative = {}
  25. words = jieba.cut(words) # 对数据结巴分词
  26. for word in words:
  27. negative[word] = True
  28. neg_data.append((negative, 'NEGATIVE'))
  29. else:
  30. break
  31. # 划分训练集(80%)与测试集(20%)
  32. pos_num, neg_num = int(len(pos_data) * 0.8), int(len(neg_data) * 0.8)
  33. train_data = pos_data[: pos_num] + neg_data[: neg_num] # 抽取80%数据
  34. test_data = pos_data[pos_num: ] + neg_data[neg_num: ] # 剩余20%数据
  35. # 构建分类器(朴素贝叶斯)
  36. model = cf.NaiveBayesClassifier.train(train_data)
  37. ac = cu.accuracy(model, test_data)
  38. print('准确率为:' + str(ac))
  39. tops = model.most_informative_features() # 信息量较大的特征
  40. print('\n信息量较大的前50个特征为:')
  41. for top in tops[: 50]:
  42. print(top[0])
  43. for sentence in sentences:
  44. feature = {}
  45. words = jieba.cut(sentence)
  46. for word in words:
  47. feature[word] = True
  48. pcls = model.prob_classify(feature)
  49. sent = pcls.max()
  50. prob = pcls.prob(sent)
  51. print('\n','‘',sentence,'’', '出现的概率为', sent, '概率为','%.2f%%' % round(prob * 100, 2))
  52. if __name__ == '__main__':
  53. sentences = ['体育','马林', '辽宁队', '辽宁队队长',
  54. '黄金周', '旅游','游客']
  55. setiment(sentences)

结果: 

(2)英文的垃圾邮件分类:

  1. import nltk.classify as cf
  2. import nltk.classify.util as cu
  3. import jieba
  4. import snownlp
  5. def setiment(sentences):
  6. # 文本转换为特征及特征选取
  7. pos_data = []
  8. with open('D:\Desktop\spam-邮件.txt', 'r+', encoding='utf-8') as pos:
  9. while True:
  10. words = pos.readline()
  11. if words:
  12. positive = {}
  13. words = jieba.cut(words) # 数据结巴分词
  14. for word in words:
  15. positive[word] = True
  16. pos_data.append((positive, 'POSITIVE'))
  17. else:
  18. break
  19. neg_data = []
  20. with open('D:\Desktop\ham-邮件.txt', 'r+', encoding='utf-8') as neg:
  21. while True:
  22. words = neg.readline()
  23. if words:
  24. negative = {}
  25. words = jieba.cut(words) # 对数据结巴分词
  26. for word in words:
  27. negative[word] = True
  28. neg_data.append((negative, 'NEGATIVE'))
  29. else:
  30. break
  31. # 划分训练集(80%)与测试集(20%)
  32. pos_num, neg_num = int(len(pos_data) * 0.8), int(len(neg_data) * 0.8)
  33. train_data = pos_data[: pos_num] + neg_data[: neg_num] # 抽取80%数据
  34. test_data = pos_data[pos_num: ] + neg_data[neg_num: ] # 剩余20%数据
  35. # 构建分类器(朴素贝叶斯)
  36. model = cf.NaiveBayesClassifier.train(train_data)
  37. ac = cu.accuracy(model, test_data)
  38. print('准确率为:' + str(ac))
  39. tops = model.most_informative_features() # 信息量较大的特征
  40. print('\n信息量较大的前50个特征为:')
  41. for top in tops[: 50]:
  42. print(top[0])
  43. for sentence in sentences:
  44. feature = {}
  45. words = jieba.cut(sentence)
  46. for word in words:
  47. feature[word] = True
  48. pcls = model.prob_classify(feature)
  49. sent = pcls.max()
  50. prob = pcls.prob(sent)
  51. print('\n','‘',sentence,'’', '出现的概率为', sent, '概率为','%.2f%%' % round(prob * 100, 2))
  52. if __name__ == '__main__':
  53. sentences = ['u','i', 'd', 'a',
  54. 'y', 'w']
  55. setiment(sentences)

结果: 

(3)朴素贝叶斯的优缺点:

1.优点:

  1. 快速且易于实现:朴素贝叶斯算法具有简单的原理和实现步骤,计算速度较快,适用于处理大量的数据。
  2. 对小样本数据表现良好:即使在只有少量样本数据的情况下,朴素贝叶斯算法仍然能够提供相对准确的分类结果。
  3. 处理多分类问题有效:朴素贝叶斯算法可以很好地处理多分类问题,对于文本分类、垃圾邮件过滤等应用场景具有良好的效果。
  4. 对于高维数据适应性强:在特征空间较大的情况下,朴素贝叶斯算法依然能够保持良好的性能。

2.缺点:

  1. 独立假设:朴素贝叶斯算法假设属性之间相互独立,但在现实问题中,特征之间往往存在相关性,这可能导致分类性能下降。
  2. 对输入数据的分布假设:朴素贝叶斯算法假设输入数据的分布形式,例如高斯分布、伯努利分布等,但在实际应用中,这些假设并不总是成立,可能导致预测结果不准确。
  3. 零概率问题:如果在训练集中出现了未见过的特征组合,朴素贝叶斯算法会将其概率估计为零,导致分类错误。
  4. 对连续型特征的处理不够理想:朴素贝叶斯算法对于连续型特征的处理通常基于离散化,可能丢失一些信息。

 

四.出现的问题及解决方法

1.问题:

一直提示文件打开方式不对,访问不了?

2.解决方法:

encoding要改成自己文本打开后的格式,看看TXT文本右下角的是什么,再去代码中改成相对于的,可以正常输出了。

五.实验总结

通过本次实验,了解到朴素贝叶斯分类是一种简单而有效的文本分类算法。它基于贝叶斯定理和特征独立性假设,具有简单、高效和易于理解的特点。通过使用朴素贝叶斯分类器,我们可以有效地对文本进行分类,如垃圾邮件过滤、情感分析等。虽然朴素贝叶斯分类器在处理复杂的模式和依赖性时可能会有局限性,但在许多实际应用中仍然表现出良好的性能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/672516
推荐阅读
相关标签
  

闽ICP备14008679号