用朴素贝叶斯实现垃圾邮箱分类实验报告

一、实验目的
1.会用Python创建朴素贝叶斯模型
2.使用朴素贝叶斯模型对垃圾邮件分类
3.会把文本内容变成向量
4.会用评价朴素贝叶斯模型的分类效果
二、设备与环境
Jupyter notebook
Python=3.9
三、实验原理
在这里插入图片描述

四、实验内容

1.把给定的数据集message.csv拆分成训练集和测试集,使用sklearn.naive_bayes.MultionmialNB类常见一个朴素贝叶斯模型,使用训练数据训练出一个预测模型,然后用预测模型对测试集中数据进行分类,评价模型的分类效果
2.message.csv数据集中包含大量的短信,每行数据包括2个字段:短信内容,短信类别(1或者0),短信类别为1的是垃圾短信
3.MultinomialNB对象的 α \alpha α属性,可以用于设置或获取相应的平滑参数值
实现结果
在这里插入图片描述
改良版:
在这里插入图片描述

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# 1.读取csv文件,将数据集按3:1的比例拆分成训练集和测试集
data = pd.read_csv(r'D:\D\Download\360安全浏览器下载\messages.csv')
split_ratio = 0.75
training_data, testing_data = train_test_split(data, test_size=1 - split_ratio, random_state=0)

# 2.将文本拆分成单词函数
def tokenize(message):
    message = message.lower()
    all_words = re.findall("[a-z0-9]+", message)
    return all_words

# 3.构建词汇表,形成特征矩阵和分类矩阵
def generateMat(data, word_dict):
    num_samples = len(data)
    num_features = len(word_dict)
    feature = np.zeros((num_samples, num_features))
    classify = np.zeros(num_samples)
    for i, (message, cls) in enumerate(data.values):
        classify[i] = cls
        words = tokenize(message)
        for word in words:
            if word in word_dict:
                feature[i][word_dict.index(word)] = 1
    return feature, classify

# 4.根据训练数据生成特征矩阵和分类矩阵,显示训练矩阵特征维度
word_dict = []
for message in training_data["Subject"]:
    words = tokenize(message)
    for word in words:
        if word not in word_dict:
            word_dict.append(word)

training_features, training_classify = generateMat(training_data, word_dict)
print("Training matrix feature dimension:", training_features.shape)

# 5.用训练集训练朴素贝叶斯模型
model = GaussianNB()
model.fit(training_features, training_classify)

# 6.根据测试数据生成特征矩阵和分类矩阵,显示测试矩阵特征维度
testing_features, testing_classify = generateMat(testing_data, word_dict)
print("Testing matrix feature dimension:", testing_features.shape)

# 7.用测试集进行预测
predict_classify = model.predict(testing_features)

# 计算并显示模型的准确率、精度、召回率和F1值
accuracy = accuracy_score(testing_classify, predict_classify)
precision = precision_score(testing_classify, predict_classify)
recall = recall_score(testing_classify, predict_classify)
f1 = f1_score(testing_classify, predict_classify)

print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)

改良版

import pandas as pd
import re
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
 
# 读取CSV文件,将数据集按3:1的比例拆分成训练集合测试集
print("1、读取csv文件数据,并拆分成训练数据和测试数据....")
df = r'D:\D\Download\360安全浏览器下载\messages.csv'
data = pd.read_csv(df)
fp = open(df, encoding="utf-8")
dataset = data.iloc[:, 0]  # 短信内容
labels = data.iloc[:, 1]  # 短信分类结果
 
split_ratio = 0.75  # 75%的训练数据
training_data = []
testing_data = []
np.random.seed(0)
 
x_train, x_test, y_train, y_test = train_test_split(
    dataset, labels, train_size=0.75, random_state=0)
 
xTrain = x_train.reset_index(drop=True)
yTrain = y_train.reset_index(drop=True)
xTest = x_test.reset_index(drop=True)
yTest = y_test.reset_index(drop=True)
 
# 将文本拆分成单词
 
 
def tokenize(message):
    message = message.lower()
    all_words = re.findall("[a-z0-9']+", message)
    return set(all_words)
 
 
print("2、构建词汇表,并形成Feature矩阵和Classify矩阵....")
# 构建词汇表
word_dict = []
for i in range(len(xTrain)):
    te = tokenize(xTrain[i])
    for word in te:
        word_dict.append(word)
 
# print(word_dict)
# print(len(word_dict))
word_dict_set = set(word_dict)
word_dict_done = list(word_dict_set)
num_features = len(word_dict_done)
 
# 生成训练矩阵(特征+标签)
# 构建词汇表,形成特征矩阵和分类矩阵
 
 
def generateMat(data):
    num_samples = len(data)
    feature = np.zeros((num_samples, num_features))
    classify = np.zeros(num_samples)
    for i in range(num_samples):
        te = tokenize(data[i])
        # classify[i] = data[1]    # 有错误,显示是空的字符串,没有解决
        for word in te:
            if word in word_dict_done:
                feature[i][word_dict_done.index(word)] = 1
    return feature
# def generateMat(data):
#     num_samples = len(data)
#     feature = np.zeros((num_samples, num_features))
#     classify = np.zeros(num_samples)
#     for i in range(num_samples):
#         data_row = data[i]
#         classify[i] = data_row[1]
#         for word in data_row[0]:
#             if word in word_dict:
#                 feature[i][word_dict.index(word)] = 1
#     return feature, classify
 
 
xTrain_future = generateMat(xTrain)
xTest_future = generateMat(xTest)
print("3、根据训练数据,形成Feature矩阵和Classify矩阵....")
# 训练集的维度
print("训练矩阵特征维度:", xTrain_future.shape)
# 测试集的维度
print("4、根据测试数据,形成Feature矩阵和Classify矩阵....")
print("测试矩阵特征维度:", xTest_future.shape)
 
# 用训练集训练朴素贝叶斯模型
print("5、训练朴素贝叶斯模型....")
model = MultinomialNB()
model.fit(xTrain_future, yTrain)
 
# 用测试集进行预测
print("6、用测试集进行预测....")
predict_classify = model.predict(xTest_future)
# 计算并显示模型的准确率、精度、召回率和F1值
TN = FP = TP = FN = 0
for i in range(len(predict_classify)):
    if yTest[i] == 0 and predict_classify[i] == 0:
        TN += 1
    if yTest[i] == 0 and predict_classify[i] == 1:
        FP += 1
    if yTest[i] == 1 and predict_classify[i] == 1:
        TP += 1
    if yTest[i] == 1 and predict_classify[i] == 0:
        FN += 1
p = TP / (TP + FP)
r = TP / (TP + FN)
# F1值(是一个平均数,对精度与召回率进行平均的结果)
F1 = 1 / ((1 / 2) * (1 / p + 1 / r))
# 用测试集进行预测
# predict_classify与yPredict一样的
print("7、评价模型,计算准确率、精度、召回率和F1值....")
yPredict = model.predict(xTest_future)
print("Accuracy:", format(accuracy_score(yTest, yPredict)))  # 准确率
print("Precision:", p)  # 精度
print("Recall:", r)  # 召回率
print("F1 Score:", F1)  # F1值

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

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

相关文章

LeetCode【207】课程表

题目&#xff1a; 思路&#xff1a; https://www.jianshu.com/p/25868371ddfc/ 代码&#xff1a; public boolean canFinish(int numCourses, int[][] prerequisites) {// 入度int[] indegress new int[numCourses];// 每个点对应的边,出边Map<Integer, List<Intege…

upload 文件自动上传写法,前后端 下载流文件流

<el-uploadv-model:file-list"fileList":action"app.api/student/student/import":headers"{// Content-Type: multipart/form-data;boundary----split-boundary, 此处切记不要加&#xff0c;否则会造成后端报错 Required request part file is…

Python编程:从入门到实践 (项目3—Web应用程序—学习问题汇总)(新手避坑必看)

本人系统环境&#xff1a; WIN10系统 Python 3.9 Django 2.1.5 书本环境&#xff1a; Python 3.x Django 1.8.5 基于Django 开发一个名为“学习笔记”的项目&#xff0c;这是一个在线的日志系统&#xff0c;能够记录所学习的有关特定主题的知识。 建立项目 要编写一个名为“…

第十周学习记录

阅读MARS MARS创新点&#xff1a; (1)实例感知。模拟器使用独立的网络分别对前景实例和背景环境进行建模&#xff0c;以便可以单独控制实例的静态&#xff08;例如大小和外观&#xff09;和动态&#xff08;例如轨迹&#xff09;属性。 (2)模块化。模拟器允许在不同的 NeRF 主干…

补坑:Java的字符串String类(3):再谈String

不太熟悉字符串的可以看看这两篇文章 补坑&#xff1a;Java的字符串String类&#xff08;1&#xff09;-CSDN博客 补坑&#xff1a;Java的字符串String类&#xff08;2&#xff09;&#xff1a;一些OJ题目-CSDN博客 字符串创建对象 public static void main(String[] args) …

compile: version “go1.19“ does not match go tool version “go1.18.1“

** 1 安装了新版本的go后 为什么go version 还是旧版本&#xff1f; ** 如果你已经按照上述步骤安装了新版本的 Go&#xff0c;但 go version 命令仍然显示旧版本&#xff0c;可能是因为你的环境变量设置不正确或未正确生效。你可以尝试以下方法来解决问题&#xff1a; 重新…

YOLOV5改进:RefConv | 即插即用重参数化重聚焦卷积替代常规卷积,无额外推理成本下涨点明显

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点 3.涨点效果:RefConv,实现有效涨点! 论文地址 …

优雅关闭TCP的函数shutdown效果展示

《TCP关闭的两种方法概述》里边理论基础&#xff0c;下边是列出代码&#xff0c;并且进行实验。 服务端代码graceserver.c的内容如下&#xff1a; #include "lib/common.h"static int count;static void sig_int(int signo) {printf("\nreceived %d datagrams\…

nature日报:为什么印度德里现在的空气污染如此严重?

为什么印度德里现在的空气污染如此严重&#xff1f; 后季风季节为印度大城市的空气污染积累创造了理想的条件。 本文整理扩展自2023年11月10日nature杂志的NEWS EXPLAINER——Why is Delhi’s air pollution so bad right now? (nature.com) Highlights 季风期间&#xff0…

经典与现代:燃木壁炉的家居装饰灵感

燃木壁炉已经成为许多家庭的温馨选择&#xff0c;但在选择时需要考虑一些要点&#xff0c;以确保它适合你的家。让我们用通俗易懂的你们看看如何选择最适合你的燃木壁炉。 首先&#xff0c;考虑你喜欢的风格。燃木壁炉有各种设计&#xff0c;从古老传统到现代时尚都有。如果你…

Centos7安装PostgreSQL 14

环境&#xff1a; Centos7安装PostgreSQL_14版本数据库&#xff1b; 打开官方网站&#xff1a;PostgreSQL: Linux downloads (Red Hat family) 一、 版本选择 复制、粘贴并运行如下脚本&#xff1a; 二、安装步骤 这些命令是在 CentOS 7.x 系统上安装和配置 PostgreSQL 14 的步…

Install Nginx in Linux

Nginx是一款轻量级的Web服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。 1.yum 安装 nginx [rootVM-8-7-centos nginx]# yum install -y nginx Loaded plugins: fastestmirror, lang…

经典猜数游戏(python类封装)

五次机会猜测100以内随机正整数&#xff0c;我用初通的python类封装了代码并清屏上一次猜测提示&#xff0c;难有所增加咯。 (笔记模板由python脚本于2023年11月09日 12:31:30创建&#xff0c;本篇笔记适合掌握python循环和条件分支语句用法&#xff0c;初通python类的coder翻阅…

为什么审计平台不适合进行数据库变更管理?

关于视源电子 广州视源电子科技股份有限公司 (CVTE) 成立于 2005 年 12 月&#xff0c;旗下拥有多家业务子公司。 截至 2022 年底&#xff0c;公司总人数超 6000 人&#xff0c;约 60% 为技术人员。公司的主营业务为液晶显示主控板卡和交互智能平板等显控产品的设计、研发与销…

Shopee收款账户怎么设置?shopee收款方式选哪种

Shopee作为一家领先的电子商务平台&#xff0c;为卖家提供了多种收款方式。无论是在线支付、虚拟账户余额还是线下支付&#xff0c;卖家可以根据自己的需求和交易情况来进行选择。然而&#xff0c;在选择收款方式时&#xff0c;安全性、便捷性和市场适应性是需要考虑虾皮Shopee…

ChatGLM3 langchain_demo 代码解析

ChatGLM3 langchain_demo 代码解析 0. 背景1. 项目代码结构2. 代码解析2-1. utils.py2-2. ChatGLM3.py2-3. Tool/Calculator.py2-4. Tool/Weather.py2-5. main.py 0. 背景 学习 ChatGLM3 的项目内容&#xff0c;过程中使用 AI 代码工具&#xff0c;对代码进行解释&#xff0c;…

SpringMvc 常见面试题

1、SpringMvc概述 1.1、什么是Spring MVC &#xff1f;简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&am…

C++算法:矩阵中的最长递增路径

涉及知识点 拓扑排序 题目 给定一个 m x n 整数矩阵 matrix &#xff0c;找出其中 最长递增路径 的长度。 对于每个单元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外&#xff08;即不允…

学习美团推荐系统质量模型建设

目录 一、背景引入 &#xff08;一&#xff09;基本背景说明 &#xff08;二&#xff09;从推荐系统“数据飞轮”看质量建设必要性 二、质量的定位和考量思考 &#xff08;一&#xff09;对推荐系统质量的思考迭代 &#xff08;二&#xff09;可用性计算的关注点 &#…

FreeRTOS源码阅读笔记3--queue.c

消息队列可以应用于发送不定长消息的场合&#xff0c;包括任务与任务间的消息交换&#xff0c;队列是 FreeRTOS 主要的任务间通讯方式&#xff0c;可以在任务与任务间、中断和任务间传送信息&#xff0c;发送到 队列的消息是通过拷贝方式实现的&#xff0c;这意味着队列存储…