【sklearn实例】2--支持向量机SVM

1 支持向量机

  • 思想:
    建立可以分类的超平面,距离超平面最近的点称为支持向量,通过最大化支持向量到超平面的距离,来建立最佳分类超平面,完成分类。
    在这里插入图片描述
    SVM是用来解决二分类问题的有监督学习算法,在引入了核方法之后SVM也可以用来解决非线性问题。

  • 形式:
    线性可分支持向量机(硬间隔):当训练数据线性可分时,可通过硬间隔最大化学得一个线性可分支持向量机。
    线性支持向量机(软间隔):当训练数据近似线性可分时,可通过软间隔最大化学得一个线性支持向量机。
    非线性支持向量机:当训练数据线性不可分时,可通过核方法以及软间隔最大化学得一个非线性支持向量机。

  • 特点

优势:
(1)SVM利用核函数可以实现向高维空间的映射,解决非线性问题;
(2)分类思想简单,即最大化分类边际;
(3)有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,大大简化了通常的分类和回归等问题。
(4)SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性不再取决于样本空间的维数,这在某种意义上避免了“维数灾难”。
(5)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:
①增、删非支持向量样本对模型没有影响;
②支持向量样本集具有一定的鲁棒性;
③有些成功的应用中,SVM 方法对核的选取不敏感

两个不足:
(1) SVM算法对大规模训练样本难以实施
由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法
(2) 用SVM解决多分类问题存在困难
经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。

2 sklearn实现

利用sklearn中自带的dataset,鸢尾花数据库为例,进行二分类。

#载入鸢尾花数据集,datasets自带数据库,房价的、鸢尾花等,
#导入:datasets_load_name(),直接np数组形式
from sklearn import svm,datasets
iris = datasets.load_iris()
#X是特征集,150*4,这里只取其中两列作为特征
X = iris.data[:,(1,2)]
#y是标签集,共012三个类别,这里将1替换为2,化为两个类别
y = iris.target
y[y==1]=2
print y
print X

在这里插入图片描述

import numpy as np
import pylab as pl
#画出散点图
#c=y,以标签值为散点着色,形式为cmap
pl.scatter(X[:, 0], X[:, 1], c=y, cmap=pl.cm.Paired)
#调用SVC(),二分类,采用线性核函数
clf = svm.SVC(kernel='linear',C=0.1)
clf.fit(X,y)

#计算分割超平面
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(2, 4)
yy = a * xx - (clf.intercept_[0]) / w[1]
pl.plot(xx, yy, 'k-')
pl.axis('tight')
# 超平面:a1*X1+a2*X2+b=0,clf.intercept 为截距b,clf.coef为系数 a1 a2(只在线性核时,存在)

#计算上下分割线
b = clf.support_vectors_[0]
yy_down = a * xx + (b[1] - a * b[0])
b = clf.support_vectors_[-1]
yy_up = a * xx + (b[1] - a * b[0])
pl.plot(xx, yy_down, 'k--')
pl.plot(xx, yy_up, 'k--')
#输出系数项,斜率,支持向量等
print("w: ", w)
print("a: ", a)
print("support_vectors_: ", clf.support_vectors_)
print("clf.coef_: ", clf.coef_)
print '支持向量:',clf.support_vectors_
# 获得支持向量的索引
print '支持向量索引:',clf.support_
# 为每一个类别获得支持向量的数量
print '支持向量数量:',clf.n_support_
pl.show()

在这里插入图片描述

3 sklearn SVM调用参数

> # C:错误项的惩罚系数。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。
> # kernel='linear'时,为线性核,C越大分类效果越好,但有可能会过拟合(defaul C=1)。
> # kernel='rbf'时(default),为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。
> # kernel='poly'时,多项式函数,degree 表示多项式的程度-----支持非线性分类。更高gamma值,将尝试精确匹配每一个训练数据集,可能会导致泛化误差和引起过度拟合问题。
> # kernel='sigmoid'时,支持非线性分类。更高gamma值,将尝试精确匹配每一个训练数据集,可能会导致泛化误差和引起过度拟合问题。
> # gamma:float参数 默认为auto。核函数系数,只对‘rbf’,‘poly’,‘sigmod’有效。如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features.
> # decision_function_shape='ovr'时,为one v rest,即一个类别与其他类别进行划分,
> # decision_function_shape='ovo'时,为one v one,即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。
> # probability:bool参数 默认为False,是否启用概率估计。 这必须在调用fit()之前启用,并且会fit()方法速度变慢。
> # cache_size:float参数 默认为200,指定训练所需要的内存,以MB为单位,默认为200MB。
> # class_weight:字典类型或者‘balance’字符串。默认为None,给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C.如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
> # max_iter :int参数 默认为-1,最大迭代次数,如果为-1,表示不限制 model = svm.SVC(C=1.0, kernel='rbf', gamma='auto', decision_function_shape='ovr',cache_size=500)
> 参考:https://blog.csdn.net/xuyaoqiaoyaoge/article/details/82860317?utm_source=copy

猜你喜欢

转载自blog.csdn.net/qq_43243022/article/details/83038736