skiti-learn 支持向量机类库(SVM)

SVM算法库分为两类,一类是分类算法库,SVC,NuSVC,LinearSVC;另一类是回归算法库,SVR,NuSVR,LinearSVR。
分类算法库中,SVC,NuSVC差不多,区别在于损失的度量方式不同;LinearSVC是线性分类,不支持从低维到高维的核函数,仅仅支持线性核函数,对线性不可分数据不能使用。同样,SVR,NuSVR和LinearSVR与分类算法库类似,不过是用作回归。
如果有经验知道数据是线性可以拟合的,那么使用LinearSVC去分类 或者LinearSVR去回归,它们不需要我们去慢慢的调参去选择各种核函数以及对应参数, 速度也快。如果我们对数据分布没有什么经验,一般使用SVC去分类或者SVR去回归,这就需要我们选择核函数以及对核函数调参了。如果我们对训练集训练的错误率或者说支持向量的百分比有要求的时候,可以选择NuSVC分类 和 NuSVR 。它们有一个参数来控制这个百分比。

  1. SVM分类和回归算法
    SVM分类算法最原始形式:
    在这里插入图片描述
    其中m为样本个数,我们的样本为(x1,y1),(x2,y2),…,(xm,ym)。w,b是我们的分离超平面的w∙ϕ(xi)+b=0系数, ξi为第i个样本的松弛系数, C为惩罚系数。ϕ(xi)为低维到高维的映射函数。
    经过拉格朗日和对偶化的形式:
    在这里插入图片描述
    和原始形式不同的α为拉格朗日系数向量。K(xi,xj)为我们要使用的核函数
    SVM回归算法原始形式:
    在这里插入图片描述
     其中m为样本个数,我们的样本为(x1,y1),(x2,y2),…,(xm,ym)。w,b是我们的回归超平面的w∙xi+b=0系数, ξ∨i,ξ∧i为第i个样本的松弛系数, C为惩罚系数,ϵ为损失边界,到超平面距离小于ϵ的训练集的点没有损失。ϕ(xi)为低维到高维的映射函数。
     通过拉格朗日和对偶化后:
     在这里插入图片描述

  2. SVM核函数
    skiti-learn内置的核函数一共有四种:
    1).线性核函数(Linear Kernel):K(x,z)=x∙z ,就是普通的内积,LinearSVC 和 LinearSVR 只能使用它。
    2).多项式核函数(Polynomial Kernel):是线性不可分SVM核函数之一,K(x,z)=(γx∙z+r)d,其中,γ,r,d都需要自己调参定义。
    3).高斯核函数(Gaussian Kernel):称为径向基核函数,也是libsvm默认的核函数,同样也是skiti-learn默认的核函数,K(x,z)=exp(−γ||x−z||²),其中γ大于0,需要自己调参定义。
    4).Sigmoid核函数(Sigmoid Kernel):也是线性不可分SVM核函数之一,K(x,z)=tanh(γx∙z+r),其中γ,r都需要自己调参定义。
    一般情况下,对非线性数据使用默认的高斯核函数会有比较好的效果。

  3. SVM分类算法库参数
    1)惩罚系数C:
    LinearSVC 和SVC即为模型原型形式和对偶形式中的惩罚系数C,默认为1,一般通过交叉验证来选择一个合适的C,一般的噪音点较多时,C需要小一些。NuSVC没有这个参数,是通过nu参数来控制训练集的错误率,等价于选择了一个C,让训练集训练后满足一个确定的错误率。
    2)nu:
    LinearSVC,SVC没有这个参数,而采用C来控制惩罚力度;对于NuSVC ,nu代表了训练集训练的错误率上限,或者说支持向量的百分比下限,取值范围为(0,1],默认为0.5,与惩罚系数C类似,控制惩罚力度。
    3)核函数Kernel:
    LinearSVC没有这个参数,只能使用线性核;对于SVC,NuSVC的核函数有四种选择,’Linear‘线性核,’poly‘多项式核函数,‘rbf’高斯核,‘sigmoid’ sigmoid核函数,如果选择了核函数,对应的核函数后面有单独的参数需要调,默认的是高斯核‘rbf’;还有一种选择“precomputed",即我们预先计算出所有训练集和测试集的样本对应的Grem矩阵,这样K(x,z)直接在对应Grem矩阵中找到对应的位置的值。另外还有自定义核函数。
    4)正则化参数penalty:
    仅LinearSVC有这个参数,可以选择’l1‘ L1正则化或’l2’L2正则化。默认为L2
    正则化,如果需要选择稀疏化的系数,可以选择L1正则化,这和线性回归里面的Lasso回归类似。
    5)是否用对偶形式优化dual:
    仅LinearSVC有这个参数,一个布尔变量,选择是否采用对偶形式来优化算法,默认为True,如果我们样本量比特征数多,此时采用对偶形式计算量较大,推荐设置为Flase,即采用原始形式。
    6)核函数参数degree:
    如果 SVC和NuSVC在Kernel参数使用了多项式核‘poly’,那我们就需要对这个参数进行调参,这个参数对应K(x,z)=(γx∙z+r)d中的d。默认为3,一般需要用交叉验证选择合适的γ,r,d。
    7)核函数参数gamma:
    如果在SVC或NuSVC中选择Kernel参数中的高斯核函数‘rbf’,多项式核函数‘poly’,sigmod核函数,就需要进行调参。
    多项式核函数中这个参数对应K(x,z)=(γx∙z+r)d中的γ。一般需要通过交叉验证选择一组合适的γ,r,d;高斯核函数中这个参数对应K(x,z)=exp(−γ||x−z||²)中的γ,一般需要通过交叉验证选择合适的γ;sigmoid核函数中这个参数对应K(x,z)=tanh(γx∙z+r)中的γ。一般需要通过交叉验证选择一组合适的γ,r,γ默认为’auto’,即1特征维度。
    8)核函数参数coef0:
    如果SVC或者NuSVC选择Kernel参数‘poly’或者‘sigmoid’,需要对这个参数调参。多项式核函数中这个参数对应K(x,z)=(γx∙z+r)d中的r。一般需要通过交叉验证选择一组合适的γ,r,d;sigmoid核函数中这个参数对应K(x,z)=tanh(γx∙z+r)中的r。一般需要通过交叉验证选择一组合适的γ,r ;coef0默认为0。
    9)样本权重class_weight:
    指定样本各类别的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None"。
    10)分类决策decision_function_shape:
    LinearSVC没有这个参数,使用multi_class参数替代。SVC和nuSVC可以选择’ovo’或者‘ovr’。OvR(one ve rest)的思想很简单,无论你是多少元分类,我们都可以看做二元分类。OvO(one-vs-one)则是每次每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元分类,得到模型参数。我们一共需要T(T-1)/2次分类。OvR相对简单,但分类效果相对略差。而OvO分类相对精确,但是分类速度没有OvR快。一般建议使用OvO以达到较好的分类效果。
    11)分类决策multi_class:
    可以选择 ‘ovr’ 或者 ‘crammer_singer’ 。‘ovr’和SVC和nuSVC中的decision_function_shape对应的‘ovr’类似。‘crammer_singer’是一种改良版的’ovr’,但是没有比’ovr‘好,一般在应用中都不建议使用。SVC和nuSVC没有这个参数,使用decision_function_shape参数替代。
    12)缓存大小cache_size:
    LinearSVC计算量不大,因此不需要这个参数。SVC和nuSVC在大样本的时候,缓存大小会影响训练速度,因此如果机器内存大,推荐用500MB甚至1000MB。默认是200,即200MB。

  4. SVM回归算法库
    回归算法库的主要参数与分类类似,主要有:惩罚系数C,nu,距离误差epsilon,是否用对偶形式优化dual ,正则化参数penalty ,核函数 kernel,核函数参数degree, gamma 和coef0,损失函数度量loss,缓存大小cache_size。其中是否用对偶形式优化dual ,正则化参数penalty ,核函数 kernel,核函数参数degree, gamma 和coef0,缓存大小cache_size与分类算法参数类似。区别:
    1)惩罚系数C:
    默认为1,一般需要通过交叉验证来选择一个合适的C。一般来说,如果噪音点较多时,C需要小一些。大家可能注意到在分类模型里面,nuSVC使用了nu这个等价的参数控制错误率,就没有使用C,为什么我们nuSVR仍然有这个参数呢,不是重复了吗?这里的原因在回归模型里面,我们除了惩罚系数C还有还有一个距离误差ϵ来控制损失度量,因此仅仅一个nu不能等同于C.也就是说回归错误率是惩罚系数C和距离误差ϵ共同作用的结果。
    2)nu:
    LinearSVR 和SVR没有这个参数,用ϵ控制错误率;对于SVR和NuSVR,nu代表训练集训练的错误率的上限,或者说支持向量的百分比下限,取值范围为(0,1],默认是0.5.通过选择不同的错误率可以得到不同的距离误差ϵ。也就是说这里的nu的使用和LinearSVR 和SVR的ϵ参数等价。
    3)距离误差epsilon:
    对于LinearSVR和SVR,即我们第二节回归模型中的ϵ,训练集中的样本需满足
    −ϵ− ξ∨i ≤yi−w∙ϕ(xi)−b≤ ϵ+ ξ∧i 。nuSVR没有这个参数,用nu控制错误率。
    4)损失函数度量loss:
    对于LinearSVC,可以选择为‘epsilon_insensitive’ 和 ‘squared_epsilon_insensitive’ ,如果选择‘epsilon_insensitive’ ,则损失度量满足−ϵ− ξ∨i ≤yi−w∙ϕ(xi)−b≤ϵ+ξ∧i即和第二节的损失度量一样。是默认的SVM回归的损失度量标准形式。如果选择为 ‘squared_epsilon_insensitive’ , 则损失度量满足(yi−w∙ϕ(xi)−b)2≤ϵ+ξi,此时可见会少一个松弛系数。其优化过程我们在SVM原理系列里没有讲,但是目标函数优化过程是完全相似的。一般用默认的‘epsilon_insensitive’就足够了。

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

猜你喜欢

转载自blog.csdn.net/weixin_40732844/article/details/82919015
今日推荐