利用SVM(支持向量机)分类算法对鸢尾花数据集进行分类

简介: 本文介绍了如何使用支持向量机(SVM)算法对鸢尾花数据集进行分类。作者通过Python的sklearn库加载数据,并利用pandas、matplotlib等工具进行数据分析和可视化。

利用SVM(支持向量机)分类算法对鸢尾花数据集进行分类

作者:blue

时间:2024.11.12

Tips:安装sklearn步骤(pip install)

pandas也是数据分析中不可或缺的一个包

先安装Numpy,matplotlib,Scripy ===> scikit-learn

image-20250128100301859.png

#本项目为鸢尾花分类的测试项目
#目的是:通过花萼和花瓣的长度和宽度区分所属类别
#探索特征:(sepal length)花萼长度; (sepal width)花萼宽度
#        (petal length)花瓣长度; (petal width)花瓣宽度
#目标特征:(target)所属类别
#目的根据不同特征将不同数据组归分到不同组别里
#SVM(支持向量机)模型:在给定特征数据的情况下,通过找到最优决策平面(超平面),将不同类别的鸢尾花分离
#sklearn中自带鸢尾花数据集
from sklearn.datasets import load_iris
#加载鸢尾花数据集
iris = load_iris()
print(iris)
#这里阐述数据中的主要字段
#data:鸢尾花的特征数据

#target:目标标签,0:山鸢尾(setosa);1:杂色鸢尾(versicolor);3:维吉尼亚鸢尾(virginica)

#target_names:array(['setosa', 'versicolor', 'virginica']

#feature_names:特征名称:(sepal length) (sepal width)  单位都是cm
#                      (petal length)  (petal width)

数据可视化,散点图矩阵

image-20241112150610263.png

图形解释:
对角线上显示各个特征的分布(通常是直方图或密度图)
非对角线是两两特征的之间的

分析可知:

①petal length 和 petal width 上,三个类别的分离是最明显的,花瓣的特征比萼片的相关特征更具有区分性(图11,16)

②petal length 和 petal width 呈现强正相关

③sepal width 与其他特征的相关性较弱

④全图没有明显的离群点

⑤在petal length 和 petal width 的散点图中看起来,至少有一个类别(浅色)看起来是线性可分的

绘制出特征相关性的一个热力图

-1完全不相关,1完全相关,(0.5-0.7)强相关,(0.7-0.9)极强相关

image-20241112152000064.png

#特征标准化
scaler=StandardScaler()
x_scaled = scaler.fit_transform(x)
#fit步骤计算了数据x的均值(mean)和标准差(std),这些统计量将用于后续的数据转换。
#transform步骤使用这些统计量将x中的数据转换为标准化形式,即每个特征的值都减去其均值并除以其标准差,
#从而使每个特征的均值为0,标准差为1。

#----------下面是模型训练和预测-----------#
from sklearn.model_selection import  train_test_split #拆分数据集
from sklearn.svm import SVC #svm模型
from sklearn.metrics import classification_report,accuracy_score#分类评估报告和准确率

#数据集划分,test_size=0.2 (80%作为训练数据集,20%作为测试数据集)
x_train,x_test,y_train,y_test=train_test_split(x_scaled,y,test_size=0.2,random_state=21)

#定义并训练SVM模型
model=SVC(kernel='linear')
model.fit(x_train,y_train)

#预测测试集
y_pred = model.predict(x_test)

#评估模型
accuracy=accuracy_score(y_test,y_pred)
print(f"模型准确率:{accuracy:.2f}")

#输出分类报告
print(classification_report(y_test,y_pred,target_names=iris.target_names))
x_train,x_test,y_train,y_test=train_test_split(x_scaled,y,test_size=0.2,random_state=21)

#x_scaled:这是您之前使用StandardScaler标准化后的特征数据。
#y:这是您的标签数据。
#test_size=0.2:这指定了测试集应该占总数据集的20%。相应地,训练集将占80%。
#random_state=21:这是一个随机种子值,用于确保每次分割时都能得到相同的结果,从而使实验结果可复现。
#函数train_test_split返回四个数组:

#x_train:用于训练模型的特征数据。
#x_test:用于测试模型的特征数据。
#y_train:x_train对应的标签数据。
#y_test:x_test对应的标签数据。

image-20241112160022582.png

  • 准确率(accuracy):模型对所有测试样本预测正确的比例,这里是0.93或93%。
  • 精确度(precision):对于某一类别,模型预测为该类别的样本中,真正属于该类别的比例。对于setosa、versicolor和virginica三类,精确度分别为100%、100%和78%。
  • 召回率(recall):对于某一类别,真正属于该类别的样本中,被模型正确预测为该类别的比例。对于setosa、versicolor和virginica三类,召回率分别为100%、83%和100%。
  • F1分数(f1-score):精确度和召回率的调和平均数,用于综合评估模型的性能。对于setosa、versicolor和virginica三类,F1分数分别为100%、91%和88%。
  • 支持数(support):每个类别中的样本数量。对于setosa、versicolor和virginica三类,支持数分别为11、12和7。
  • 宏平均(macro avg):不考虑类别样本数量的差异,直接计算所有类别的评估指标的平均值。这里的宏平均精确度为93%,召回率为94%,F1分数为93%。
  • 加权平均(weighted avg):考虑类别样本数量的差异,对每个类别的评估指标进行加权平均。这里的加权平均精确度为95%,召回率为93%,F1分数为93%。

从报告中可以看出,模型在setosa类别上的性能非常出色,达到了100%的精确度和召回率。在versicolor类别上,模型也表现得相当不错,尽管召回率略有下降(83%),但精确度仍然保持为100%。然而,在virginica类别上,模型的精确度有所下降(78%),但召回率仍然很高(100%),这可能是由于virginica类别的样本数量较少,导致模型在预测时更容易受到噪声或异常值的影响。

总体而言,该SVM模型在鸢尾花数据集上表现得相当不错,准确率高达93%。然而,值得注意的是,鸢尾花数据集是一个相对简单且平衡的数据集,因此在实际应用中,模型的性能可能会因数据集的复杂性和不平衡性而有所不同。

计算混淆矩阵,并对其可视化,查看各个类别正确与错误样本数

#使用Seaborn进行可视化
plt.figure(figsize=(8,6))
sns.heatmap(cm,annot=True,fmt='d',cmap='Reds',cbar=True)
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()

image-20241112190657989.png

以下是该测试项目的源码

#本项目为鸢尾花分类的测试项目
#目的是:通过花萼和花瓣的长度和宽度区分所属类别
#探索特征:(sepal length)花萼长度; (sepal width)花萼宽度
#        (petal length)花瓣长度; (petal width)花瓣宽度
#目标特征:(target)所属类别
#目的根据不同特征将不同数据组归分到不同组别里
#SVM(支持向量机)模型:在给定特征数据的情况下,通过找到最优决策平面(超平面),将不同类别的鸢尾花分离
from random import random

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
#sklearn中自带鸢尾花数据集
from sklearn.datasets import load_iris
#加载鸢尾花数据集
iris = load_iris()
#print(iris)

#接触行和列的最大值限制,使打印的结果完全展示
pd.set_option('display.max_columns',None)
pd.set_option('display.max_rows',None)

data = pd.DataFrame(iris.data,columns=iris.feature_names)
data['label'] = iris.target
# data.head()#调用了DataFrame的head()方法,该方法默认返回DataFrame的前5行数据。这是一个快速查看DataFrame前几行数据的常用方法,有助于快速了解数据的结构和内容。
# data.info()#查看数据集的基本信息
# data.isnull().sum()#查看是否有缺失值


'''
#print(data.describe())#查看数据集描述性统计

#查看统计,可以得出以下结论
#样本数量:每个特征都有150个样本,数据集是平衡的,没有缺失值
#数据离散性:花瓣长度(petal length(cm))特征有较大的离散性(即标准差(std)比较大),这可能是分类的重要特征
#特征尺度:萼片长度范围比花瓣宽度范围大,SVM对于数据的尺度比较敏感,一般特征之间尺度超过2-3倍,就可以考虑进行特征缩放
'''

'''
#数据可视化,散点图矩阵
plt.figure(figsize=(12,8))#设置图形宽高
sns.pairplot(data,hue='label')#hue='label'参数指定了根据哪个列的值来区分不同的数据点。在这个例子中,label列的不同值将导致数据点以不同的颜色显示,从而可以直观地看到不同类别之间的关系。
plt.tight_layout()
plt.show()
'''

#图形解释
#对角线上显示各个特征的分布(通常是直方图或密度图)
#非对角线是两两特征的之间的散点图

'''
plt.figure(figsize=(10,8))
sns.heatmap(data.corr(),annot=True,cmap='coolwarm')
plt.title("特征相关性")
plt.show()
'''

#创建新特征(花瓣面积和萼片面积)
data['petal_area']=data['petal length (cm)']*data['petal width (cm)']
data['sepal_area']=data['sepal length (cm)']*data['sepal width (cm)']
#data.head()

from sklearn.preprocessing import StandardScaler
#数据标准化
#分离特征与标签
#x是通过drop方法移除标签列'label'后得到的特征数据,而y则是标签数据。axis=1表示操作是在列上进行的。
x=data.drop('label',axis=1)
y=data['label']

#特征标准化
scaler=StandardScaler()
x_scaled = scaler.fit_transform(x)
#fit步骤计算了数据x的均值(mean)和标准差(std),这些统计量将用于后续的数据转换。
#transform步骤使用这些统计量将x中的数据转换为标准化形式,即每个特征的值都减去其均值并除以其标准差,
#从而使每个特征的均值为0,标准差为1。

#----------下面是模型训练和预测-----------#
from sklearn.model_selection import  train_test_split #拆分数据集
from sklearn.svm import SVC #svm模型
from sklearn.metrics import classification_report,accuracy_score#分类评估报告和准确率

#数据集划分,test_size=0.2 (80%作为训练数据集,20%作为测试数据集)
x_train,x_test,y_train,y_test=train_test_split(x_scaled,y,test_size=0.2,random_state=21)

#定义并训练SVM模型
model=SVC(kernel='linear')
model.fit(x_train,y_train)

#预测测试集
y_pred = model.predict(x_test)

#评估模型
accuracy=accuracy_score(y_test,y_pred)
print(f"模型准确率:{accuracy:.2f}")

#输出分类报告
print(classification_report(y_test,y_pred,target_names=iris.target_names))

#计算混淆矩阵,并可视化混淆矩阵,查看各个类别预测正确和错误的样本数
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_pred)
print(cm)

#使用Seaborn进行可视化
plt.figure(figsize=(8,6))
sns.heatmap(cm,annot=True,fmt='d',cmap='Reds',cbar=True)
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()
目录
相关文章
|
4月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
249 6
|
13天前
|
机器学习/深度学习 资源调度 算法
基于入侵野草算法的KNN分类优化matlab仿真
本程序基于入侵野草算法(IWO)优化KNN分类器,通过模拟自然界中野草的扩散与竞争过程,寻找最优特征组合和超参数。核心步骤包括初始化、繁殖、变异和选择,以提升KNN分类效果。程序在MATLAB2022A上运行,展示了优化后的分类性能。该方法适用于高维数据和复杂分类任务,显著提高了分类准确性。
|
5月前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
83 0
|
16天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
|
7天前
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
|
7天前
|
算法 数据安全/隐私保护
基于GA遗传算法的拱桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现拱桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率要求(0.95≤ηq≤1.05),目标是使ηq尽量接近1,同时减少车辆数量和布载耗时。程序在MATLAB 2022A版本下运行,展示了工况1至工况3的测试结果。通过优化模型,综合考虑车辆重量、位置、类型及车道占用等因素,确保桥梁关键部位承受最大荷载,从而有效评估桥梁性能。核心代码实现了迭代优化过程,并输出最优布载方案及相关参数。
|
11天前
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
|
6天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于模糊神经网络的金融序列预测算法matlab仿真
本程序为基于模糊神经网络的金融序列预测算法MATLAB仿真,适用于非线性、不确定性金融数据预测。通过MAD、RSI、KD等指标实现序列预测与收益分析,运行环境为MATLAB2022A,完整程序无水印。算法结合模糊逻辑与神经网络技术,包含输入层、模糊化层、规则层等结构,可有效处理金融市场中的复杂关系,助力投资者制定交易策略。
|
10天前
|
算法 安全 数据安全/隐私保护
基于BBO生物地理优化的三维路径规划算法MATLAB仿真
本程序基于BBO生物地理优化算法,实现三维空间路径规划的MATLAB仿真(测试版本:MATLAB2022A)。通过起点与终点坐标输入,算法可生成避障最优路径,并输出优化收敛曲线。BBO算法将路径视为栖息地,利用迁移和变异操作迭代寻优。适应度函数综合路径长度与障碍物距离,确保路径最短且安全。程序运行结果完整、无水印,适用于科研与教学场景。
|
16天前
|
资源调度 算法 数据可视化
基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF
本项目基于MATLAB2022A实现IEKF迭代扩展卡尔曼滤波算法的数据跟踪仿真,对比EKF和UKF的性能。通过仿真输出误差收敛曲线和误差协方差收敛曲线,展示三种滤波器的精度差异。核心程序包括数据处理、误差计算及可视化展示。IEKF通过多次迭代线性化过程,增强非线性处理能力;UKF避免线性化,使用sigma点直接处理非线性问题;EKF则通过一次线性化简化处理。