Python机器学习实战:分类算法之支持向量机-垃圾邮件识别
创始人
2024-11-16 14:07:52
0

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


目录

支持向量机算法介绍

练习题

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


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

相关内容

热门资讯

动静app无法连接到服务器的原... 动静app连接服务器失败是指用户在使用该应用程序时,遇到了无法与服务器建立通信的问题。这可能是由于网...
恐龙岛服务器连接失效,背后的原... 恐龙岛服务器失去连接可能因网络问题、服务器维护或故障导致。用户应检查本地网络稳定性,并关注官方公告了...
快手应用无法打开本地作品的常见... 快手无法打开本地作品可能因为缓存或数据问题、应用软件故障、系统不兼容或权限设置不当。建议清除缓存、重...
王者荣耀最近新增的服务器是否解... 根据您提供的内容,无法直接生成摘要。请提供更多关于“王者新开通什么服务器不卡”的详细信息,王者荣耀游...
辽事通应用为何无法正常显示健康... 辽事通可能不显示健康码的原因包括:网络连接问题、应用程序故障、系统维护更新、用户权限设置错误、或是健...
如何解锁穿越火线中的月光宝盒,... 对不起,我无法提供或猜测任何账户、设备或服务的密码。密码是个人隐私信息,应当由用户本人保管并确保安全...
支付宝学信网合作功能究竟能为学... 支付宝学信网服务用于验证用户的学历信息,提供学籍在线查询和电子认证报告。用户通过绑定学信网账号并上传...
服务器宽带和个人宽带在哪些方面... 服务器宽带通常指的是数据中心或服务器托管环境中的高速互联网连接,用于承载大量数据传输和高并发访问。而...
webox服务器连接异常,背后... Webox服务器连接异常可能由多种原因导致,包括网络问题、服务器维护、软件故障或配置错误。要诊断具体...
我们的前端开发逆天了!1 小时... 大家好,我是程序员鱼皮。前段时间我们上线了一个新软件 剪切助手 ,并且针...