2025-01-28 995 发布于广东
版权
举报
版权声明:
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
简介: 本文介绍了如何使用支持向量机(SVM)算法对鸢尾花数据集进行分类。作者通过Python的sklearn库加载数据,并利用pandas、matplotlib等工具进行数据分析和可视化。
作者:blue
时间:2024.11.12
Tips:安装sklearn步骤(pip install)
pandas也是数据分析中不可或缺的一个包
先安装Numpy,matplotlib,Scripy ===> scikit-learn
#本项目为鸢尾花分类的测试项目 #目的是:通过花萼和花瓣的长度和宽度区分所属类别 #探索特征:(sepal length)花萼长度; (sepal width)花萼宽度 # (petal length)花瓣长度; (petal width)花瓣宽度 #目标特征:(target)所属类别 #目的根据不同特征将不同数据组归分到不同组别里 #SVM(支持向量机)模型:在给定特征数据的情况下,通过找到最优决策平面(超平面),将不同类别的鸢尾花分离
AI 代码解读
#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)
AI 代码解读
数据可视化,散点图矩阵
图形解释:
对角线上显示各个特征的分布(通常是直方图或密度图)
非对角线是两两特征的之间的
分析可知:
①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))
AI 代码解读
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对应的标签数据。
AI 代码解读
准确率(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()
AI 代码解读
以下是该测试项目的源码
#本项目为鸢尾花分类的测试项目 #目的是:通过花萼和花瓣的长度和宽度区分所属类别 #探索特征:(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()
AI 代码解读
相关知识
机器学习实践:基于支持向量机算法对鸢尾花进行分类
日常学习记录——支持向量机、随机森林对鸢尾花数据集进行分类
利用SVM分类算法解析鸢尾花数据集
基于svm的鸢尾花数据集分类
鸢尾花、葡萄酒分类数据集
作业5:SVM实现鸢尾花分类
KNN、NB、SVM实现鸢尾花分类
支持向量机的鸢尾花分类设计及实现
探索MATLAB支持向量机分类:从入门到精通
基于机器学习的鸢尾花数据集的三分类算法的实现 C++
网址: 利用SVM(支持向量机)分类算法对鸢尾花数据集进行分类 https://m.huajiangbk.com/newsview2500237.html
| 上一篇: 鸢尾花数据集knn算法可视化(在 |
下一篇: python机器学习之降维算法P |