Sklearn 损失函数如何应用到_Python机器学习笔记:SVM(4)——sklearn实现

本文介绍了Sklearn中SVM的支持向量机库,包括分类和回归算法,如LinearSVC、NuSVC、SVC、LinearSVR、NuSVR和SVR的参数及核函数。重点讲解了线性核、多项式核、高斯核和Sigmoid核的使用,强调了高斯核在非线性数据上的优势。同时,通过实例展示了SVM模型选择、参数调优的重要性,包括C和gamma参数的影响,并探讨了数据预处理、软间隔问题以及核函数选择对模型性能的影响。
摘要由CSDN通过智能技术生成

4e773e482f895f781a16b71d4717e6e9.png

上一节我学习了SVM的推导过程,下面学习如何实现SVM,具体的参考链接都在第一篇文章中。


对SVM的概念理清楚后,下面我们对其使用sklearn进行实现。

1,Sklearn支持向量机库概述

  我们知道SVM相对感知器而言,它可以解决线性不可分的问题,那么它是如何解决的呢?其思想很简单就是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分,但是在变维之后的空间中样本点是线性可分的,然后再变换后的高维空间中进行分类。

  上面将SVM再赘述了一下,下面学习sklearn中的SVM方法,sklearn中SVM的算法库分为两类,一类是分类的算法库,主要包含LinearSVC,NuSVC和SVC三个类,另一类是回归算法库,包含SVR,NuSVR和LinearSVR三个类,相关模块都包裹在sklearn.svm模块中。

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

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

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

2,回顾SVM分类算法和回归算法

  我们这里仍然先对SVM算法进行回顾,首先对于SVM分类算法,其原始形式如下:

9cd38dead6354ced8d7d61160c20f293.png

  其中 n 为样本个数,我们的样本为(x1, y1),(x2,y2),....(xn, yn),w,b是我们的分离超平面的 wT*xi + b = 0的系数,ξi 为第 i 个样本的松弛系数,C 为惩罚系数,xi (也有时候写为Φ(xi) 为低维到高维的映射函数)为样本数。

  通过拉格朗日以及对偶化后的形式为:

5b9bf220455b3ea933a69eceef852d44.png

  其中和原始形式不同的 α 为拉格朗日系数向量,<xi, xj> 为我们要使用的核函数。

  对于SVM回归算法,(我自己没有总结,借用刘建平老师的博客),其原始形式如下:

cbc11c02c4e9427dbe321a3eb873b605.png

  其中 m 为样本个数,我们的样本为(x1, y1),(x2, y2),....,(xm, ym),w,b是我们回归超平面 wT*xi + b = 0 的系数,ξv, ξ^ 为第 i 个样本的松弛系数, C为惩罚系数,ε 为损失边界,到超平面距离小于 ε 的训练集的点没有损失,Φ(xi) 为低维到高维的映射函数

  通过拉格朗日函数以及对偶后的形式为:

9a1ae4f98213a5e36411bab3f846861a.png

  其中和原始形式不同的 αv, α^ 为拉格朗日系数向量,K(xi, xj) 为我们要使用的核函数。

3,SVM核函数概述

  我在第二篇SVM中学习了核函数,有好几种,最常用的就是线性核函数,多项式核函数,高斯核函数和Sigmoid核函数,在scikit-learn中,内置的核函数也刚好有这四种。

3.1,线性核函数(Linear Kernel)

  线性核函数表达式为:

53dee1291d309dd4b1ca6acc5b62eddc.png

  就是普通的内积,LinearSVC和LinearSVR只能使用它。

3.2,多项式核函数(Polynomial Kernel)

  多项式核函数是线性不可分SVM常用的核函数之一,表达式为:

c4827b32a70465e497b173f7f336f6c3.png

  参数都需要自己调参定义,比较麻烦。

3.3,高斯核函数(Gaussian Kernel)

  高斯核函数,在SVM中也称为 径向基核函数(Radial Basisi Function,RBF),它是libsvm默认的核函数,当然也是sklearn默认的核函数,表达式为:

4113d88ee023224cc9cee6a635e62f70.png

  其中 r 大于0,需要自己调参定义,不过一般情况,我们都使用高斯核函数。

3.4,Sigmoid核函数(Sigmoid Kernel)

  Sigmoid核函数也是线性不可分SVM常用的核函数之一,表示为:

333166c2f8ea788625f62295d43a9133.png

  其中 beta, t 都需要自己调参定义。

  一般情况下,对于非线性数据使用默认的高斯核函数会有比较好的效果,如果你不是SVM调参高手的话,建议使用高斯核来做数据分析。

4,SVM分类算法库参数小结

  下面我们将具体介绍这三种分类方法都有那些参数值以及不同参数值的含义。

4.1, LinearSVC

  其函数原型如下:

class sklearn.svm.LinearSVC(self, penalty='l2', loss='squared_hinge', dual=True, tol=1e-4,
             C=1.0, multi_class='ovr', fit_intercept=True,
             intercept_scaling=1, class_weight=None, verbose=0,
             random_state=None, max_iter=1000)

参数说明

  • penalty :正则化参数,L1 和L2两种参数可选,仅LinearSVC有。默认是L2 正则化,如果我们需要产生稀疏的话,可以选择L1正则化,这和线性回归里面的Lasso回归类似
  • loss:损失函数,有“hinge” 和“squared_hinge” 两种可选,前者又称为L1损失,后者称为L2损失,默认是“squared_hinge”,其中hinge是SVM的标准损失,squared_hinge是hinge的平方。
  • dual:是否转化为对偶问题求解,默认是True。这是一个布尔变量,控制是否使用对偶形式来优化算法。
  • tol:残差收敛条件,默认是0.0001,与LR中的一致。
  • C:惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。默认为1,一般需要通过交叉验证来选择一个合适的C,一般来说,噪点比较多的时候,C需要小一些
  • multi_class:负责多分类问题中分类策略制定,有‘ovr’和‘crammer_singer’ 两种参数值可选,默认值是’ovr’,'ovr'的分类原则是将待分类中的某一类当作正类,其他全部归为负类,通过这样求取得到每个类别作为正类时的正确率,取正确率最高的那个类别为正类;‘crammer_singer’ 是直接针对目标函数设置多个参数值,最后进行优化,得到不同类别的参数值大小。
  • fit_intercept:是否计算截距,与LR模型中的意思一致。
  • class_weight:与其他模型中参数含义一样,也是用来处理不平衡样本数据的,可以直接以字典的形式指定不同类别的权重,也可以使用balanced参数值。如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高,当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个系数,选择默认的None
  • verbose:是否冗余,默认为False
  • random_state:随机种子的大小
  • max_iter:最大迭代次数,默认为1000.

惩罚系数:

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

4.2,NuSVC

  其函数原型如下:

class sklearn.svm.NuSVC(self, nu=0.5, kernel='rbf', degree=3, gamma='auto_deprecated',
             coef0=0.0, shrinking=True, probability=False, tol=1e-3,
             cache_size=200, class_weight=None, verbose=False, max_iter=-1,
             decision_function_shape='ovr', random_state=None)

参数说明

  • nu:训练误差部分的上限和支持向量部分的下限,取值在(0,1)之间,默认是0.5,它和惩罚系数C类似,都可以控制惩罚的力度。
  • kernel:核函数,核函数是用来将非线性问题转化为线性问题的一种方法,默认是“rbf”核函数

      常用的核函数有以下几种:

e84ff41ba034cf8cf360fd656fae21ea.png
  • degree:当核函数是多项式核函数(“poly”)的时候,用来控制函数的最高次数。(多项式核函数是将低维的输入空间映射到高维的特征空间),这个参数只对多项式核函数有用,是指多项式核函数的阶数 n。如果给的核函数参数是其他核函数,则会自动忽略该参数。
  • gamma:核函数系数,默认是“auto”,即特征维度的倒数。核函数系数,只对rbf poly sigmoid 有效。
  • coef0:核函数常数值( y = kx + b 的b值),只有“poly”和“sigmoid” 函数有,默认值是0.
  • max_iter:最大迭代次数,默认值是 -1 ,即没有限制。
  • probability:是否使用概率估计,默认是False。
  • decision_function_shape:与“multi_class”参数含义类似,可以选择“ovo” 或者“ovr”(0.18版本默认是“ovo”,0.19版本为“ovr”) OvR(one vs rest)的思想很简单,无论你是多少元分类,我们都可以看做二元分类,具体的做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除第K类样本以外的所有样本作为负类,然后在上面做二元分类,得到第K类的分类模型。 OvO(one vs one)则是每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1 和 T2的样本放在一起,把T1作为正例,T2 作为负例,进行二元分类,得到模型参数,我们一共需要T(T-1)/2 次分类。从上面描述可以看出,OvR相对简单,但是分类效果略差(这里是指大多数样本分布情况,某些样本分布下OvR可能更好),而OvO分类相对精确,但是分类速度没有OvR快,一般建议使用OvO以达到较好的分类效果
  • chache_size:缓冲大小,用来限制计算量大小,默认是200M,如果机器内存大,推荐使用500MB甚至1000MB

4.3,SVC

  其函数原型如下:

class sklearn.svm.SVC(self, C=1.0, kernel='rbf', degree=3, gamma='auto_deprecated',
             coef0=0
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值