支持向量机svm
1、概述
支持向量机(SVM,也称为支持向量网络),是机器学习中常用算法之一,svm很强大,可实现的功能很多(在手写数字识别、人脸识别、文本分类、图像分类中应用广泛)。要深入理解svm的原理,需要掌握统计学理论基础。
2、支持向量机分类器
支持向量机的分类方法,是在一组数据分布中找出一个超平面作为决策边界,使模型在数据上的 分类误差尽量小,尤其是在未知数据集上的误差小,即模型泛化能力强。
- 超平面
超平面是一个空间的子空间,它是n维空间小一维的空间。 如果数据空间本身是三维的, 则其超平面是二维平面,而如果数据空间本身是二维的,则其超平面是一维的直线。
在二分类问题中,如果一个超平面能够将数据划分为两个集合,每个集合为一个类别,这个超平面是数据的“决策边界”。
对于一个数据集来说,让训练误差小的决策边界小的有很多,但怎样寻找一个合适的决策边界让其在未知数据上拟合能力也好呢?那就需要看下面的决策边际。
- 决策边际
把决策边界所在的平面向两边平移,直到碰到离这条决策边界最近的数据点后停下,形成两个新的超平面,分别记作 d 1 d_1 d1和 d 2 d_2 d2 ,再将该决策边界移到这两条线的中间, d 1 d_1 d1 d 2 d_2 d2距离的一半叫做这条决策边界的边际(margin) d 。
边际大的决策边界在分类中的泛化误差更小。如果边际很小,则加入新的数据点后就会对决策边界的分类产生很大的影响。边际很小一般在训练集上表现很好,在测试集上表现差,即容易出现过拟合。所以在确定决策边界时,边际越大越好。
支持向量机,就是通过找出边际最大的决策边界,来对数据进行分类的分类器。所以,支持向量分类器又叫做最大边际分类器。
那么怎么找到决策边界,求解决策边际,这就需要一大串的数学推理求解过程了。光求解决策边界就要经历繁琐的数学逻辑推理,并且我很多地方都不能很好理解到。。。。所以这一块还需要再多去补补。
3、sklearn中的支持向量机
skleran.svm.SVC(C=1.0,kernel='rbf‘)
- 常用的类
类 | 含义 |
---|---|
svm.LinearSVC | 线性支持向量分类 |
svm.LinearSVR | 线性支持向量分类 |
svm.SVC | 非线性多维支持向量分类 |
svm.SVR | 非线性多维支持向量回归 |
svm.OneClassSVM | 无监督异常值检测 |
- 核函数(kernel function)
核函数必须是对称函数,每个核函数都对应一个特征空间,特征空间是否得当对支持向量机的性能至关重要。
对于线性数据来说,很容易找到一条直线或者平面,来将数据划分开。但对于一些非线性数据,如环形数据,就不容易找到这样一个超平面。所以 ,我们需要对数据就行处理,,因为数据在低维不可分,但是可能在高维空间是可分的。我们可以进行一个升维变化,将数据从原始的低维空间映射到到新空间中,使他可分,通常是。而解决这些问题需要用到核函数。
选用不同的核函数,就可以解决不同数据分布下的寻找超平面问题。
kernel 的值可为:
linear : 线性核 ——线性
poly :多项式核——偏线性
sigmoid :双曲正切核(tanh)——非线性
rbf :高斯径向基——偏非线性
linear核函数只能处理线性数据,其他核函数都能处理线性和非线性,rbf,高斯径向基rbf基本在任何数据集上都表现不错,比较万能,建议优先选用。
- 参数C——松弛系数的惩罚项系数
当两组数据是完全线性可分(可以找出一个决策边界使得训练集上的分类误差为0)就称该数据是存在硬间隔的。当两组数据几乎是完全线性可分的,但决策边界在训练集上存在较小的训练误差,这两种 数据就被称为是存在软间隔(soft magrin)。(因为有时候貌似线性可分是由于过拟合引起的,所以要允许支持向量机少量出错)
引入这两个概念后,此时,决策边界需要考虑硬间隔和软间隔了(即训练样本被分错的数量),参数C就是来使训练样本的错误分类尽可能少的同时使决策函数的边际d最大化。
C又叫做松弛系数的惩罚项系数(听到惩罚项系数,是不是想起来正则化,,) : 浮点数,默认1,必须大于等于0,可不填。
如果C值设定较大,那SVC可能会选择边际较小的,训练点分类正确的决策边界,不过模型的训练时间也会更长。如果C的设定值较小,那SVC优先考虑最大化边界,就会牺牲训练的准确度。在算法中,没有一个算法能真正做到万能,很多时候都是鱼与熊掌不可兼得。
如果我们的数据很杂,往往减小C。
- 其他参数gamma,degree
这两个参数都是核函数的相关参数,配合核函数使用
degree——整数,可不填,默认3,多项式核函数poly的次数.
gamma——浮点数,可不填,默认“auto",在Kernel=”rbf",“poly"和"sigmoid”的时使用
输入“auto”,自动使用1/(n_features)作为gamma的取值
输入"scale",则使用1/(n_features * X.std())作为gamma的取值
输入"auto_deprecated",则表示没有传递明确的gamma值(不推荐使用)
coef0——浮点数,可不填,默认=0.0,在参数kernel='poly’和’sigmoid’时用
// 实现svc的基本流程
from sklearn.svm import SVC
clf = SVC(C=1.0,kernel="rbf",gamma="auto",cache_size=5000,random_state=200) //实例化 C默认1.0
clf = clf.fit(X_train, y_train) //开始训练
result = clf.score(X_test, y_test)