python中svm的使用,svm支持向量机算法
支持向量机除了在Matlab中使用PRTools工具箱中的svm算法外,在Python中还可以用于分类。因为Python中的sklearn库也集成了SVM算法,所以本文的运行环境是Pycharm。
一、导入sklearn算法包
SCI-KIT-LEARN库实现了基本机器学习的所有算法。详情可参考官方文档:http://SCI-KIT-LEARN.org/stable/auto _ examples/index . html #支持向量机(support-vector-machines)。
Skleran集成了很多算法,其导入包的方式如下:
逻辑回归:从sklearn.linear _ model导入逻辑回归
朴素贝叶斯:来自sklearn.naive _ Bayes导入高斯NB
来自sklearn的:邻居。邻居进口邻居分类器
决策树:从sklearn.tree导入决策树分类器
支持向量机:从sklearn导入svm
二、sklearn中svc的使用
(1)使用numpy中的loadtxt读取数据文件。
如何使用load():
fname :文件路径。例如:C:/Dataset/iris.txt .
类型:数据类型。例如:浮点、字符串等。
分隔符:分隔符。例如:, .
转换器:将数据列映射到转换函数的字典。
: { 1: fun },意思是转换第二列中对应的转换函数。
使用列:选择数据列。
以蝴蝶兰数据集为例:
由于从UCI数据库下载的原始鸢尾数据集看起来是这样的,前四列是特征列,第五列是类别列,包括三个类别:鸢尾-刚毛鸢尾、鸢尾-杂色鸢尾和鸢尾-海滨鸢尾。
在使用numpy中的loadtxt函数导入这个数据集时,假设数据类型dtype为浮点型,但是很明显第五列的数据类型不是浮点型。
所以我们要多做一项工作,就是通过loadtxt()函数中的converters参数,由转换函数将第五列映射成浮点数据。
首先,我们必须写一个转换函数:
defiris _类型:
它={ 鸢尾-刚毛鸢尾 :0,鸢尾-杂色鸢尾 :1,鸢尾-海滨鸢尾 :2}
Returnit[s]接下来,读入数据。converters={4: iris_type}中的“4”是指第5列:
Path=uD:/f disk /pyt
hon/学习/iris.data'#数据文件路径
data=np.loadtxt(path,dtype=float,delimiter=',',converters={4:iris_type})读入结果:
(2)将Iris分为训练集与测试集
x,y=np.split(data,(4,),axis=1)1.split(数据,分割位置,轴=1(水平分割) or 0(垂直分割))。x=x[:,:2]
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=1,train_size=0.6)
2.x = x[:, :2]是为方便后期画图更直观,故只取了前两列特征值向量训练。
3.sklearn.model_selection.train_test_split随机划分训练集与测试集。train_test_split(train_data,train_target,test_size=数字, random_state=0)
参数解释:
·train_data:所要划分的样本特征集
·train_target:所要划分的样本结果
·test_size:样本占比,如果是整数的话就是样本的数量
·random_state:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。
(3)训练svm分类器
#clf=svm.SVC(C=0.1,kernel='linear',decision_function_shape='ovr')kernel='linear'时,为线性核,C越大分类效果越好,但有可能会过拟合(defaul C=1)。clf=svm.SVC(C=0.8,kernel='rbf',gamma=20,decision_function_shape='ovr')
clf.fit(x_train,y_train.ravel())
kernel='rbf'时(default),为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。
decision_function_shape='ovr'时,为one v rest,即一个类别与其他类别进行划分,
decision_function_shape='ovo'时,为one v one,即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。
(4)计算svc分类器的准确率
printclf.score(x_train,y_train)#精度结果为:y_hat=clf.predict(x_train)
show_accuracy(y_hat,y_train,'训练集')
printclf.score(x_test,y_test)
y_hat=clf.predict(x_test)
show_accuracy(y_hat,y_test,'测试集')
如果想查看决策函数,可以通过decision_function()实现
print'decision_function:\n',clf.decision_function(x_train)结果为:print'\npredict:\n',clf.predict(x_train)
decision_function中每一列的值代表距离各类别的距离。
(5)绘制图像
1.确定坐标轴范围,x,y轴分别表示两个特征
x1_min,x1_max=x[:,0].min(),x[:,0].max()#第0列的范围这里用到了mgrid()函数,该函数的作用这里简单介绍一下:x2_min,x2_max=x[:,1].min(),x[:,1].max()#第1列的范围
x1,x2=np.mgrid[x1_min:x1_max:200j,x2_min:x2_max:200j]#生成网格采样点
grid_test=np.stack((x1.flat,x2.flat),axis=1)#测试点
#print'grid_test=\n',
grid_testgrid_hat=clf.predict(grid_test)#预测分类值
grid_hat=grid_hat.reshape(x1.shape)#使之与输入的形状相同
假设假设目标函数F(x,y)=x+y。x轴范围13,y轴范围46,当绘制图像时主要分四步进行:
【step1:x扩展】(朝右扩展):
[111]【step2:y扩展】(朝下扩展):[222]
[333]
[456]【step3:定位(xi,yi)】:[456]
[456]
[(1,4)(1,5)(1,6)]【step4:将(xi,yi)代入F(x,y)=x+y】[(2,4)(2,5)(2,6)]
[(3,4)(3,5)(3,6)]
因此这里x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]后的结果为:
再通过stack()函数,axis=1,生成测试点
2.指定默认字体
mpl.rcParams['font.sans-serif']=[u'SimHei']3.绘制mpl.rcParams['axes.unicode_minus']=False
cm_light=mpl.colors.ListedColormap(['#A0FFA0','#FFA0A0','#A0A0FF'])pcolormesh(x,y,z,cmap)这里参数代入x1,x2,grid_hat,cmap=cm_light绘制的是背景。cm_dark=mpl.colors.ListedColormap(['g','r','b'])
plt.pcolormesh(x1,x2,grid_hat,cmap=cm_light)
plt.scatter(x[:,0],x[:,1],c=y,edgecolors='k',s=50,cmap=cm_dark)#样本
plt.scatter(x_test[:,0],x_test[:,1],s=120,facecolors='none',zorder=10)#圈中测试集样本
plt.xlabel(u'花萼长度',fontsize=13)
plt.ylabel(u'花萼宽度',fontsize=13)
plt.xlim(x1_min,x1_max)
plt.ylim(x2_min,x2_max)
plt.title(u'鸢尾花SVM二特征分类',fontsize=15)
#plt.grid()
plt.show()
scatter中edgecolors是指描绘点的边缘色彩,s指描绘点的大小,cmap指点的颜色。
xlim指图的边界。
最终结果为:
盛行IT软件开发工作室,大量的免费python视频教程,欢迎在线学习!
本文转自:https://www.jianshu.com/p/7367245ea990
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。