【模式识别实验】对鸢尾花进行SVM实验【python】

系列文章目录

实验一:【模式识别实验】对鸢尾花进行Fisher判别【python】
实验二 :【模式识别实验】对鸢尾花进行SVM实验【python】



一、SVM是什么?

SVM全称为支持向量机(Support Vector Machine),是一种常见的用于分类和回归的机器学习算法。SVM的基本思想是找到可以将不同类别样本区分开的最优超平面,从而实现分类。

超平面可以理解为n维空间中的一个n-1维的平面,对于一个二分类问题,SVM的目标是找到一个最优的超平面将两类样本分开,使得两边的间隔最大化。这时,距离超平面最近的且对分类起决定作用的样本点被称为支持向量。

在SVM中还经常使用核函数(kernel)将样本从原始空间映射到高维空间,从而更好地刻画样本之间的差异。常见的核函数有线性核、多项式核、高斯核等。例如,对于鸢尾花分类,使用径向基函数(RBF)核函数可能更好,可以将样本映射到更高维的空间,达到更好的分类效果。

二、实验内容

使用SVM对鸢尾花数据进行分类

  • 调用sklearn内的SVM模型
  • 使用不同的核函数,并对每个核函数得到的准确率进行分析。
  • 调节参数C,使模型准确率达到最高
  • 分别计算TP(真阳性)、FN(伪阴性)、FP(伪阳率)、TN(真阴性)

三、SVM中的核函数

linear:线性核函数 当训练数据线性可分时,一般用线性核函数,直接实现可分 参数少,速度快 (针对特征的数量大到和样本数量差不多)
poly:多项式核函数 低维输入映射到高维特征 参数很多,多项式阶数较高时,有时候趋于无穷大 (计算量很大)
rbf:径向基核函数/高斯核函数(默认),主要用于线性不可分,gamma值越小,模型越倾向于欠拟合 gamma值越大,模型越倾向于过拟合 (特征的数量小,样本的数量正常,则选用SVM+高斯核函数)
sigmod: sigmod核函数 实现支持向量机实现的就是一种多层神经网络 (一般使用在神经网络的时候)

四、实验步骤

1.引入库

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix

2.读取数据集

dataset = pd.read_csv('D:\桌面应用\模式识别实验\实验二SVM\iris.csv')
X = dataset.iloc[:, :-1].values  # 获取样本特征(除最后一列)    iloc:隐式索引  df.iloc[行,列] 由索引获取,左闭右开 loc:显示索引 df.loc[行,列] 由索引获取,左闭右闭
y = dataset.iloc[:, -1].values  # 获取样本结果标签(取最后一列)

# 将数据集拆分为训练集和测试集   test_size:测试集的划分比例,20%作为测试集    调用sklearn里面的model_selection包的train_test_split()函数可以一行代码划分好数据集。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

:dataset中的路径是你数据集所使用的路径

3.调用核函数并计算模型准确率

# 定义不同核函数的循环列表
kernels = ['linear', 'poly', 'rbf', 'sigmoid']

# 遍历四种核函数,并训练模型并计算准确率
for k in kernels:
    # 先根据当前循环变量k创建一个SVC模型,并使用SVC中的.fit()方法对训练数据集X_train和y_train进行拟合
    model = SVC(kernel=k)
    model.fit(X_train, y_train)
    # 然后使用.predict()方法对测试数据集X_test进行预测
    y_pred = model.predict(X_test)
    # 最后用accuracy_score()函数计算预测结果与真实值之间的准确度,并将其打印出来。
    acc = accuracy_score(y_test, y_pred)
    print('核函数为{}时,模型准确率为{}'.format(k, acc))

# 调整参数C      用rbf核函数,C是SVM算法的正则化参数    c惩罚因子或惩罚系数:用来控制对错误分类的惩罚程度。C值越大,对错误分类的惩罚就越强,这样可能导致过拟合;C值越小,对错误分类的惩罚就越轻,这样可能导致欠拟合。
model = SVC(kernel='rbf', C=1)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print('调节参数后,模型准确率为{}'.format(acc))

4.分别计算TP(真阳性)、FN(伪阴性)、FP(伪阳率)、TN(真阴性)

TP(真阳性): TP、True Positive : 预测为正,实际也为正
FN(伪阴性): FN、False Negative:预测与负,实际为正
FP(伪阳率): FP、False Positive :预测为正,实际为负
TN(真阴性): TN、True Negative :预测为负,实际也为负

# 首先调用sklearn库的confusion_matrix函数,输入测试集的真实标签y_test和模型预测的标签y_pred,得到混淆矩阵matrix
matrix = confusion_matrix(y_test, y_pred)
TP = matrix[1][1]  # 计算TP(真阳性)
FN = matrix[1][0]  # 计算FN(伪阴性)
FP = matrix[0][1]  # 计算FP(伪阳率)
TN = matrix[0][0]  # 计算TN(真阴性)
print('真阳性TP={}, 伪阴性FN={}, 伪阳率FP={}, 真阴性TN={}'.format(TP, FN, FP, TN))

五、实验步结果

在这里插入图片描述


总结

好了,今天的小实验到这里就结束喽,分享快乐哦,嘿嘿,希望能和小伙伴们一起进步。

:相关数据集和实验报告我会上传到我的主页资源中,免费的,有需要可以自取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@¥文竹¥

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值