使用SVM对鸢尾花分类
百度AI Studio中的一个入门项目,增加了自己在实践时的一些注释,对小白来说阅读更顺畅。源码和数据在github上。
任务描述:
构建一个模型,根据鸢尾花的花萼和花瓣大小将其分为三种不同的品种。
数据集
总共包含150行数据
每一行数据由 4 个特征值及一个目标值组成。
4 个特征值分别为:萼片长度、萼片宽度、花瓣长度、花瓣宽度
目标值为三种不同类别的鸢尾花,分别为: Iris Setosa、Iris Versicolour、Iris Virginica
首先导入必要的包:
numpy:python第三方库,用于科学计算
matplotlib:python第三方库,主要用于进行可视化
sklearn:python的重要机器学习库,其中封装了大量的机器学习算法,如:分类、回归、降维以及聚类
import numpy as np
from matplotlib import colors
from sklearn import svm
from sklearn.svm import SVC
from sklearn import model_selection
import matplotlib.pyplot as plt
import matplotlib as mpl
Step1.数据准备
(1)从指定路径下加载数据
(2)对加载的数据进行数据分割,x_train,x_test,y_train,y_test分别表示训练集特征、训练集标签、测试集特征、测试集标签
#*************将字符串转为整型,便于数据加载***********************
#在函数中建立一个对应字典就可以了,输入字符串,输出字符串对应的数字。
def iris_type(s):
# print(type(s))
#字符串加个b是指btypes 字节串类型
it = {b'Iris-setosa':0, b'Iris-versicolor':1, b'Iris-virginica':2}
return it[s]
#加载数据
data_path='./iris.data' #数据文件的路径
data = np.loadtxt(data_path, #数据文件路径
dtype=float, #数据类型
delimiter=',', #数据分隔符
converters={4:iris_type}) #将第5列使用函数iris_type进行转换
# print(data) #data为二维数组,data.shape=(150, 5)
# print(data.shape)
#数据分割
x, y = np.split(data, #要切分的数组
(4,), #沿轴切分的位置,第5列开始往后为y
axis=1) #1代表纵向分割,按列分割
x = x[:, 0:2]
#第一个逗号之前表示行,只有冒号表示所有行,第二个冒号0:2表是0,1两列
#在X中我们取前两列作为特征,为了后面的可视化,原始的四维不好画图。x[:,0:4]代表第一维(行)全取,第二维(列)取0~2
# print(x)
x_train,x_test,y_train,y_test=model_selection.train_test_split(x, #所要划分的样本特征集
y, #所要划分的样本结果
random_state=1, #随机数种子确保产生的随机数组相同
test_size=0.3) #测试样本占比
random_state=1确保了每次运行程序时用的随机数都是一样的,也就是每次重新运行后所划分的训练集和测试集的样本都是一致的,相当于只在第一次运行的时候进行随机划分。如果不设置的话,每次重新运行的种子不一样,产生的随机数也不一样就会导致每次随机生成的训练集和测试集不一致。
Step2.模型搭建
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。 C值小&