Python中支持向量机SVM的使用方法详解


Posted in Python onDecember 26, 2017

除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类。因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm。

一、导入sklearn算法包

Scikit-Learn库已经实现了所有基本机器学习的算法,具体使用详见官方文档说明

skleran中集成了许多算法,其导入包的方式如下所示,

逻辑回归:from sklearn.linear_model import LogisticRegression

       朴素贝叶斯:from sklearn.naive_bayes import GaussianNB

 

K-近邻:from sklearn.neighbors import KNeighborsClassifier

 

决策树:from sklearn.tree import DecisionTreeClassifier

 

支持向量机:from sklearn import svm

 二、sklearn中svc的使用

(1)使用numpy中的loadtxt读入数据文件

loadtxt()的使用方法:

Python中支持向量机SVM的使用方法详解

fname:文件路径。eg:C:/Dataset/iris.txt。

dtype:数据类型。eg:float、str等。

delimiter:分隔符。eg:‘,'。

converters:将数据列与转换函数进行映射的字典。eg:{1:fun},含义是将第2列对应转换函数进行转换。

usecols:选取数据的列。

以Iris兰花数据集为例子:

由于从UCI数据库中下载的Iris原始数据集的样子是这样的,前四列为特征列,第五列为类别列,分别有三种类别Iris-setosa, Iris-versicolor, Iris-virginica。

 

Python中支持向量机SVM的使用方法详解

当使用numpy中的loadtxt函数导入该数据集时,假设数据类型dtype为浮点型,但是很明显第五列的数据类型并不是浮点型。

因此我们要额外做一个工作,即通过loadtxt()函数中的converters参数将第五列通过转换函数映射成浮点类型的数据。

首先,我们要写出一个转换函数:

def iris_type(s):
 it = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}
 return it[s]

接下来读入数据,converters={4: iris_type}中“4”指的是第5列:

path = u'D:/f盘/python/学习/iris.data' # 数据文件路径
data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})

读入结果:

Python中支持向量机SVM的使用方法详解

(2)将Iris分为训练集与测试集

x, y = np.split(data, (4,), axis=1)
x = x[:, :2]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6)

1. split(数据,分割位置,轴=1(水平分割) or 0(垂直分割))。

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')
 clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
 clf.fit(x_train, y_train.ravel())

 

kernel='linear'时,为线性核,C越大分类效果越好,但有可能会过拟合(defaul C=1)。

kernel='rbf'时(default),为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。

decision_function_shape='ovr'时,为one v rest,即一个类别与其他类别进行划分,

decision_function_shape='ovo'时,为one v one,即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。

(4)计算svc分类器的准确率

print clf.score(x_train, y_train) # 精度
y_hat = clf.predict(x_train)
show_accuracy(y_hat, y_train, '训练集')
print clf.score(x_test, y_test)
y_hat = clf.predict(x_test)
show_accuracy(y_hat, y_test, '测试集')

 结果为:

Python中支持向量机SVM的使用方法详解

如果想查看决策函数,可以通过decision_function()实现

print 'decision_function:\n', clf.decision_function(x_train)
print '\npredict:\n', clf.predict(x_train)

 结果为:

Python中支持向量机SVM的使用方法详解Python中支持向量机SVM的使用方法详解

decision_function中每一列的值代表距离各类别的距离。

(5)绘制图像

1.确定坐标轴范围,x,y轴分别表示两个特征

x1_min, x1_max = x[:, 0].min(), x[:, 0].max() # 第0列的范围
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) # 使之与输入的形状相同

这里用到了mgrid()函数,该函数的作用这里简单介绍一下:

假设假设目标函数F(x,y)=x+y。x轴范围1~3,y轴范围4~6,当绘制图像时主要分四步进行:

【step1:x扩展】(朝右扩展):

         [1 1 1]

[2 2 2]

[3 3 3]

【step2:y扩展】(朝下扩展):

[4 5 6]

[4 5 6]

[4 5 6]

【step3:定位(xi,yi)】:

[(1,4) (1,5) (1,6)]

[(2,4) (2,5) (2,6)]

[(3,4) (3,5) (3,6)]

【step4:将(xi,yi)代入F(x,y)=x+y】

因此这里x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]后的结果为:

Python中支持向量机SVM的使用方法详解

再通过stack()函数,axis=1,生成测试点

Python中支持向量机SVM的使用方法详解

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'])
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()

pcolormesh(x,y,z,cmap)这里参数代入x1,x2,grid_hat,cmap=cm_light绘制的是背景。

scatter中edgecolors是指描绘点的边缘色彩,s指描绘点的大小,cmap指点的颜色。

xlim指图的边界。

最终结果为:

Python中支持向量机SVM的使用方法详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python深入学习之特殊方法与多范式
Aug 31 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
Python装饰器(decorator)定义与用法详解
Feb 09 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
如何基于windows实现python定时爬虫
May 01 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
Keras实现将两个模型连接到一起
May 23 Python
Python实现进度条和时间预估的示例代码
Jun 02 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
python使用建议与技巧分享(一)
Aug 17 Python
django使用channels实现通信的示例
Oct 19 Python
详解python中的 is 操作符
Dec 26 #Python
matplotlib简介,安装和简单实例代码
Dec 26 #Python
Python中xrange与yield的用法实例分析
Dec 26 #Python
Python简单计算数组元素平均值的方法示例
Dec 26 #Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 #Python
Python之web模板应用
Dec 26 #Python
通过python+selenium3实现浏览器刷简书文章阅读量
Dec 26 #Python
You might like
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
js实现左右轮播图
2020/01/09 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
python实现反转部分单向链表
2018/09/27 Python
Python提取频域特征知识点浅析
2019/03/04 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
德国高性价比网上药店:medpex
2017/07/09 全球购物
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
求职者应聘的自我评价
2013/10/16 职场文书
五分钟演讲稿
2014/04/30 职场文书
经典禁毒标语
2014/06/16 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
小马王观后感
2015/06/11 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript