SVM 支持向量机算法-实战篇
公号:码农充电站pro
主页:https://codeshellme.github.io
上一篇介绍了 SVM 的原理和一些基本概念,本篇来介绍如何用 SVM 处理实际问题。
1,SVM 的实现
SVM 算法即可以处理分类问题,也可以处理回归问题。
sklearn 库的 svm 包中实现了下面四种 SVM 算法:
LinearSVC/R 中默认使用了线性核函数来出处理线性问题。
SVC/R 可以让我们选择是使用线性核函数还是高维核函数,当选择线性核函数时,就可以处理线性问题;当选择高维核函数时,就可以处理非线性问题。
对于线性问题,LinearSVC/R 比 SVC/R 更优秀,因为 LinearSVC/R 中做了优化,效率更高。
如果不知道数据集是否线性可分,可以使用 SVC/R 来处理。
下面主要介绍分类器,回归器的使用跟分类器大同小异。
先来看下 SVC 类的原型:
SVC(C=1.0, kernel='rbf',
degree=3, gamma='scale',
coef0=0.0, shrinking=True,
probability=False,
tol=0.001, cache_size=200,
class_weight=None,
verbose=False, max_iter=- 1,
decision_function_shape='ovr',
break_ties=False,
random_state=None)
其中有几个重要的参数:
- kernel:代表核函数,它有四种选择:
- linear:线性核函数,用于处理线性问题。
- poly:多项式核函数,用于处理非线性问题。
- rbf:高斯核函数,为默认值。用于处理非线性问题,性能比 poly 更好。
- sigmoid:sigmoid 核函数,用于实现多层神经网络 SVM,处理非线性问题。
- C:代表目标函数的惩罚系数,惩罚系数指的是分错样本时的惩罚程度,默认为 1.0。
- 当 C 越大的时候,分类器的准确性越高,但容错率会越低,泛化能力会变差。
- 当 C 越小的时候,泛化能力越强,但是准确性会降低。
- gamma:代表核函数的系数,默认为样本特征数的倒数。
再来看下 LinearSVC 类的原型:
LinearSVC(penalty='l2',
loss='squared_hinge',
dual=True, tol=0.0001,
C=1.0, multi_class='ovr',
fit_intercept=True,
intercept_scaling=1,
class_weight=None,
verbose=0,
random_state=None,
max_iter=1000)
在 LinearSVC 类中没有 kernel 参数,因为默认使用了线性核函数。
2,准备数据集
sklearn 库中自带了一份乳腺癌数据集,下面就使用该数据来构造 SVM 分类器。
这份数据集中采集了一些患者的特征,共包含 569 份数据,每份数据包含 31 个字段,用逗号隔开。在 569 份数据中,一共有 357 个是良性,212 个是恶性。
下面随机抽取了 3 份数据,来看下:
16.13,20.68,108.1,798.8,0.117,0.2022,0.1722,0.1028,0.2164,0.07356,0.5692,1.073,3.854,54.18,0.007026,0.02501,0.03188,0.01297,0.01689,0.004142,20.96,31.48,136.8,1315,0.1789,0.4233,0.4784,0.2073,0.3706,0.1142,0
19.81,22.15,130,1260,0.09831,0.1027,0.1479,0.09498,0.1582,0.05395,0.7582,1.017,5.865,112.4,0.006494,0.01893,0.03391,0.01521,0.01356,0.001997,27.32,30.88,186.8,2398,0.1512,0.315,0.5372,0.2388,0.2768,0.07615,0
13.54,14.36,87.46,566.3,0.09779,0.08129,0.06664,0.04781,0.1885,0.05766,0.2699,0.7886,2.058,23.56,0.008462,0.0146,0.02387,0.01315,0.0198,0.0023,15.11,19.26,99.7,711.2,0.144,0.1773,0.239,0.1288,0.2977,0.07259,1
下面表格给出了每一列数据代表的含义:
列数 | 含义 | 列数 | 含义 | 列数 | 含义 |
---|---|---|---|---|---|
1 | 半径平均值 | 11 | 半径标准差 | 21 | 半径最大值 |
2 | 文理平均值 | 12 | 文理标准差 | 22 | 文理最大值 |
3 | 周长平均值 | 13 | 周长标准差 | 23 | 周长最大值 |
4 | 面积平均值 | 14 | 面积标准差 | 24 | 面积最大值 |
5 | 平滑程度平均值 | 15 | 平滑程度标准差 | 25 | 平滑程度最大值 |
6 | 紧密度平均值 | 16 | 紧密度标准差 | 26 | 紧密度最大值 |
7 | 凹度平均值 | 17 | 凹度标准差 | 27 | 凹度最大值 |
8 | 凹缝平均值 | 18 | 凹缝标准差 | 28 | 凹缝最大值 |
9 | 对称性平均值 | 19 | 对称性标准差 | 29 | 对称性最大值 |
10 | 分形维数平均值 | 20 | 分形维数标准差 | 30 | 分形维数最大值 |
最后一列的含义表示:是否是良性肿瘤,0 表示恶性肿瘤,1 表示是良性肿瘤。
我们可以用 load_breast_cancer
函数来加载该数据集:
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
feature_names
属性存储了每列数据的含义:
>>> print data.feature_names
['mean radius' 'mean texture' 'mean perimeter' 'mean area'
'mean smoothness' 'mean compactness' 'mean concavity'
'mean concave points' 'mean symmetry' 'mean fractal dimension'
'radius error' 'texture error' 'perimeter error' 'area error'
'smoothness error' 'compactness error' 'concavity error'
'concave points error' 'symmetry error' 'fractal dimension error'
'worst radius' 'worst texture' 'worst perimeter' 'worst area'
'worst smoothness' 'worst compactness' 'worst concavity'
'worst concave points' 'worst symmetry' 'worst fractal dimension']
data
属性存储了特征值:
>>> print data.data
[[1.799e+01 1.038e+01 1.228e+02 ... 2.654e-01 4.601e-01 1.189e-01]
[2.057e+01 1.777e+01 1.329e+02 ... 1.860e-01 2.750e-01 8.902e-02]
[1.969e+01 2.125e+01 1.300e+02 ... 2.430e-01 3.613e-01 8.758e-02]
...
[1.660e+01 2.808e+01 1.083e+02 ... 1.418e-01 2.218e-01 7.820e-02]
[2.060e+01 2.933e+01 1.401e+02 ... 2.650e-01 4.087e-01 1.240e-01]
[7.760e+00 2.454e+01 4.792e+01 ... 0.000e+00 2.871e-01 7.039e-02]]
target
属性存储了目标值:
>>> print data.target
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0
1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1
1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1
1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0
1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1
1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1
1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0
0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1
1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1
0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0
1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0 0 0 0 0 0 1]
3,数据预处理
我们知道数据集的前 30 列是特征值,最后一列是目标值。通过观察特征值可知,30 列的特征值,共有10 个维度,可以分为三大类:
- 前 10 列是每个维度的平均值。
- 中 10 列是每个维度的标准差。
- 后 10 列是每个维度的最大值。
因此,我们在训练 SVM 模型时,可以只选择其中一类作为训练集时的特征值。
比如,这里我们选择前 10 列特征作为训练特征(后 20 列忽略):
>>> features = data.data[:,0:10] # 特征集
>>> labels = data.target # 目标集
将数据拆分为训练集和测试集:
from sklearn.model_selection import train_test_split
train_features, test_features, train_labels, test_labels =
train_test_split(features, labels, test_size=0.33, random_state=0)
采用 Z-Score 规范化数据:
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
train_features = ss.fit_transform(train_features)
test_features = ss.transform(test_features)
4,构造分类器
下面使用 SVC 类构造 SVM 分类器:
from sklearn.svm import SVC
svc = svm.SVC() # 均使用默认参数
训练模型:
svc.fit(train_features, train_labels)
用模型做预测:
prediction = svc.predict(test_features)
判断模型准确率:
from sklearn.metrics import accuracy_score
score = accuracy_score(test_labels, prediction)
>>> print score
0.9414893617021277
可以看到准确率为 94%,说明训练效果还是很不错的。
这里是一个关于线性分类器 LinearSVC 的示例,你可以了解一下。
5,总结
sklearn 中实现了 SVM 算法,这里我们展示了如何用它处理实际问题。
除了 sklearn,LIBSVM 也实现了 SVM 算法,这也是一个非常出名的库,你可以自行研究一下。
(本节完。)
推荐阅读:
欢迎关注作者公众号,获取更多技术干货。
SVM 支持向量机算法-实战篇的更多相关文章
- SVM 支持向量机算法-原理篇
公号:码农充电站pro 主页:https://codeshellme.github.io 本篇来介绍SVM 算法,它的英文全称是 Support Vector Machine,中文翻译为支持向量机. ...
- KNN 算法-实战篇-如何识别手写数字
公号:码农充电站pro 主页:https://codeshellme.github.io 上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数 ...
- SVM(支持向量机)算法
第一步.初步了解SVM 1.0.什么是支持向量机SVM 要明白什么是SVM,便得从分类说起. 分类作为数据挖掘领域中一项非常重要的任务,它的目的是学会一个分类函数或分类模型(或者叫做分类器),而支持向 ...
- SVM 支持向量机算法介绍
转自:https://zhuanlan.zhihu.com/p/21932911?refer=baina 参考:http://www.cnblogs.com/LeftNotEasy/archive/2 ...
- SVM支持向量机算法
支持向量机(SVM)是另一类的学习系统,其众多的优点使得他成为最流行的算法之一.其不仅有扎实的理论基础,而且在许多应用领域比大多数其他算法更准确. 1.线性支持向量机:可分情况 根据公式(1)< ...
- 跟我学算法-svm支持向量机算法推导
Svm算法又称为支持向量机,是一种有监督的学习分类算法,目的是为了找到两个支持点,用来使得平面到达这两个支持点的距离最近. 通俗的说:找到一条直线,使得离该线最近的点与该线的距离最远. 我使用手写进行 ...
- 深入浅出理解SVM支持向量机算法
支持向量机是Vapnik等人于1995年首先提出的,它是基于VC维理论和结构风险最小化原则的学习机器.它在解决小样本.非线性和高维模式识别问题中表现出许多特有的优势,并在一定程度上克服了" ...
- 机器学习实战 - 读书笔记(06) – SVM支持向量机
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第6章:SVM 支持向量机. 支持向量机不是很好被理解,主要是因为里面涉及到了许多数学知 ...
- [分类算法] :SVM支持向量机
Support vector machines 支持向量机,简称SVM 分类算法的目的是学会一个分类函数或者分类模型(分类器),能够把数据库中的数据项映射给定类别中的某一个,从而可以预测未知类别. S ...
随机推荐
- react第二单元(react的组件-state-props-setState)
第二单元(react的组件-state-props-setState) 课程目标 理解组件和组件的创建.以及能够根据实际场景去划分合理的组件. 理解并且能够灵活的应用组件中的state.props. ...
- vue第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 )
第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 ) #课程目标 掌握使用props让父组件给子组件传参(重点) 掌握props属性的使用以及prop验证 ...
- 二、Electron + Webpack + Vue 搭建开发环境及打包安装
目录 Webpack + Vue 搭建开发环境及打包安装 ------- 打包渲染进程 Electron + Webpack 搭建开发环境及打包安装 ------- 打包主进程 Electron + ...
- A-交叉熵的使用
交叉熵刻画了两个概率分布之间的距离 但是神经网络的输出却不是一个概率分布 softmax回归可以把前向传播返回的结果变成一个概率分布的问题 在tf中,softmax回归参数被去掉了,只是一个额外的输出 ...
- pandas的学习3-设置值
import pandas as pd import numpy as np # 我们可以根据自己的需求, 用 pandas 进行更改数据里面的值, 或者加上一些空的,或者有数值的列. # 首先建立了 ...
- MySQL高可用(一)主备同步:MySQL是如何保证主备一致的
主备同步,也叫主从复制,是MySQL提供的一种高可用的解决方案,保证主备数据一致性的解决方案. 在生产环境中,会有很多不可控因素,例如数据库服务挂了.为了保证应用的高可用,数据库也必须要是高可用的. ...
- Autofac官方文档翻译--二、解析服务--2隐式关系类型
Autofac 隐式关系类型 Autofac 支持自动解析特定类型,隐式支持组件与服务间的特殊关系.要充分利用这些关系,只需正常注册你的组件,但是在使用服务的组件或调用Resolve()进行类型解析时 ...
- 《改善python程序的91个建议》读书笔记
推荐 <改善Pthon程序的91个建议>是从基本原则.惯用方法.语法.库.设计模式.内部机制.开发工具和性能优化8个方面深入探讨编写高质量python代码的技巧.禁忌和最佳实践. 读书就如 ...
- Impala的count(distinct QUESTION_ID) 与ndv(QUESTION_ID)
在impala中,一个select执行多个count(distinct col)会报错,举例: select C_DEPT2, count(distinct QUESTION_BUSI_ID) as ...
- 【代码周边】MongoDB与Mysql对比以及插入稳定性分析(指定主键的影响)
在数据库存放的数据中,有一种特殊的键值叫做主键,它用于惟一地标识表中的某一条记录.也就是说,一个表不能有多个主键,并且主键不能为空值. 无论是MongoDB还是MySQL,都存在着主键的定义. 对于M ...