SVM有监督学习LinearSVC, LinearSVR,SVC,SVR -- 024

微信公众号:python宝
关注可了解更多的python相关知识。若有问题或建议,请公众号留言;

内容目录

一、支持向量机 SVM 简介二、LinearSVC, LinearSVR,SVC,SVR参数解释与比较1、LinearSVC介绍2、SVC 介绍3、LinearSVR 介绍4、SVR 介绍三、LinearSVC, LinearSVR,SVC,SVR 比较

一、支持向量机 SVM 简介

  支持向量机(SVM:Support Vector Machine)是机器学习中常见的一种分类算法,是一种二分类模型,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,最终转化为一个凸二次规划问题来求解。支持向量机要做的就是要在这些可以选择的直线中选择一条最好的直线来作为分类的直线。

  • 当训练样本线性可分时,通过硬间隔最大化,学习一个线性可分支持向量机;

  • 当训练样本近似线性可分时,通过软间隔最大化,学习一个线性支持向量机;

  • 当训练样本线性不可分时,通过核技巧和软间隔最大化,学习一个非线性支持向量机。

  给定一些数据点,它们分别属于两个不同的类。我们现在要找到一个线性分类器把这些数据分成AB两类。最简单的办法当然是,画一条线,然后将它们分成两类。线的一侧,属于A类,另一侧,则属于B类。SVM算法可以让我们找到这样一个最佳的线(超平面),来划分数据。相比于KNN之类的算法,SVM算法只需要计算一次,得出最佳线(超平面)即可。面对测试数据,只需要判断数据点落在线的哪一侧,就可以知道该数据点所属分类了。比起KNN每次都需要计算一遍邻居点的分类,SVM算法显得简单无比。

  SVM的基本概念:

  • 分隔超平面:将数据集分割开来的直线叫做分隔超平面;

  • 超平面:如果数据集是N维的,那么就需要N-1维的某对象来对数据进行分割。该对象叫做超平面,也就是分类的决策边界;

  • 间隔:一个点到分割面的距离,称为点相对于分割面的距离。数据集中所有的点到分割面的最小间隔的2倍,称为分类器或数据集的间隔;

  • 最大间隔:SVM分类器是要找最大的数据集间隔,其实就是距离直线距离最短的点离直线的距离要最大;

  • 支持向量:坐落在数据边际的两边超平面上的点被称为支持向量,也就是对于点的犯错的容忍度越大越好,其实就是函数间隔越大越好,我们的拟合直线也将会由着些点确定。

二、LinearSVC, LinearSVR,SVC,SVR参数解释与比较

1、LinearSVC介绍
from sklearn.svm import LinearSVC, LinearSVR,SVC,SVR
LSVC = 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)

# 原文链接:https://blog.csdn.net/u010986753/article/details/96533050

参数解释

  • penalty:正则化参数,L1和L2两种参数可选,仅LinearSVC有。

  • loss:损失函数,有‘hinge’和‘squared_hinge’两种可选,前者又称L1损失,后者称为L2损失,默认是是’squared_hinge’,其中hinge是SVM的标准损失,squared_hinge是hinge的平方。

  • dual:是否转化为对偶问题求解,默认是True。

  • tol:残差收敛条件,默认是0.0001,与LR中的一致。

  • C:惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数,默认值为1.0。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。

  • multi_class:负责多分类问题中分类策略制定,有‘ovr’和‘crammer_singer’ 两种参数值可选,默认值是’ovr’,'ovr'的分类原则是将待分类中的某一类当作正类,其他全部归为负类,通过这样求取得到每个类别作为正类时的正确率,取正确率最高的那个类别为正类;‘crammer_singer’ 是直接针对目标函数设置多个参数值,最后进行优化,得到不同类别的参数值大小。

  • fit_intercept:是否计算截距,与LR模型中的意思一致。

  • class_weight:与其他模型中参数含义一样,也是用来处理不平衡样本数据的,可以直接以字典的形式指定不同类别的权重,也可以使用balanced参数值。

  • verbose:详细输出,默认是False.

  • random_state:随机种子的大小。

  • max_iter:最大迭代次数,默认是1000。

      
    对象

  • coef_:各特征的系数(重要性)。

  • intercept_:截距的大小(常数值)。

2、SVC 介绍
svc = SVC(
    C=1.0,
    kernel='rbf',
    degree=3,
    gamma='auto',
    coef0=0.0,
    shrinking=True,
    probability=False,
    tol=0.001,
    cache_size=200,
    class_weight=None,
    verbose=False,
    max_iter=-1,
    decision_function_shape=None,
    random_state=None)

参数解释:

  • C: float参数 默认值为1.0,错误项的惩罚系数。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。

  • kernel: str参数 默认为‘rbf’,算法中采用的核函数类型,可选参数有:‘linear’:线性核函数、‘poly’:多项式核函数、‘rbf’:径像核函数/高斯核、‘sigmod’:sigmod核函数、‘precomputed’:核矩阵,precomputed表示自己提前计算好核函数矩阵,这时候算法内部就不再用核函数去计算核矩阵,而是直接用你给的核矩阵。还有一点需要说明,除了上面限定的核函数外,还可以给出自己定义的核函数,其实内部就是用你自己定义的核函数来计算核矩阵。

  • degree: int型参数 默认为3,这个参数只对多项式核函数有用,是指多项式核函数的阶数n,如果给的核函数参数是其他核函数,则会自动忽略该参数。

  • gamma: float参数 默认为auto,核函数系数,只对‘rbf’,‘poly’,‘sigmod’有效。如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features.

  • coef0: float参数 默认为0.0,核函数中的独立项,只有对‘poly’和‘sigmod’核函数有用,是指其中的参数c

  • probability:bool参数 默认为False,是否启用概率估计。这必须在调用fit()之前启用,并且会fit()方法速度变慢。

  • shrinking:bool参数 默认为True,是否采用启发式收缩方式

  • tol: float参数 默认为1e^-3,svm停止训练的误差精度

  • cache_size:float参数 默认为200,指定训练所需要的内存,以MB为单位,默认为200MB。

  • class_weight:字典类型或者‘balance’字符串。默认为None,给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C.如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。

  • verbose :bool参数 默认为False,是否启用详细输出。此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。

  • max_iter :int参数 默认为-1,最大迭代次数,如果为-1,表示不限制

  • random_state:int型参数 默认为None,伪随机数发生器的种子,在混洗数据时用于概率估计。

方法:

★fit() 方法:用于训练SVM,具体参数已经在定义SVC对象的时候给出了,这时候只需要给出数据集X和X对应的标签y即可。
★predict() 方法: 基于以上的训练,对预测样本T进行类别预测,因此只需要接收一个测试集T,该函数返回一个数组表示个测试样本的类别。

属性:

  • svc.n_support_:各类各有多少个支持向量;

  • svc.support_:各类的支持向量在训练样本中的索引;

  • svc.support_vectors_:各类所有的支持向量。

3、LinearSVR 介绍
Lsvr = LinearSVR(
    epsilon=0.0,
    tol=0.0001,
    C=1.0,
    loss='epsilon_insensitive',
    fit_intercept=True,
    intercept_scaling=1.0,
    dual=True,
    verbose=0,
    random_state=None,
    max_iter=1000)
4、SVR 介绍
svr = SVR(
    kernel='rbf',
    degree=3,
    gamma='auto_deprecated',
    coef0=0.0,
    tol=0.001,
    C=1.0,
    epsilon=0.1,
    shrinking=True,
    cache_size=200,
    verbose=False,
    max_iter=-1)

参数解释:

  • kernel :string,optional(default ='rbf')指定要在算法中使用的内核类型。它必须是'linear','poly','rbf','sigmoid','precomputed'或者callable之一。如果没有给出,将使用'rbf'。如果给出了callable,则它用于预先计算内核矩阵。

  • degree:int,可选(默认= 3),多项式核函数的次数('poly')。被所有其他内核忽略。

  • gamma :float,optional(默认='auto'),'rbf','poly'和'sigmoid'的核系数。
    当前默认值为'auto',它使用1 / n_features,如果gamma='scale'传递,则使用1 /(n_features * X.std())作为gamma的值。当前默认的gamma''auto'将在版本0.22中更改为'scale'。'auto_deprecated','auto'的弃用版本用作默认值,表示没有传递明确的gamma值。

  • coef0 :float,optional(默认值= 0.0),核函数中的独立项。它只在'poly'和'sigmoid'中很重要。

  • tol :float,optional(默认值= 1e-3),容忍停止标准。

  • C :float,可选(默认= 1.0)错误术语的惩罚参数C.

  • epsilon :float,optional(默认值= 0.1),Epsilon在epsilon-SVR模型中。它指定了epsilon-tube,其中训练损失函数中没有惩罚与在实际值的距离epsilon内预测的点。

  • shrinking :布尔值,可选(默认= True),是否使用收缩启发式。

  • cache_size :float,可选,指定内核缓存的大小(以MB为单位)。

  • verbose详细说明 :bool,默认值:False,启用详细输出。请注意,此设置利用libsvm中的每进程运行时设置,如果启用,则可能无法在多线程上下文中正常运行。

  • max_iter :int,optional(默认值= -1),求解器内迭代的硬限制,或无限制的-1。

三、LinearSVC, LinearSVR,SVC,SVR 比较

  线性模型有线性决策边界(交叉的超平面),而非线性核模型(多项式或者高斯RBF)的弹性非线性决策边界的形状由核种类和参数决定。

  • 对于SVC, NuSVC,和LinearSVC 3个分类的类,SVC和 NuSVC差不多,区别仅仅在于对损失的度量方式不同,而LinearSVC从名字就可以看出,他是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。

  • 对于SVR, NuSVR,和LinearSVR 3个回归的类, SVR和NuSVR差不多,区别也仅仅在于对损失的度量方式不同。LinearSVR是线性回归,只能使用线性核函数。

  我们使用这些类的时候,如果有经验知道数据是线性可以拟合的,那么使用LinearSVC去分类 或者LinearSVR去回归,它们不需要我们去慢慢的调参去选择各种核函数以及对应参数, 速度也快。如果我们对数据分布没有什么经验,一般使用SVC去分类或者SVR去回归,这就需要我们选择核函数以及对核函数调参了。

  • LinearSVC使用的是平方hinge loss,SVC使用的是绝对值hinge loss,我们知道,绝对值hinge loss是非凸的,不能用GD去优化,而平方hinge loss可以;

  • LinearSVC使用的是One-vs-All(也称One-vs-Rest)的优化方法,而SVC使用的是One-vs-One;

  • 对于多分类问题,如果分类的数量是N,则LinearSVC适合N模型,而SVC适合N(N-1)/2模型;

  • LinearSVC基于liblinear,罚函数是对截矩进行惩罚;SVC基于libsvm,罚函数不是对截矩进行惩罚。

About Me:小婷儿

● 本文作者:小婷儿,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用

● 作者博客地址:https://blog.csdn.net/u010986753

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 微信:tinghai87605025 联系我加微信群

● QQ:87605025

● QQ交流群py_data :483766429

● 公众号:python宝 或 DB宝

● 提供OCP、OCM和高可用最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

如果你觉得到文章对您有帮助,欢迎赞赏,有您的支持,小婷儿一定会越来越好!

  • 18
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值