系列文章目录
实验一:【模式识别实验】对鸢尾花进行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))
五、实验步结果
总结
好了,今天的小实验到这里就结束喽,分享快乐哦,嘿嘿,希望能和小伙伴们一起进步。
注
:相关数据集和实验报告我会上传到我的主页资源中,免费的,有需要可以自取!