SVM核函数

scikit-learn SVM算法库封装了libsvmliblinear 的实现,仅仅重写了算法的接口部分。
scikit-learn中SVM的算法库分为两类,相关的类都包裹在sklearn.svm模块之中。

  • 一类是分类的算法库,包括SVCNuSVC,和LinearSVC 3个类。SVC和 NuSVC差不多,区别仅仅在于对损失的度量方式不同,而LinearSVC从名字就可以看出,他是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。
  • 另一类是回归算法库,包括SVRNuSVR,和LinearSVR 3个类。SVR和NuSVR差不多,区别也仅仅在于对损失的度量方式不同。LinearSVR是线性回归,只能使用线性核函数。

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

什么特殊场景需要使用NuSVC分类 和 NuSVR 回归呢?如果我们对训练集训练的错误率或者说支持向量的百分比有要求的时候,可以选择NuSVC分类 和 NuSVR 。它们有一个参数来控制这个百分比。

在scikit-learn中,内置的核函数一共有4种,当然如果你认为线性核函数不算核函数的话,那就只有三种。

  • 线性核函数(Linear Kernel):表达式为:\(K(x,z)=<x,z>\),就是普通的内积,LinearSVC 和 LinearSVR 只能使用它。

  • 多项式核函数(Polynomial Kernel):是线性不可分SVM常用的核函数之一,表达式为:\(K(x,z)=(γ<x,z>+r)^d\) ,其中,\(γ,r,d\)都需要自己调参定义,比较麻烦。\(d\)默认是3,\(γ\) 默认为'auto',即\(\frac{1}{特征维度}\),\(r\)默认为0.一般需要通过交叉验证选择一组合适的\(γ,r,d\)

  • 高斯核函数(Gaussian Kernel):在SVM中也称为径向基核函数(Radial Basis Function,RBF)它是libsvm默认的核函数,当然也是scikit-learn默认的核函数。表达式为:\(K(x,z)=exp(−γ||x−z||^2)\), 其中,\(γ\)大于0,需要自己调参定义。\(γ\) 默认为'auto',即\(\frac{1}{特征维度}\).一般需要通过交叉验证选择合适的\(γ\).

  • Sigmoid核函数(Sigmoid Kernel):也是线性不可分SVM常用的核函数之一,表达式为\(K(x,z)=tanh(γ<x,z>+r)\), 其中,\(γ,r\)都需要自己调参定义。\(γ\) 默认为'auto',即\(\frac{1}{特征维度}\),\(r\)默认为0.一般需要通过交叉验证选择一组合适的\(γ,r\).

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

  • 一般推荐在做训练之前对数据进行归一化,当然测试集中的数据也需要归一化。。

  • 在特征数非常多的情况下,或者样本数远小于特征数的时候,使用线性核,效果已经很好,并且只需要选择惩罚系数\(C\)即可

  • 在选择核函数时,如果线性拟合不好,一般推荐使用默认的高斯核'rbf'。这时我们主要需要对惩罚系数\(C\)和核函数参数\(γ\)进行艰苦的调参,通过多轮的交叉验证选择合适的惩罚系数\(C\)和核函数参数\(γ\)

  • 理论上高斯核不会比线性核差,但是这个理论却建立在要花费更多的时间来调参上。如果调的不好,可能比线性核函数还要差。所以我们实际应用中,能用线性核函数得到较好效果的都会选择线性核函数。如果线性核不好,我们就需要使用RBF,在享受RBF对非线性数据的良好分类效果前,我们需要对主要的超参数进行选取。

下面是吴恩达的见解:

  1. 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM

  2. 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel

  3. 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况

posted on 2021-04-21 22:36  朴素贝叶斯  阅读(1992)  评论(0编辑  收藏  举报

导航