基于scikit-learn的SVM实战

时间:2021-08-11 18:03:27

写在前面

支持向量机(Support Vector Machine)是一种二类分类模型。他的基本模型是定义在特征空间上的间隔最大的线性分类器,此外如果使用了核技巧之后还可以称为非线性分类器。最近时间比较紧张,就先不整理SVM相关的理论知识点,等以后有时间了再整理(也可以当做复习)。今天这篇主要是以SVM算法的实战(scikit-learn)为主,同时也会提炼几点SVM算法重点知识。

参考:scikit-learn 支持向量机算法库使用小结

1.scikit-learn SVM库简介

scikit-learn中SVM的算法库分为两类,一类是分类的算法库,包括 SVC, NuSVC,和LinearSVC 3个类。另一类是回归算法库,包括 SVR, NuSVR,和LinearSVR 3个类。相关的类都包裹在sklearn.svm模块之中。
对于SVC, NuSVC,和LinearSVC 3个分类的类,SVC和 NuSVC差不多,区别仅仅在于对损失的度量方式不同,而LinearSVC从名字就可以看出,他是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。
同样的,对于SVR, NuSVR,和LinearSVR 3个回归的类, SVR和NuSVR差不多,区别也仅仅在于对损失的度量方式不同。LinearSVR是线性回归,只能使用线性核函数。
我们使用这些类的时候,如果有经验知道数据是线性可以拟合的,那么使用LinearSVC去分类 或者LinearSVR去回归,它们不需要我们去慢慢的调参去选择各种核函数以及对应参数, 速度也快。如果我们对数据分布没有什么经验,一般使用SVC去分类或者SVR去回归,这就需要我们选择核函数以及对核函数调参了。

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

2. SVM大类算法回顾

2.1 SVM分类算法

原始形式:

基于scikit-learn的SVM实战

其中m为样本个数;w,b为分离超平面的系数;ξi为第i个样本的松弛系数; C为惩罚系数。ϕ(xi)为低维到高维的映射函数。

对偶形式:

基于scikit-learn的SVM实战

对偶形式是通过拉格朗日函数将原始形式表达式对偶化得到的,其中α为拉格朗日系数向量,K(xi,xj)为我们要使用的核函数。

2.2 SVM回归算法

原始形式:

基于scikit-learn的SVM实战

其中m为样本个数;w,b是回归超平面的w∙xi+b=0系数; ξ∨i,ξ∧i为第i个样本的松弛系数; C为惩罚系数;ϵ为损失边界,到超平面距离小于ϵ的训练集的点没有损失。ϕ(xi)为低维到高维的映射函数。

对偶形式:

基于scikit-learn的SVM实战

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

3.SVM分类算法库参数小结

基于scikit-learn的SVM实战

基于scikit-learn的SVM实战

基于scikit-learn的SVM实战

基于scikit-learn的SVM实战


4.SVM回归算法库参数小结

基于scikit-learn的SVM实战

基于scikit-learn的SVM实战


5.SVM算法库其他调参要点

上面已经对scikit-learn中类库的参数做了总结,这里对其他的调参要点做一个小结。
    1)一般推荐在做训练之前对数据进行归一化,当然测试集中的数据也需要归一化。。
    2)在特征数非常多的情况下,或者样本数远小于特征数的时候,使用线性核,效果已经很好,并且只需要选择惩罚系数C即可。
    3)在选择核函数时,如果线性拟合不好,一般推荐使用默认的高斯核'rbf'。这时我们主要需要对惩罚系数C和核函数参数γ进行艰苦的调参,通过多轮的交叉验证选择合适的惩罚系数C和核函数参数γ。
    4)理论上高斯核不会比线性核差,但是这个理论却建立在要花费更多的时间来调参上。所以实际上能用线性核解决问题我们尽量使用线性核。


以上~