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

news2024/9/21 16:19:33

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


目录

支持向量机算法介绍

练习题

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和朴素贝叶斯的优点,以提高整体的分类性能。


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时尚好看的APPUI设计离不开社交属性

时尚好看的APP UI设计离不开社交属性 艾斯视觉作为ui设计和前端开发从业者,其观点始终认为:移动应用程序(APP)已成为人们日常生活中不可或缺的一部分。一个时尚好看的APP UI设计不仅能够吸引用户,更能提升用户体验。而…

产品经理必备:8大高效的需求跟踪工具

本文将分享8款主流需求进度跟踪工具:PingCode、Worktile、Teambition、禅道、Tapd、Trello、Wrike、Monday.com。 每个产品经理都面临着如何有效监控项目进展、确保团队与目标同步的问题。选择合适的工具不仅可以减少误会和延误,还能显著提升团队的生产效…

【第六节】python的特殊语法和常用模块

目录 一、特殊语法 1.1 高阶函数 1.2 函数嵌套 1.3 装饰器 二、常用的模块 2.1 time模块 2.1.1 时间的表示方式 2.1.2 time 的使用方式 2.2 datetime 模块 2.2.1 datetime 模块总览 2.2.2 date 类 2.2.3 time 类 2.2.4 datetime 类 2.2.5 timedelta 类 2.3 rand…

轻松应对5W家企业月度排查!这家国企是如何做到的?

国央企的内控合规体系建设一直都是重中之重,今年年初国资委也提到要加强重要领域、重要业务、重要人员和关键环节的内控监督,构建全覆盖内控责任体系。 那么,国央企该如何响应政策号召,快速完善风险合规内控“三位一体”管控体系…

MATLAB(8)深度变化模型

一、前言 在MATLAB中模拟深度变化模型通常依赖于具体的应用场景,比如海洋深度、地下水深度、地形高度变化等。由于“深度变化”可以涉及多种物理过程和数学模型,我将提供一个简化的示例,该示例模拟了一个基于时间变化的深度变化模型&#xff…

nginx常见命令与报错

ps:macOS系统,以下内容是mac电脑,且使用brew安装的,其他慎看,因为安装位置等信息可能会略有不同 1.下载Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/…

商家转账到零钱2024最新开通必过攻略

微信支付商家转账到零钱功能申请设置了人工审核的门槛,本意是为了防止没有合规使用场景的商户滥用该功能,但这也让相当多的真实用户被一次次拒之门外。结合过去6年开通此类产品的经验,今天我们就以2024年最新的的商家转账到零钱的开通流程做一…

vmstat 内存排查的大杀器之一

主要作用 vmstat 为linux下提供的一个性能诊断工具。 内存排查方面,可以用它查看: 虚拟内存使用量空闲内存剩余量活跃内存量非活跃内存量缓冲内存使用量缓存内存使用量 硬盘排查方面,可以用它查看: 读/写磁盘总次数读/写磁盘扇…

15.2 zookeeper java client之Zookeeper官方使用(❤❤❤❤)

15.2 zookeeper java client 1. Zookeeper官方1.1 依赖1.2 Zookeeper客户端连接测试1.3 Zookeeper节点操作1.3.1 zooKeeper.create创建节点1.3.2 zooKeeper.exists获取节点详情1.3.3 zooKeeper.getData获取节点数据1.3.4 zooKeeper.getChildren获取节点下所有子节点名称1.3.5 …

Javaweb项目|springboot学生评奖评优管理系统的设计与实现

收藏点赞不迷路 关注作者有好处 文末获取源码 一、系统展示 二、万字文档展示 基于springboot学生评奖评优管理系统的设计与实现 开发语言:Java 数据库:MySQL 技术:SpringSpringMVCMyBatisVue 工具:IDEA/Ecilpse、Navicat、Mav…

心动小站Ⅷ--全球近40%的工作岗位可能受到人工智能威胁

国际货币基金组织1月14日发布的报告估计,全球近40%的工作岗位可能受到人工智能崛起的威胁。 人工智能将越来越深入地融入几乎每一个行业。世界正在向前发展,如果你不跟上,就会落后。 为了避免落后,我们需要做两件事:…

代码审计:zzcms 2019

代码审计&#xff1a;zzcms 2019 漏洞列表如下(共计65个漏洞&#xff0c;附Exp&#xff0c;按时间顺序)&#xff1a; 未完待续… 1、install/index.php 8行处存在变量覆盖漏洞(影响install/step_6.php) Exp:http://127.0.0.3/install/index.php Post:admin<script>aler…

SmartEDA:解锁设计新境界,从工具到灵感的飞跃之旅!

在这个数据驱动的时代&#xff0c;每一次点击、每一次滑动都蕴含着无限的可能与洞察。然而&#xff0c;在众多数据分析工具中&#xff0c;SmartEDA不仅仅是一把解锁数据奥秘的钥匙&#xff0c;它更是一座桥梁&#xff0c;连接着冰冷的数据世界与创意无限的设计灵感之源。今天&a…

Nacos身份认证绕过的方法

因为在攻防或渗透的一些安全服务过程中&#xff0c;我们经常会遇到在公网能访问到的Nacos系统&#xff0c;按理来说这些系统都是要收缩到内网里面的&#xff0c;所以遇到这种情况我们肯定是要去尝试下能否进入到后台&#xff0c;之前团队搞过这类的实验&#xff0c;那就结合这次…

若依替换logo

别忘了清除浏览器缓存

Hive3:客户端工具DBeaver连接Hive

参考&#xff1a;DBeaver连接hive&#xff08;详细图解&#xff09; 这里&#xff0c;需要说明一点&#xff0c;在添加驱动的时候&#xff0c;你可能不知道自己需要什么版本的驱动 我的办法是&#xff0c;先通过IDEA链接上hive&#xff0c;然后&#xff0c;查看IDEA下载的版本…

kvm-fuzz:使用KVM技术对闭源用户空间二进制文件执行模糊测试

关于kvm-fuzz kvm-fuzz是一款功能强大的模糊测试工具&#xff0c;该工具能够利用KVM技术对闭源用户空间x86_64二进制文件执行模糊测试。 KVM介绍 虚拟化是云计算的基础&#xff0c;一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff08;CPU、内存、磁盘空间、网…

dataOptions.call is not a function(vue3)

我在网上看了很多案例&#xff0c;但是好像和我项目中的 bug 都不一样&#xff0c;然后我自己尝试复现&#xff0c;也出现了这个 报错&#xff0c;但是我还没有对比我项目中的代码&#xff0c;因为是 vue2 升 vue3 的&#xff0c;代码量有点多&#xff0c;所以先记录一下目前这…

[C++]智能指针

一、RAII RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种利用对象生命周期来控制程序资源&#xff08;如内 存、文件句柄、网络连接、互斥量等等&#xff09;的简单技术。 在对象构造时获取资源&#xff0c;接着控制对资源的访问使之在对象的生命…

【Android】数据存储之SQLite数据库知识总结

文章目录 SQL数据类型创建表格删除表格修改表格 数据库管理器SQLiteDatabase数据库的创建与删除 SQLiteOpenHelper使用步骤新建数据库操作类增删改查方法使用 SQLite 数据库版本更新 相关知识点ContentValues 类Cursor SQL SQL本质上是一种编程语言&#xff0c;它的学名叫作&qu…