当前位置: 首页 > news >正文

Python机器学习实战:分类算法之支持向量机-垃圾邮件识别

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。


目录

支持向量机算法介绍

练习题

Python代码与分析

支持向量机和朴素贝叶斯的联系


支持向量机算法介绍

支持向量机(Support Vector Machine, SVM)是一种监督学习算法,主要用于分类和回归问题。它是一种非常强大的模型,因其在高维空间中进行线性和非线性分类的能力而受到广泛欢迎。以下是SVM的一些基本概念和特点:

  1. 线性可分性:SVM最初设计用于解决线性可分问题,即数据点可以通过一个超平面清晰地分开成不同的类别。

  2. 最大间隔:SVM试图找到一个超平面,使得它与最近的数据点(支持向量)之间的距离最大化。这个距离被称为间隔(margin),最大化间隔可以提高模型的泛化能力。

  3. 核技巧:SVM通过核函数将数据映射到更高维的空间,以解决非线性问题。常用的核函数包括线性核、多项式核、径向基函数(RBF)核等。

  4. 优化问题:SVM的训练过程可以看作是一个凸优化问题,目标是找到最大化间隔的同时最小化分类误差的解。这保证了找到的解是全局最优解。

  5. 软间隔和正则化:在实际应用中,数据可能不是完全线性可分的。SVM通过引入软间隔和正则化参数(如C)来允许一定量的误差,以避免过拟合。

  6. 多类分类:SVM最初是为二分类问题设计的,但可以通过多种策略扩展到多类分类问题,如一对一(OvR)、一对余(OvO)等。

  7. 回归问题:SVM也可以用于回归问题,称为支持向量回归(SVR),它尝试找到一条曲线,使得实际值和预测值之间的误差在一定阈值内。

  8. 模型评估:SVM模型的性能通常通过准确率、召回率、F1分数等指标来评估。

SVM是一种非常灵活且强大的算法,适用于许多不同的问题,但它也有一些局限性,比如对核函数和正则化参数的选择敏感,以及在处理大规模数据集时可能需要较长的训练时间。


练习题

对已标注出垃圾邮件和正常邮件的csv文件实现支持向量机算法分类。


Python代码与分析

前6步骤和我们在朴素贝叶斯分类算法介绍的过程一样,主要是数据处理部分。为了分析的完整性,我们将前6步骤再展示一遍。

1、加载必要的Python库。

此时要导入的是sklearn.svm库中的SVC类。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC # 导入支持向量机的类
from sklearn import metrics
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt

2、读取csv文件,把csv文件读入到一个pandas的DataFrame对象里。

然后对数据里面的NULL值,用空字符串(即'')代替。

df1 = pd.read_csv('spamham.csv')
df = df1.where(pd.notnull(df1))
df.head() # 查看数据前5行

3、对Category列进行变换,将取值ham和spam分别改成1或者0,以便进行后续机器学习的训练。

df.loc[df['Category'] == 'ham', 'Category'] = 1
df.loc[df['Category'] == 'spam', 'Category'] = 0
df.head()

4、把Message列作为x,Category列作为y。

df_x = df['Message']
df_y = df['Category']

5、划分数据集,80%用于训练模型,20%用于测试模型。

x_train, x_test, y_train, y_test = train_test_split(df_x, df_y, test_size = 0.2)

6、把Message数据列(x列)转换成机器学习的特征值(关键步骤)。
在这里采用文本的TF-IDF特征。TF表示单个文档里的某个词项的频率,IDF表示整个文集中词项的逆文档频率。IDF把在很多文档中都出现的但对于文档的类别划分没有太多贡献的词项的重要性降低。

tfvec = TfidfVectorizer(min_df = 1, stop_words = 'english', lowercase = True)
x_trainFeat = tfvec.fit_transform(x_train)
x_testFeat = tfvec.transform(x_test)

7、创建支持向量机分类模型,对其进行训练,并且利用模型对测试集进行预测。
在此之前,把训练集中的y转换成整数形式。

y_trainSvm = y_train.astype('int')
classifierModel = SVC(kernel='linear', probability=True)
classifierModel.fit(x_trainFeat, y_trainSvm)
y_pred = classifierModel.predict(x_testFeat)

8、把测试集的y转换成整数形式,对上述模型的预测值进行比较,显示分类器混淆矩阵和分类报告。

y_test = y_test.astype('int')
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

从以上混淆矩阵和分类报告中可以看出,该模型在类别0(垃圾邮件)和类别1(正常邮件)上的预测表现非常好,具有较高的精确度、召回率和F1分数。

总体而言,模型的准确度为98%,表明其在大多数情况下能够正确分类样本。

9、绘制ROC曲线

y_pred_prob = classifierModel.predict_proba(x_testFeat)
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred_prob[:,1])
auc = metrics.auc(fpr, tpr)
print(auc)
auc = 0.9897103887520279
plt.rcParams['font.sans-serif'] = ['Heiti TC']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(fpr, tpr, lw = 2, label = 'ROC曲线(面积 = {:.2f})'.format(auc))
plt.plot([0,1],[0,1],'r--')
plt.xlabel('假正例率') # False Positive Rate
plt.ylabel('真正例率') # True Positive Rate
plt.title('ROC曲线示例') # Receiver operating characteristic example
plt.legend(loc = 'lower right')
plt.show()

图片中的ROC曲线示例展示了一个具有较高AUC值的分类器的性能,表明该模型在区分正负类方面表现良好。


支持向量机和朴素贝叶斯的联系

  1. 监督学习:SVM和朴素贝叶斯都是监督学习算法,需要有标签的数据集进行训练。

  2. 分类问题:两者都可以用于分类问题,尽管它们的工作原理和适用场景不同。

  3. 模型评估:无论是SVM还是朴素贝叶斯,都可以使用相同的评估指标(如准确率、召回率、F1分数)来评价模型性能。

  4. 模型选择:在实际应用中,根据问题的特性和数据集的特点,可能会选择SVM或朴素贝叶斯,或者将它们与其他算法结合使用。

  5. 算法优化:两者都有对应的优化技术,如SVM的核函数选择和朴素贝叶斯的特征选择。

在选择算法时,需要根据具体问题的需求、数据的特性以及预期的性能来决定使用哪种算法。在某些情况下,可能会使用集成方法,结合SVM和朴素贝叶斯的优点,以提高整体的分类性能。


都读到这里了,不妨关注、点赞支持一下吧! 

相关文章:

Python机器学习实战:分类算法之支持向量机-垃圾邮件识别

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。 目录 支持向量机算法介绍 练习题 Python代码与分析 支持向量机和朴素贝叶斯的联系 支持向量机算法介绍 支持向量机&#…...

秒懂Linux之自动化构建工具-make/Makefile

目录 一.前文摘要 二.make/Makefile 一.前文摘要 在学习自动化构建工具前我们先来补充一下动静态库的相关指令 动态库指令 gcc -o 文件(重命名) 源文件 静态库指令 gcc -o 文件(重命名) 源文件 -static 二.make/Makefile 怎么形…...

.net core + vue 搭建前后端分离的框架

目录 步骤一:创建.NET Core后端项目 步骤二:创建Vue.js前端项目 步骤三:集成后端和前端项目 步骤一:创建.NET Core后端项目 安装.NET Core SDK: 确保你的开发环境中已安装了最新版本的.NET Core SDK。你可以从 .NET …...

小阿轩yx-KVM+GFS 分布式存储系统构建 KVM 高可用

小阿轩yx-KVMGFS 分布式存储系统构建 KVM 高可用 案例分析 案例概述 使用 KVM 及 GlusterFS 技术,结合起来实现 KVM 高可用利用 GlusterFS 分布式复制卷对 KVM 虚拟机文件进行分布存储和冗余 分布式复制卷 主要用于需要冗余的情况下把一个文件存放在两个或两个…...

centos安装mysql 5.7版本

因为要继续第二阶段的学习,windows里面的mysql版本,很多设置没有。因此弄了一个虚拟机,安装了centos,在里面安装mysql。 看了《centos安装mysql 5.7版本》里面有设置my.cnf文件,这个在虚拟机里面编辑,手动敲…...

SQL——查询sql执行顺序

在SQL查询中,虽然我们在编写查询时遵循一定的逻辑顺序(SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY),但实际上,数据库在执行这些查询时遵循的是不同的物理执行顺序。这个物理执行顺序是数据库管理系统&#xff0…...

钉耙编程(3)

1001深度自同构 Problem Description 对于无向图中的点,定义一个点的度为与其相连的边的条数。 对于一棵有根树,定义一个点的深度为该点到根的距离。 对于由若干有根树构成的森林,定义该森林是深度自同构的,当且仅当森林中任意…...

python 线程池处理文件

使用多线程来加速文件复制的过程,可以使用Python的concurrent.futures模块中的ThreadPoolExecutor。代码如下: import glob import os import shutil from concurrent.futures import ThreadPoolExecutordef copy_image(image):imagepath image.replace…...

AI技术和大模型对人才市场的影响

012024 AI技术和大模型 2024年AI技术和大模型呈现出多元化和深入融合的趋势,以下是一些关键的技术方向和特点: 1. 生成式AI 生成式AI(Generative AI)在2024年继续快速发展,它能够创造全新的内容,而不仅仅…...

解释“location”和“position”

Explanation of “Location” and “Position” Location and position are terms often used interchangeably in everyday language, but they can have distinct meanings depending on the context. Below, we explore their definitions, differences, and examples of u…...

Netty 必知必会(三)—— ByteBuf

Netty ByteBuf工作原理,和NIO里ByteBuffer区别? Java NIO 提供了ByteBuffer 作为它 的字节容器,但是这个类使⽤起来过于复杂,⽽且也有些繁琐。 ByteBuf是Netty框架中的一个关键类,专门设计来处理字节数据,…...

芋道以开源之名行下作之事 恬不知耻 标榜自己开源 公开源码+sql 不用再加入知识星球

资源 链接: https://pan.baidu.com/s/1TeuxbAUfLQ5_BqMBF1kniQ?pwdcqud 提 取码: cqud 依次为后端、补充版的sql、前端 此文档内安装部署等一应俱全...

wordpress中,wp_posts 文章的状态 有哪些,分别对应什么数值

在WordPress中,wp_posts 表存储了网站上的所有内容,包括文章(posts)、页面(pages)、自定义文章类型(custom post types)等。这个表有一个名为 post_status 的字段,用于标…...

输入成绩问题(c语言)

1.问题:期中考试开始了,大家想要取得好成绩,争夺前五名,从键盘输入n个学生成绩(不超过40个),输出每组的前五名的成绩 两行,第一行输入一个整数,表示n个学生(…...

基于域名+基于ip+基于端口的虚拟主机+上线商务系统

一、回顾 1.jdk环境 tomcat服务器需要jdk环境 版本对应 ​ tomcat9>jdk1.8 配置系统变量JAVA_HOME sed -i $aexport JAVA_HOME/usr/local/jdk22/ /etc/profile sed -i $aexport PATH$JAVA_HOME/bin:$PATH /etc/profile ​ source /etc/profile ​ java -version java…...

vue每次路由跳转前将页面滚动到顶部

在Vue.js应用中,特别是使用Vue Router进行页面路由管理时,router.beforeEach是一个非常有用的导航守卫(Navigation Guard)。它允许你在路由跳转之前执行一些逻辑,比如权限验证、页面跳转前的数据加载、滚动位置重置等。…...

【Qt】QDateTimeEdit

在Qt中,QDateEdit是用于选择日期的微调框,QTimeEdit是用于选择小时和分钟的微调框 QDateTimeEdit则是基于QDateEdit和QTimeEdit的组合控件,能够同时显示日期和时间,并允许用户以交互方式编辑日期 常用属性 属性说明dateTime时间…...

Redis和Mysql如何保持数据一致性

一般情况下,Redis是用来实现应用和数据库之间读操作得缓存层,主要目的是减少数据库IO,还可以提升数据的IO性能。 当应用程序需要去读取某个数据时,会首先尝试去Redis里面加载,如果命中就直接返回,如果没有…...

Java中Optional相关

Java中Optional相关 orElse 提供默认值以确保不会返回 null。 适用于默认情况下的备选值或简单计算结果。 // 如果 optionalName 为空&#xff0c;返回 "Unknown" Optional<String> optionalName Optional.empty(); String result optionalName.orElse(&q…...

AI在HR候选人关系管理中的革新应用

一、引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;其在人力资源管理&#xff08;HR&#xff09;领域的应用也日益广泛。特别是在候选人关系管理方面&#xff0c;AI技术不仅提高了管理效率&#xff0c;还使得候选人体验得到了极大的改善。本文将深入分…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项&#xff0c;设置文件夹共享为总是启用&#xff0c;点击添加&#xff0c;可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download&#xff08;这是我共享的文件夹&#xff09;&…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...