Bayes贝叶斯识别Spam Email垃圾邮件

目录

介绍: 

一、Gaussian Naive Bayes(连续型变量)

1.1数据处理 

1.2建模

 1.3cross_val_score函数评估

 1.4classification_report函数评估

 1.5classification_report函数和cross_val_score函数的区别

二、 Multinomial Naive Bayes(离散型变量)

2.1数据处理

2.2建模

2.3CountVectorizer举例说明 

介绍: 

贝叶斯算法是一种基于概率模型的分类算法,它利用贝叶斯定理来对待分类样本进行概率推断。贝叶斯定理是一种条件概率关系,它的核心思想是根据已知的先验概率和新的证据信息,来更新对事件发生概率的估计。

贝叶斯算法的基本步骤如下:

  1. 收集和准备数据集:收集已知样本,对数据进行清洗和预处理,确保数据的质量和准确性。
  2. 计算先验概率:根据已知样本的类别标签,计算各个类别的先验概率,即在没有其他信息的情况下,每个类别发生的概率。
  3. 计算条件概率:对于每个类别,计算每个特征的条件概率,即在该类别下,每个特征取某个值的概率。
  4. 利用贝叶斯定理进行分类:对于待分类样本,计算其在每个类别下的后验概率,即给定待分类样本的特征值条件下,该样本属于每个类别的概率。
  5. 选择概率最大的类别作为最终分类结果。

贝叶斯算法的优点包括:

  • 算法简单,实现容易;
  • 对小样本数据和多类别分类问题表现良好;
  • 可以通过增量学习来处理在线分类问题。

然而,贝叶斯算法也存在一些缺点:

  • 对于输入特征之间存在强相关性的数据,算法性能可能会下降;
  • 对于输入特征空间过大的数据,算法的计算复杂度较高;
  • 贝叶斯算法假设特征之间相互独立,当这个假设不成立时,算法的分类效果不佳。

贝叶斯算法在文本分类、垃圾邮件过滤、情感分析等领域具有广泛应用。

贝叶斯公式是一种统计学概率定理,用于计算在已知一些先验信息的情况下,对于新的证据出现后,更新先验概率为后验概率的方法。

公式表达为:P(A|B) = P(B|A) * P(A) / P(B)

其中,P(A|B)表示在已知B发生的情况下,A发生的概率,称为后验概率。P(B|A)表示在已知A发生的情况下,B发生的概率,称为似然函数。P(A)表示A发生的先验概率,P(B)表示B发生的先验概率。

对于一个给定的邮件,我们可以通过贝叶斯公式来计算它是垃圾邮件的概率。贝叶斯公式如下:

P(垃圾邮件|邮件) = P(邮件|垃圾邮件) * P(垃圾邮件) / P(邮件)

其中,P(垃圾邮件|邮件)表示给定邮件是垃圾邮件的概率,P(邮件|垃圾邮件)表示垃圾邮件中的邮件概率,P(垃圾邮件)表示任一邮件是垃圾邮件的概率,P(邮件)表示任一邮件的概率。

在垃圾邮件过滤中,我们可以通过以下步骤来计算一个邮件是垃圾邮件的概率:

1. 建立训练集:收集大量已经标记好的垃圾邮件和非垃圾邮件。

2. 提取特征:对每封邮件提取一些特征,比如关键词、发件人、附件等等。

3. 训练模型:根据训练集中的邮件和它们的标记,计算出每个特征在垃圾邮件和非垃圾邮件中的概率。

4. 过滤邮件:对于一个新的邮件,计算它是垃圾邮件的概率。根据设置的阈值,判断该邮件是否为垃圾邮件。

通过利用贝叶斯公式进行垃圾邮件过滤,可以提高过滤的准确性和效率。

一、Gaussian Naive Bayes(连续型变量)

高斯朴素贝叶斯(Gaussian Naive Bayes)是朴素贝叶斯分类算法的一种变体。它基于贝叶斯定理和假设特征之间的独立性。与其他朴素贝叶斯算法类似,高斯朴素贝叶斯用于分类问题,并假设特征之间的相关性可以通过计算协方差矩阵来建模。

与其他朴素贝叶斯算法不同的是,高斯朴素贝叶斯假设特征的概率分布为高斯分布。因此,它适用于特征是连续变量的情况。对于每个类别,算法计算每个特征的均值和方差,并使用这些统计量来估计每个特征的概率分布。在预测时,算法使用贝叶斯定理来计算样本属于每个类别的概率,并选择具有最高概率的类别作为预测结果。

高斯朴素贝叶斯算法的优点包括计算效率高、对缺失数据鲁棒性强和可处理大量的特征。然而,它的缺点是它对于特征之间的相关性的建模能力有限。

总而言之,高斯朴素贝叶斯是一种简单但有效的分类算法,适用于特征为连续变量的问题。它用于估计特征的概率分布,并使用贝叶斯定理进行分类预测。

1.1数据处理 

import numpy as py#应用Gaussian Naive Bayes,连续型
import pandas as pd
df = pd.read_csv("Titanic.csv")

df.drop(['PassengerId','Name','SibSp','Parch','Ticket','Cabin','Embarked'],axis='columns',inplace=True)

X=df.drop('Survived',axis="columns")
y=df.Survived

dummies= pd.get_dummies(X.Sex)
X=pd.concat([X,dummies],axis='columns')
X.drop(['Sex','male'],axis='columns',inplace=True)

X.columns[X.isna().any()]#含空的
X['Age'].isnull().sum()#含空的个数
X.Age=X.Age.fillna(X.Age.mean())#均值赋给空的

1.2建模

from  sklearn.model_selection import train_test_split#将数据分成测试和训练集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)#测试集占百分之三十,random_state=0随机抽取数据集里的成为测试集

from sklearn.naive_bayes import GaussianNB
model = GaussianNB()

model.fit(X_train,y_train)
model.score(X_test,y_test)
#结果:0.8575063613231552

y_test[0:10]
'''结果:1 1 0 0 1 0 0 0 1 1'''

model.predict(X_test[0:10])
#结果:array([1, 1, 0, 0, 1, 0, 0, 0, 1, 1], dtype=int64)

 1.3cross_val_score函数评估

cross_val_score是一个用于评估模型性能的函数,它可以对模型进行交叉验证并返回每个验证的得分。它的基本语法如下:

cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')

参数说明:

  • estimator: 用于拟合数据的模型对象
  • X: 特征数据
  • y: 目标变量
  • scoring: 使用哪个指标对模型进行评估,默认为None,即使用模型的score方法进行评估
  • cv: 交叉验证的折数,默认为None,即使用默认的3折交叉验证
  • n_jobs: 并行运行的作业数,默认为None,即使用单个作业运行
  • verbose: 控制详细程度的整数,默认为0,即不输出任何信息
  • fit_params: 额外的拟合参数,传递给estimator的fit方法
  • pre_dispatch: 控制作业预分派的整数或字符串,默认为'2*n_jobs'

cross_val_score函数会将数据分成cv份,并返回每个验证的得分。得分可以用于对模型进行评估,例如取平均值作为模型的最终评分。交叉验证可以有效地评估模型的性能,并防止过拟合。

from sklearn.model_selection import cross_val_score
cross_val_score(GaussianNB(),X_train,y_train,cv=5)
#结果:array([0.86956522, 0.80327869, 0.83606557, 0.83606557, 0.83060109])

 1.4classification_report函数评估

classification_report是一个用于评估分类模型性能的函数。它通常用在机器学习领域中,特别是在分类问题中。classification_report可以计算模型在不同类别上的精确率、召回率、F1分数和支持数等指标。

具体来说,classification_report会根据模型对样本进行预测的结果和真实标签之间的对比,计算出每个类别的精确率、召回率、F1分数和支持数。其中,精确率表示模型预测为某个类别的样本中,真实属于该类别的比例;召回率表示模型正确预测为某个类别的样本数占真实属于该类别的样本数的比例;F1分数是精确率和召回率的加权平均值,可以用来衡量模型在某个类别上的综合性能;支持数表示真实属于某个类别的样本数量。

通过使用classification_report,可以对分类模型的性能进行全面的评估,并且可以比较不同类别之间的性能差异。这对于选择合适的模型或者调整模型参数非常有帮助。

from sklearn.metrics import classification_report
print(classification_report(y_test[0:10],model.predict(X_test[0:10])))
'''结果:
 precision    recall  f1-score   support

           0       1.00      1.00      1.00         5
           1       1.00      1.00      1.00         5

    accuracy                           1.00        10
   macro avg       1.00      1.00      1.00        10
weighted avg       1.00      1.00      1.00        10

'''

 1.5classification_report函数和cross_val_score函数的区别

classification_report和cross_val_score都是评估模型性能的工具,但是两者用途和计算方式有所不同。

classification_report是用于评估分类模型性能的工具,它主要用于计算模型的精确度、召回率、F1分数等指标。在使用classification_report之前,需要先计算模型的预测结果和真实结果,然后根据这些结果计算指标。classification_report适用于评估单个模型的性能。

cross_val_score是用于交叉验证评估模型性能的工具,它可以自动地将数据集划分为训练集和验证集,并计算模型的交叉验证分数。具体地,cross_val_score将数据集划分为k个子集,然后使用每个子集作为验证集,剩下的k-1个子集作为训练集。最后,将每次得到的模型性能评分的平均值作为模型的最终性能评分。cross_val_score适用于评估模型在不同数据集上的性能,因为它可以通过多次交叉验证来减少过拟合或欠拟合的影响。

综上所述,classification_report用于评估单个模型的性能,而cross_val_score用于评估模型在不同数据集上的性能。两者的计算方式和结果呈现方式也有所不同。

二、 Multinomial Naive Bayes(离散型变量)

Multinomial Naive Bayes是一种基于朴素贝叶斯算法的分类器,适用于处理离散特征数据的分类问题。它是朴素贝叶斯算法的扩展,用于处理多类别问题。

该算法假设每个特征的类别之间相互独立,并且特征之间的概率分布服从多项式分布。通过计算每个类别的概率,选择具有最高概率的类别作为预测结果。

Multinomial Naive Bayes广泛应用于文本分类问题,如垃圾邮件过滤、情感分析等。它在构建模型时只需要计算特征的频率,因此具有较高的速度和性能。

2.1数据处理

#离散变量,Multinomial Naive Bayes
df1 = pd.read_csv("spam.csv")
df1=df1.drop(df1.iloc[:,-3:],axis=1)

df1.groupby('v1').describe()
'''结果:
 	v2
	count 	unique 	top 	freq
v1 				
ham 	4825 	4516 	Sorry, I'll call later 	30
spam 	747 	653 	Please call our customer service representativ... 	4
'''

dummies= pd.get_dummies(df1.v1)
X=pd.concat([df1,dummies],axis=1)

y=X.spam
X=X.v2

2.2建模

from  sklearn.model_selection import train_test_split#将数据分成测试和训练集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)#测试集占百分之三十,random_state=0随机抽取数据集里的成为测试集

from sklearn.feature_extraction.text import CountVectorizer#向量,语言用向量表示
v = CountVectorizer()
X_train_T = v.fit_transform(X_train.values)
X_train_T.toarray()[:3]#在字典里是否出现

from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(X_train_T,y_train)

X_test_T = v.transform(X_test)
model.score(X_test_T,y_test)

#结果:0.9838516746411483


emails = [
    "hey moban, can we get together to watch football game tomorrow?",
    "Upto 20% discount on parking, exclusive offer just for you. Dont miss this reward!"
]
emails_T = v.transform(emails)
model.predict(emails_T)#预测结果第一句不是垃圾邮件,第二句是,因为第二句出现discount折扣这类词

#结果:array([0, 1], dtype=uint8)

2.3CountVectorizer举例说明 

from sklearn.feature_extraction.text import CountVectorizer
corpus = [
     'This is the first document.',
     'This document is the second document.',
     'And this is the third one.',
     'Is this the first document?',
 ]
vectorizer = CountVectorizer()#初始化字典

 X = vectorizer.fit_transform(corpus)#构建字典
 vectorizer.get_feature_names_out()#字典
'''结果:
array(['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third',
       'this'], dtype=object)
'''

print(X.toarray())#单词出现次数
'''结果:
[[0 1 1 1 0 0 1 0 1]
 [0 2 0 1 0 1 1 0 1]
 [1 0 0 1 1 0 1 1 1]
 [0 1 1 1 0 0 1 0 1]]
'''

vectorizer2 = CountVectorizer(analyzer='word', ngram_range=(2, 2))#初始化字典,两个词分割
X2 = vectorizer2.fit_transform(corpus)
vectorizer2.get_feature_names_out()
'''结果:
array(['and this', 'document is', 'first document', 'is the', 'is this',
       'second document', 'the first', 'the second', 'the third',
       'third one', 'this document', 'this is', 'this the'], dtype=object)
'''

print(X2.toarray())
'''结果:
[[0 0 1 1 0 0 1 0 0 0 0 1 0]
 [0 1 0 1 0 1 0 1 0 0 1 0 0]
 [1 0 0 1 0 0 0 0 1 1 0 1 0]
 [0 0 1 0 1 0 1 0 0 0 0 0 1]]
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法设计与分析】分治-时间复杂度计算

目录 主定理 Master Theorem分治算法运行时间的递归表示主定理的简化形式 主定理的一般形式 递归树 Recursion Tree递归树的简单结论 主定理 Master Theorem 分治算法运行时间的递归表示 将原问题分解成 a 个子问题递归求解,每个子问题的规模是原问题的 1/b。同时子…

紫光展锐5G扬帆出海 | 欧洲积极拥抱更多5G选择

和我国一样,欧洲不少国家也在2019年进入5G商用元年:英国在2019年5月推出了5G商用服务,该国最大的移动运营商EE(Everything Everywhere)最先商用5G;德国在2019年年中推出5G商用服务,德国电信、沃达丰和 Telefonica是首批…

从0开始python学习-42.requsts统一请求封装

统一请求封装的目的: 1.去除重复的冗余的代码 2. 跨py文件实现通过一个sess来自动关联有cookie关联的接口。 3. 设置统一的公共参数,统一的文件处理,统一的异常处理,统一的日志监控,统一的用例校验等 封装前原本代…

手写视频裁剪框

<!-- 截取框 --><divv-show"isShow"class"crop-box":style"{width: cropWidth px,height: cropHeight px,left: cropX px,top: cropY px,}"ref"cropBox"mousedown"startInteraction"><!-- 内容在这里 --…

Kubernetes二进制部署 单节点

一、环境准备 k8s集群master1&#xff1a;192.168.229.90 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群node1: 192.168.229.80 kubelet kube-proxy docker flannel k8s集群node2: 192.168.229.70 kubelet kube-proxy docker flannel 至少2C2G 常见的k…

软件工程:数据流图相关知识和多实例分析

目录 一、数据流图相关知识 1. 基本介绍 2. 常用符号 3. 附加符号 二、数据流图实例分析 1. 活期存取款业务处理系统 2. 工资计算系统 3. 商业自动化系统 4. 学校人事管理系统 5. 教材征订系统 6. 高考录取统分子系统 7. 订货系统 8. 培训中心管理系统 9. 考务处…

【动态规划】【字符串】C++算法:140单词拆分

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 动态规划 字符串 LeetCode140:单词拆分 II 给定一个字符串 s 和一个字符串字典 wordDict &#xff0c;在字符串 s 中增加空格来构建一个句子&#xff0c;使得句子中所有的单词都在词典中。以任意顺序 返回…

PyTorch|一次画一批图像

想想这样一个场景&#xff0c;我们训练了一个神经网络&#xff0c;输入一些信息&#xff0c;这个网络可以根据信息为我们生成相关图片。 这些图片并不是一张&#xff0c;而是多张&#xff0c;我们想把这些图片一次全部显示出来&#xff0c;而不是一张一张的显示&#xff08;这…

【JAVA】异常体系

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Exception&#xff08;异常&#xff09;: Error: 结语 我的其他博客 前言 在Java编程中&#xff0c;异常处理是一个至关…

什么?谁?w (who what)

文章目录 什么&#xff1f;谁&#xff1f;w (who & what)默认的显示不显示标题行简洁模式显示更多信息 什么&#xff1f;谁&#xff1f;w (who & what) w可以认为是加强版的who&#xff0c;果然越简洁越强大&#xff0c;就比如less比more是功能更多的。 w不仅可以显示…

leetcode:2451. 差值数组不同的字符串(python3解法)

难度&#xff1a;简单 给你一个字符串数组 words &#xff0c;每一个字符串长度都相同&#xff0c;令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] &#xff0c;其中对于 0 < j < n - 2 有 difference[i]…

element-ui table height 属性导致界面卡死

问题: 项目上&#xff0c;有个点击按钮弹出抽屉的交互, 此时界面卡死 原因分析: 一些场景下(父组件使用动态单位/弹窗、抽屉中使用), element-ui 的 table 会循环计算高度值, 导致界面卡死 github 上的一些 issues 和解决方案: Issues ElemeFE/element GitHub 官方讲是升…

LLM之RAG实战(十三)| 利用MongoDB矢量搜索实现RAG高级检索

想象一下&#xff0c;你是一名侦探&#xff0c;身处庞大的信息世界&#xff0c;试图在堆积如山的数据中找到隐藏的一条重要线索&#xff0c;这就是检索增强生成&#xff08;RAG&#xff09;发挥作用的地方&#xff0c;它就像你在人工智能和语言模型世界中的可靠助手。但即使是最…

实战演练 | Navicat 中编辑器设置的配置

Navicat 是一款功能强大的数据库管理工具&#xff0c;为开发人员和数据库管理员提供稳健的环境。其中&#xff0c;一个重要功能是 SQL 编辑器&#xff0c;用户可以在 SQL 编辑器中编写和执行 SQL 查询。Navicat 的编辑器设置可让用户自定义编辑器环境&#xff0c;以满足特定的团…

MobaXterm SSH 免密登录配置

文章目录 1.简介2.SSH 免密登录配置第一步&#xff1a;点击 Session第二步&#xff1a;选择 SSH第三步&#xff1a;输入服务器地址与用户名第四步&#xff1a;设置会话名称第五步&#xff1a;点击 OK 并输入密码 3.密码管理4.小结参考文献 1.简介 MobaXterm 是一个功能强大的终…

如何科学地防范冬季流感

如何科学地防范冬季流感 加强对呼吸系统传染病预防的观念 在乘坐地铁、公交、火车、飞机等公共交通工具时&#xff0c;应科学佩戴口罩。要经常洗手&#xff0c;定期通风&#xff0c;咳嗽或打喷嚏时要用手捂住口鼻&#xff0c;不要随地吐痰。 羊大师建议积极接种含有XBB变异株…

基于树种算法优化的Elman神经网络数据预测 - 附代码

基于树种算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于树种算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于树种优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

实现网页跟随系统主题切换

如何实现网页跟随系统主题切换&#xff1f;想必大家都是用过媒体查询media (prefers-color-scheme: dark) 实现亮/暗主题的切换&#xff0c;那如何让其跟随系统自动切换呢&#xff1f;在window对象上&#xff0c;有matchMedia这个API可以帮助我们解决这个问题。它和css中的媒体…

微信小程序启用组件按需注入

微信小程序在预览或上传的时候会进行代码质量检测&#xff0c;有时候会提示‘组件需按需注入’&#xff0c;如下图所示&#xff1a; 这是只要加一句代码"lazyCodeLoading": "requiredComponents" 就行了 &#xff0c;添加的位置在app.json文件的里面&#…

开源协议简介和选择

软件国产化已经提到日程上了&#xff0c;先来研究一下开源协议。 引言 在追求“自由”的开源软件领域的同时不能忽视程序员的权益。为了激发程序员的创造力&#xff0c;现今世界上有超过60种的开源许可协议被开源促进组织&#xff08;Open Source Initiative&#xff09;所认可…