机器学习-朴素贝叶斯-垃圾邮件
一:朴素贝叶斯算法概述
1:朴素贝叶斯(Naïve Bayes, NB)算法,是一种基于贝叶斯定理与特征条件独立假设的分类方法。朴素:特征条件独立;贝叶斯:基于贝叶斯定理。属于监督学习的生成模型,实现简单,并有坚实的数学理论(即贝叶斯定理)作为支撑。
2:理解:贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。
3:那么既然是朴素贝叶斯分类算法,它的核心算法又是什么呢?
是下面这个贝叶斯公式:
可以换一个表达形式更容易理解:
4:例子分析
这里我们联系到朴素贝叶斯公式:
由表中的数据计算可以得到:
对于类别“嫁”的贝叶斯分子为:
对于类别“不嫁”的贝叶斯分子为:
最终结果为:
不嫁(60%) > 嫁( 40%),则该女生选择不嫁。
5:朴素贝叶斯算法的优缺点
优点:
(1) 算法逻辑简单,易于实现
(2)分类过程中时空开销小
缺点:
理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。
而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
二:垃圾邮件(我们想采用的分类方法是通过多个词来判断是否为垃圾邮件,但这个概率难以估计,通过贝叶斯公式,可以转化为求垃圾邮件中这些词出现的概率。)
1:主要步骤:
分类标准:当 P(垃圾邮件|文字内容)> P(正常邮件|文字内容)时,我们认为该邮件为垃圾邮件,但是单凭单个词而做出判断误差肯定相当大,因此我们可以将所有的词一起进行联合判断。
P(垃圾邮件|邮件内容) = P(垃圾邮件和邮件内容) / P(邮件内容) = P(邮件内容|垃圾邮件) * P(垃圾邮件) / P(邮件内容)
2:代码实现
import os
import re
import string
import mathDATA_DIR = 'enron Email dataset/enron'
target_names = ['ham', 'spam']def get_data(DATA_DIR):subfolders = ['enron%d' % i for i in range(1, 7)]data = []target = []for subfolder in subfolders:# spamspam_files = os.listdir(os.path.join(DATA_DIR, subfolder, 'spam'))for spam_file in spam_files:with open(os.path.join(DATA_DIR, subfolder, 'spam', spam_file), encoding="latin-1") as f:data.append(f.read())target.append(1)# hamham_files = os.listdir(os.path.join(DATA_DIR, subfolder, 'ham'))for ham_file in ham_files:with open(os.path.join(DATA_DIR, subfolder, 'ham', ham_file), encoding="latin-1") as f:data.append(f.read())target.append(0)return data, targetX, y = get_data(DATA_DIR)class SpamDetector_1(object):"""Implementation of Naive Bayes for binary classification"""# 清除空格def clean(self, s):translator = str.maketrans("", "", string.punctuation)return s.translate(translator)# 分开每个单词def tokenize(self, text):text = self.clean(text).lower()return re.split("\W+", text)# 计算某个单词出现的次数def get_word_counts(self, words):word_counts = {}for word in words:word_counts[word] = word_counts.get(word, 0.0) + 1.0return word_countsclass SpamDetector_2(SpamDetector_1):# X:data,Y:target标签(垃圾邮件或正常邮件)def fit(self, X, Y):self.num_messages = {}self.log_class_priors = {}self.word_counts = {}# 建立一个集合存储所有出现的单词self.vocab = set()# 统计spam和ham邮件的个数self.num_messages['spam'] = sum(1 for label in Y if label == 1)self.num_messages['ham'] = sum(1 for label in Y if label == 0)# 计算先验概率,即所有的邮件中,垃圾邮件和正常邮件所占的比例self.log_class_priors['spam'] = math.log(self.num_messages['spam'] / (self.num_messages['spam'] + self.num_messages['ham']))self.log_class_priors['ham'] = math.log(self.num_messages['ham'] / (self.num_messages['spam'] + self.num_messages['ham']))self.word_counts['spam'] = {}self.word_counts['ham'] = {}for x, y in zip(X, Y):c = 'spam' if y == 1 else 'ham'# 构建一个字典存储单封邮件中的单词以及其个数counts = self.get_word_counts(self.tokenize(x))for word, count in counts.items():if word not in self.vocab:self.vocab.add(word) # 确保self.vocab中含有所有邮件中的单词# 下面语句是为了计算垃圾邮件和非垃圾邮件的词频,即给定词在垃圾邮件和非垃圾邮件中出现的次数。# c是0或1,垃圾邮件的标签if word not in self.word_counts[c]:self.word_counts[c][word] = 0.0self.word_counts[c][word] += countMNB = SpamDetector_2()
MNB.fit(X[100:], y[100:])class SpamDetector(SpamDetector_2):def predict(self, X):result = []flag_1 = 0# 遍历所有的测试集for x in X:counts = self.get_word_counts(self.tokenize(x)) # 生成可以记录单词以及该单词出现的次数的字典spam_score = 0ham_score = 0flag_2 = 0for word, _ in counts.items():if word not in self.vocab:continue# 下面计算P(内容|垃圾邮件)和P(内容|正常邮件),所有的单词都要进行拉普拉斯平滑else:# 该单词存在于正常邮件的训练集和垃圾邮件的训练集当中if word in self.word_counts['spam'].keys() and word in self.word_counts['ham'].keys():log_w_given_spam = math.log((self.word_counts['spam'][word] + 1) / (sum(self.word_counts['spam'].values()) + len(self.vocab)))log_w_given_ham = math.log((self.word_counts['ham'][word] + 1) / (sum(self.word_counts['ham'].values()) + len(self.vocab)))# 该单词存在于垃圾邮件的训练集当中,但不存在于正常邮件的训练集当中if word in self.word_counts['spam'].keys() and word not in self.word_counts['ham'].keys():log_w_given_spam = math.log((self.word_counts['spam'][word] + 1) / (sum(self.word_counts['spam'].values()) + len(self.vocab)))log_w_given_ham = math.log(1 / (sum(self.word_counts['ham'].values()) + len(self.vocab)))# 该单词存在于正常邮件的训练集当中,但不存在于垃圾邮件的训练集当中if word not in self.word_counts['spam'].keys() and word in self.word_counts['ham'].keys():log_w_given_spam = math.log(1 / (sum(self.word_counts['spam'].values()) + len(self.vocab)))log_w_given_ham = math.log((self.word_counts['ham'][word] + 1) / (sum(self.word_counts['ham'].values()) + len(self.vocab)))# 把计算到的P(内容|垃圾邮件)和P(内容|正常邮件)加起来spam_score += log_w_given_spamham_score += log_w_given_hamflag_2 += 1# 最后,还要把先验加上去,即P(垃圾邮件)和P(正常邮件)spam_score += self.log_class_priors['spam']ham_score += self.log_class_priors['ham']# 最后进行预测,如果spam_score > ham_score则标志为1,即垃圾邮件if spam_score > ham_score:result.append(1)else:result.append(0)flag_1 += 1return resultMNB = SpamDetector()
MNB.fit(X[100:], y[100:])
pred = MNB.predict(X[:100])
true = y[:100]accuracy = 0
for i in range(100):if pred[i] == true[i]:accuracy += 1
print("测试的正确率为:"+accuracy)
3:结果展示(结果为:数据集中有训练集和测试集,所以当我们对训练结果进行测试时,可以发现测试结果很高为98%,所以可以实现大部分的垃圾邮件的检索。)
机器学习-朴素贝叶斯-垃圾邮件相关推荐
- Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说
Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说朴 ...
- 朴素贝叶斯-垃圾邮件(中文的)处理
#coding=utf-8 from sklearn.naive_bayes import MultinomialNB,GaussianNB import numpy as np import jie ...
- 朴素贝叶斯——垃圾邮件过滤
文章目录 利用朴素贝叶斯进行文档分类 1.获取数据集 2.切分文本 3.构建词表和分类 4.构建分类器 5.测试算法 利用朴素贝叶斯进行垃圾邮件过滤 1.导入数据集 2.垃圾邮件预测 总结 利用朴素贝 ...
- python实现朴素贝叶斯垃圾邮件分类
查看通俗易懂的贝叶斯垃圾邮件分类原理 请点击此处 下载邮件数据 请点击此处 import os import re import string import math import numpy as ...
- 机器学习实战4(1):朴素贝叶斯:垃圾邮件的识别
一.朴素贝叶斯基础知识 预备数学知识: A. 无约束条件的优化 1.求极值问题 人工智能中最核心的数学环节是求出一个目标函数(object function)的最小值/最大值.求出一个函数最小是/最大 ...
- 朴素贝叶斯-垃圾邮件分类实现
1. 前言 <朴素贝叶斯算法(Naive Bayes)>,介绍了朴素贝叶斯原理.本文介绍的是朴素贝叶斯的基础实现,用来垃圾邮件分类. 2. 朴素贝叶斯基础实现 朴素贝叶斯 (naive B ...
- 第四章 朴素贝叶斯-垃圾邮件过滤
#朴素贝叶斯之垃圾邮件过滤 import os #----------------------1.获取数据集----------------------- import pandas as pd''' ...
- 机器学习之贝叶斯垃圾邮件分类
代码来源于:https://www.cnblogs.com/huangyc/p/10327209.html ,本人只是简介学习 1. 贝叶斯.py import numpy as np from w ...
- 朴素贝叶斯-垃圾邮件(英文的)处理
from sklearn.naive_bayes import MultinomialNB,GaussianNB import numpy as np MultinomialNB 多项式朴素贝叶斯 G ...
最新文章
- 国际C语言乱码大赛(IOCCC)经典之作
- Fundebug录屏插件更新至0.4.0,修复BUG,优化性能
- Java IO流面试题
- 客户端(STS)连接服务器上redis时的问题
- jzoj6344-[NOIP2019模拟2019.9.7]Huge Counting【组合数,状压dp】
- python序列化对象的函数_使 Python 对象可序列化的函数
- TensorFlow HOWTO 2.3 支持向量分类(高斯核)
- 耶鲁大学公开课:哲学-死亡
- windows10资讯和兴趣怎么关闭?
- 有一定基础学python_有一定编程基础,有什么好的自学python的教程吗?
- 变量的内部存储:引用和计数
- 计算机文档加密如何解锁,bitlocker怎么解锁_bitlocker解锁方法
- BUUCTF web writeup
- [Mac]macOS Mojave 10.14.3安装Java
- java 错误声音播放器_JavaME 声音播放器的使用
- 教师不能错过的三款教学必备工具
- 西电微机系统课程设计——步进电机开环控制系统设计
- Java腾讯企业邮箱发送邮件
- ABB机器人系统和出错信息
- 自己编写自动同步脚本
热门文章
- NVIDIA视频编码器 ffmpeg -h encoder=h264_nvenc
- 山东菏泽家乡网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
- WordPress站点快速集成腾讯数字身份管控平台CIAM,免开发实现登录认证
- Python爬取京东:价格、商品ID、标题、评价、店名、是否自营
- 数据分析领域不同职位de薪酬职能差异
- 计算机考研转专业,申请美国研究生转专业有什么要求?
- 【精】微信小程序生成二维码海报分享 [原理+源码]
- 解决Linux下无法利用shell脚本启动conda虚拟环境问题
- 大白话、最简单——SpringBoot+Mybatis+freemarker整合(二)
- 基于Core Text实现的TXT电子书阅读器