首页 > 分享 > 利用SVM分类算法解析鸢尾花数据集

利用SVM分类算法解析鸢尾花数据集

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

作者:blue

时间:2024.11.12

Tips:安装sklearn步骤(pip install)

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

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

在这里插入图片描述

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

#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) 1234567891011121314

数据可视化,散点图矩阵

在这里插入图片描述

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

分析可知:

①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)极强相关

在这里插入图片描述

#特征标准化 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))

12345678910111213141516171819202122232425262728

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对应的标签数据。 123456789101112

在这里插入图片描述

准确率(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() 1234567

在这里插入图片描述

以下是该测试项目的源码

#本项目为鸢尾花分类的测试项目 #目的是:通过花萼和花瓣的长度和宽度区分所属类别 #探索特征:(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()

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110

相关知识

如何利用SVM算法实现鸢尾花数据集的分类,并使用Matplotlib进行数据的可视化展示?请提供详细的Python代码实现。
基于svm的鸢尾花数据集分类
【视觉算法—图像分类】基于SVM实现鸢尾花数据集分类
KNN、NB、SVM实现鸢尾花分类
python鸢尾花分类svm测试集
在Python中如何使用SVM算法对鸢尾花数据集进行分类,并用Matplotlib实现数据的可视化展示?请提供具体的步骤和代码示例。
基于机器学习的鸢尾花数据集的三分类算法的实现 C++
KNN算法实现鸢尾花数据集分类
【机器学习】基于KNN算法实现鸢尾花数据集的分类
作业5:SVM实现鸢尾花分类

网址: 利用SVM分类算法解析鸢尾花数据集 https://m.huajiangbk.com/newsview1641229.html

所属分类:花卉
上一篇: 红枣含铁高吗
下一篇: 果渣枣核干馏制炭设备 实现资源化