首页 > 分享 > 机器学习SVM:基于Python实现的鸢尾花分类问题

机器学习SVM:基于Python实现的鸢尾花分类问题

1.数据集

本程序中所使用的源程序及数据集下载:https://download.csdn.net/download/qq_39783265/11574565
在这里插入图片描述
数据集内包含 3 类鸢尾花,分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。每类各 50 个数据,每条记录有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。数据格式如下:

2.主函数

主函数分5小步,注意数据的读取,delimiter参数是根据txt文件中的分隔符来设置的

from sklearn import svm import numpy as np from sklearn import model_selection import matplotlib.pyplot as plt import matplotlib as mpl from matplotlib import colors if __name__ == '__main__': #1.数据准备 #1.1加载数据 #使用numpy中的loadtxt读入数据文件 filepath='./iris.txt' # 数据文件路径 data=np.loadtxt(filepath,dtype=float,delimiter=None,converters={4:iris_type}) #1.2数据分割 X, y = np.split(data, (4,),axis=1) # np.split 按照列(axis=1)进行分割,从第四列开始往后的作为y 数据,之前的作为X 数据。函数 split(数据,分割位置,轴=1(水平分割) or 0(垂直分割))。 x = X[:,0:2] # 在 X中取前两列作为特征(为了后期的可视化画图更加直观,故只取前两列特征值向量进行训练) x_train,x_test,y_train,y_test=model_selection.train_test_split(x,y,random_state=1,test_size=0.3) # 用train_test_split将数据随机分为训练集和测试集,测试集占总数据的30%(test_size=0.3),random_state是随机数种子 # 参数解释: # x:train_data:所要划分的样本特征集。 # y:train_target:所要划分的样本结果。 # test_size:样本占比,如果是整数的话就是样本的数量。 # random_state:是随机数的种子。 # (随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。 # 随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。) #2.定义模型:SVM模型定义 #搭建模型,训练SVM分类器 # classifier=svm.SVC(kernel='linear',gamma=0.1,decision_function_shape='ovo',C=0.1) # kernel='linear'时,为线性核函数,C越大分类效果越好,但有可能会过拟合(defaul C=1)。 classifier=svm.SVC(kernel='rbf',gamma=0.1,decision_function_shape='ovo',C=0.8) # kernel='rbf'(default)时,为高斯核函数,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。 # decision_function_shape='ovo'时,为one v one分类问题,即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。 # decision_function_shape='ovr'时,为one v rest分类问题,即一个类别与其他类别进行划分。 train(classifier, x_train, y_train) #调用ravel()函数将矩阵转变成一维数组 #4.模型评估 print_accuracy(classifier, x_train, y_train, x_test, y_test) # SVM-输出训练集的准确率为: 0.838095238095 # SVM-输出测试集的准确率为: 0.777777777778 #5.模型可视化 draw(classifier, x)

12345678910111213141516171819202122232425262728293031323334353637383940414243444546

3.子函数封装

# # 当使用numpy中的loadtxt函数导入该数据集时,假设数据类型dtype为浮点型,但是很明显数据集的第五列的数据类型是字符串并不是浮点型。 # # 因此需要额外做一个工作,即通过loadtxt()函数中的converters参数将第五列通过转换函数映射成浮点类型的数据。 # # 首先,我们要写出一个转换函数: # # 定义一个函数,将不同类别标签与数字相对应 def iris_type(s): class_label={b'setosa':0,b'versicolor':1,b'virginica':2} return class_label[s] def train(model, x_train, y_train): model.fit(x_train,y_train.ravel()) def show_accuracy(a, b, tip): acc = (a.ravel() == b.ravel()) print("%s Accuracy:%.3f"%(tip, np.mean(acc))) def print_accuracy(model, x_train, y_train,x_test, y_test ): print('SVM-输出训练集的准确率为:', model.score(x_train, y_train)) print("SVM-输出测试集的准确率为:", model.score(x_test, y_test)) #原始结果与预测结果进行对比 show_accuracy(model.predict(x_train), y_train, 'traing data') show_accuracy(model.predict(x_test), y_test, 'testing data') #计算决策函数的值 print('decision_function:n', model.decision_function(x_train)) def draw(model, x): x1_min, x1_max = x[:, 0].min(), x[:, 0].max() # 第0列的范围 x[:, 0] ":"表示所有行,0表示第1列 x2_min, x2_max = x[:, 1].min(), x[:, 1].max() # 第1列的范围 x[:, 0] ":"表示所有行,1表示第2列 x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j] # 生成网格采样点(用meshgrid函数生成两个网格矩阵X1和X2) grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点,再通过stack()函数,axis=1,生成测试点 # .flat 将矩阵转变成一维数组 (与ravel()的区别:flatten:返回的是拷贝 grid_hat = model.predict(grid_test) # 预测分类值 grid_hat = grid_hat.reshape(x1.shape) # 使之与输入的形状相同 # # 2.指定默认字体 # mpl.rcParams['font.sans-serif'] = [u'SimHei'] # mpl.rcParams['axes.unicode_minus'] = False # 3.绘制 cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF']) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) # alpha = 0.5 plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light) # 预测值的显示 # plt.plot(x[:, 0], x[:, 1], 'o', alpha=alpha, color='blue', markeredgecolor='k') plt.scatter(x[:, 0], x[:, 1], c=np.squeeze(y), edgecolor='k', s=50, cmap = cm_dark ) # 圈中测试集样本 plt.scatter(x_test[:, 0], x_test[:, 1], s=120, facecolors='none', zorder=10) # 圈中测试集样本 plt.xlabel('sepal length', fontsize=13) plt.ylabel('sepal width', fontsize=13) plt.xlim(x1_min, x1_max) plt.ylim(x2_min, x2_max) plt.title('SVM feature', fontsize=15) # plt.grid() plt.show()

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354

4.结果

结果:在这里插入图片描述
在这里插入图片描述

相关知识

Python sklearn实现SVM鸢尾花分类
基于机器学习的鸢尾花数据集的三分类算法的实现 C++
鸢尾花数据集可视化与机器学习模型评估
卷积神经网络实现鸢尾花数据分类python代码实现
第一个机器学习项目(鸢尾花分类问题)
KNN、NB、SVM实现鸢尾花分类
基于svm的鸢尾花数据集分类
机器学习实战:以鸢尾花数据集分类问题为例
机器学习实战第1天:鸢尾花分类任务
如何利用SVM算法实现鸢尾花数据集的分类,并使用Matplotlib进行数据的可视化展示?请提供详细的Python代码实现。

网址: 机器学习SVM:基于Python实现的鸢尾花分类问题 https://m.huajiangbk.com/newsview1842641.html

所属分类:花卉
上一篇: 机器学习:鸢尾花(Iris)分类
下一篇: 合肥市42种花境植物的引种筛选和