sklearn中的SVM模型

支持向量机(SVM)是一种强大的可用于监督式学习分类问题和回归问题,以及非监督式异常检测问题等的常见算法。针对该算法,sklearn中提供了比较丰富的实现模型,其主要种类和主要差别见下表:

模型类型主要特点
LinearSVC基于liblinear库的SVM分类模型,仅支持线性核,可选择对prime问题或者dual问题进行二次规划求解,求解算法为坐标下降法。可调节损失函数和惩罚项。多分类问题采用'ovr'策略。不支持分类概率输出。
LinearSVR基于liblinear库的SVM回归模型,仅支持线性核,可选择对prime问题或者dual问题进行二次规划求解,,求解算法为坐标下降法。可调节损失函数和惩罚项。
SVC基于libsvm库的C-SVC分类模型,转换为dual问题利用SMO算法求解。支持线性核和多种非线性核,但无法调节损失函数和惩罚项。多分类问题采用'ovo'策略。支持概率输出。
SVR基于libsvm库C-SVR回归模型,转换为dual问题利用SMO算法求解。支持线性核和多种非线性核,但无法调节损失函数和惩罚项。多分类问题采用'ovo'策略。支持概率输出。
NuSVC基于libsvm库v-SVC分类模型,参数设定、功能及实现机理与SVC基本相同,但提供对支持向量个数下限值的设定(参数`nu`,其本质是将SVC中的'C'的取值范围从正数域压缩为(0,1])
NuSVR基于libsvm库v-SVR回归模型,参数设定、功能及实现机理与SVR基本相同,但提供对支持向量个数下限值的设定(参数`nu`,其本质是将SVC中的'C'的取值范围从正数域压缩为(0,1])
OneClassSVM用于异常检测,支持各类核函数

本文主要介绍基于liblinear库的LinearSVC和LinearSVR,以及基于libsvm库的SVC和SVR。

一、LinearSVC和LinearSVR

1.1 模型主要参数
模型参数LinearSVCLinearSVR
penalty正则项,可选择'l1'(L1正则)和'l2'(L2正则),默认值'l2'。——
epsilon——tube损失函数的上下界参数,默认值0。
loss损失函数,可选'hinge'(即Hinge损失)和'squared_hinge'(即Hinge损失平方),默认值'hinge'。损失函数,可选'epsilon_insensitive'(即tube损失,带L1正则)和'squared_epsilon_insensitive'(即tube损失平方,带L2正则),默认值'epsilon_insensitive'
dual对偶问题,布尔值,默认True,即转换为拉格朗日对偶问题进行求解。当样本数>特征数时,推荐设为False,即求解原始二次优化问题。
tol早停阈值,数值方法的迭代终止阈值,默认值1*e(-4)。
C正则系数,表示模型对分类/回归误差的容忍度,其值越大,表示对误差的容忍度越低,因此分类边界越复杂。默认值为1。
multi_class多分类策略,可选'ovr'(一对多)或'crammer_singler'(将损失函数调整以自动适应多分类问题),默认'ovr'。因为'crammer_singler'的准确率问题,一般不建议,若选择,则'pentaly'、'loss'和'dual'参数均无效。——
fit_intercept是否考虑线性核的截距,该参数也会参加L1和L2正则。
intercept_scaling截距系数,因为SVM算法默认已经做了间隔的归一,所以需要预设截距系数,而非线性回归中bias=1。
class_weight分类权重,可设置权重字典或'balanced'。其会影响各类别的惩罚项C,即class_weight[i]*C。——
random_state随机种子只在dula=True时有效,即随机样本在坐标下降法中的顺序。
max_iter最大迭代步数,默认1000
1.2 模型主要方法
模型方法LinearSVCLinearSVR
fit模型训练,注意参数sample_weight可以用来各样本损失函数的系数。
predict模型预测
1.3 模型主要属性
模型方法LinearSVCLinearSVR
coef_线性模型的特征参数
intercept_若设置了截距,则该值返回分隔面的截距值(在二分类问题,有一个截距;而在n分类问题中,有n个截距)
n_iter_最大迭代步数,由模型中的tol和max_iter等参数决定
1.4 模型的调参

LinearSVC/LinearSVR在调参时最重要的参数为C,该值越大,模型越不能不能容忍分类/回归误差,因此分隔面越复杂,越容易出现过拟合问题。在实际调参时,通过cross_validation实现。

二、SVC和SVR

2.1 模型主要参数
模型参数SVCSVR
C正则系数,表示模型对分类/回归误差的容忍度,其值越大,表示对误差的容忍度越低,因此分类边界越复杂。默认值为1。
epsilon ——tube损失函数的上下限松弛系数,表示该误差范围内不做惩罚。
kernel核函数类型,常见可选'linear'(线性核)、'poly'(多项式核)、'rbf'(高斯核)、'sigmoid'(sigmoid核),默认'rbf'。
degree'poly'(多项式核)中的幂参数,默认3。
gamma'poly'(多项式核)、'rbf'(高斯核)和'sigmoid'(sigmoid核)中的核函数系数。可选值'scale', 'auto'或浮点数,默认值'scale'。若为'scale',值根据1 / (n_features * X.var())计算;若为'auto',值取1 / n_features。
coef0'poly'(多项式核)和'rbf'(高斯核)的偏置参数,默认值为0。
shrinkingSMO算法中的策略,即移除一些已经满足条件的α,从而加快收敛速度。默认值True。
probability基于Platt Scaling方法,将样本点距分隔面的距离压缩到[0,1]区间,从而实现概率值的输出——
tol数值算法的误差允许阈值,默认值1e-3,用于早停。
class_weight分类权重,可设置权重字典或'balanced'。其会影响各类别的惩罚项C,即class_weight[i]*C。——
random_state随机种子,影响SMO算法中的选择顺序。
max_iter最大迭代步数,默认-1,即不设置上限。
decision_function_shape控制样本点到各分类决策分隔面的距离矩阵(decesion function)形状,表示分类的置信度,可用于进行分类概率值输出。可选值'ovo', 'ovr', 默认值'ovr'。——
对于SVC/SVR参数设定中的一些注意事项,下面特作说明:
  • 核函数及其参数的意义

SVC/SVR模型中,一类很重要的参数设定为核函数,其具体介绍参见SVM算法中的核技巧

  • 模型预测结果校准——Platt Scaling

这是由Platt提出的将SVC模型得到的各数据点距
分割面距离(decision function)压缩到[0,1]概率空间的方法,其可被用于于SVM,boosting等算法的结果的校正。

其本质就是基于参数化sigmoid函数的最大似然估计: p ( y = 1 ∣ x ) = 1 1 + exp ⁡ ( A x + b ) p(y=1|x)=\frac{1}{1+\exp(Ax+b)} p(y=1x)=1+exp(Ax+b)1

其中 x x x为各训练样本点的decision function值, A , b A,b A,b为sigmoid函数参数。

可根据各样本点 ( x i , y i ) (x_i,y_i) (xi,yi)进行最大似然估计,求得参数 A , b A,b A,b

  • decision_function_shape

decision_function即为样本点到分隔超平面的距离,反映了对该分类的置信度,因此可基于上述Platt Scaling方法转换为概率值。

而参数decision_function_shape则是在多分类问题中,用于控制输出的这些概率值矩阵的shape。

尽管SVC算法中采用的多分类算法为’ovo’策略。但概率值矩阵的默认输出方式确是类似于’ovr’,即 (n_samples, n_classes);若设为’ovo’,则输出矩阵形状为(n_samples, n_classes * (n_classes - 1) / 2)。

2.2 模型主要方法
模型方法SVCSVR
fit模型训练,注意参数不可设置sample_weight
predict模型预测分类或回归结果
decision_function样本点距超平面距离——
predict_proba基于Platt Scaling的分类概率值预测
predict_log_proba基于Platt Scaling的分类对数概率值预测
2.3 模型主要属性
模型属性SVCSVR
support_所有支持向量的索引号
support_vectors_所有支持向量的向量值
n_support_各class的支持向量个数——
dual_coef_dual问题的系数a,矩阵形状为(n_class-1, n_SV)
coef_仅对线性核有用,primal问题的特征参数,矩阵性状为(n_class * (n_class-1) / 2, n_features)仅对线性核有用,primal问题的特征参数,矩阵性状为(1, n_features)
fit_status_训练效果,0表示可以良好的拟合,而1表示不可以。
intercept_decision function中的截断系数
classes_分类类别——
probA_分类结果进行Platt Scaling的系数A——
probB_分类结果进行Platt Scaling的系数B——
class_weight_分类权重,可设置权重字典或'balanced'。其会影响各类别的惩罚项C,即class_weight[i]*C。——
shape_fit_样本矩阵shape——
2.4 模型调参

SVC/SVR模型调参的重点在于核函数的选择以及核函数参数的设定。

  • 核函数的选择

当特征数远大于样本量、或特征数为稀疏、或样本量过大(十万计以上)等情况下,推荐使用线性核;

对于其它情况,推荐使用非线性核。其中用得最多也是一般推荐使用为高斯核

  • 高斯核的参数 γ \gamma γ C C C

参数 C C C反映了模型对于样本误差的容忍度,其值越大,模型越不允许在训练样本上出现误差,因此分割面越复杂,支持向量点越多,模型越容易过拟合。一般选用适中值。

参数 γ \gamma γ反映了高斯核中心点附近的形状,其值越大,模型越复杂。该影响可从如下两个方面理解:

(1) γ \gamma γ的倒数即为高斯分布的形状参数 σ \sigma σ γ \gamma γ值越大则高斯分布形状越瘦,样本点与其它点的距离以及对其它点的作用越小,因此模型倾向选择越多的样本点作为支持向量点,模型也就越复杂;

(2)将高斯核函数进行泰勒展开: K ( x 1 , x 2 ) = exp ⁡ − γ ∣ ∣ x 1 − x 2 ∣ ∣ 2 = ∑ i = 0 n 1 i ! ( − γ ∣ ∣ x 1 − x 2 ∣ ∣ 2 ) i K(x_1,x_2)=\exp^{-\gamma||x_1-x_2||_2}=\sum\limits_{i=0}^n\frac{1}{i!}(-\gamma||x_1-x_2||_2)^i K(x1,x2)=expγx1x22=i=0ni!1(γx1x22)i

γ \gamma γ值越小,则高维特征迅速衰减,模型越接近于线性核(当 γ \gamma γ值趋近于0时就是线性核);而当 γ \gamma γ值增大, K ( ( x 1 , x 2 ) ) K((x_1,x_2)) K((x1,x2))值越小(当 γ \gamma γ值趋近于无穷时就是0),因此模型倾向选择越多的样本点作为支持向量点,模型也就越复杂。

因此,一般参数 γ \gamma γ也选用适中值。

可惜的是,模型效果对于参数 γ \gamma γ和C的敏感性并非线性,且均会严重影响模型的复杂度。因此在实际调参时,参数 γ \gamma γ C C C可利用cross_validation进行联合调参。

三、LinearSVC/LinearSVR和SVC/SVR的选择

与其说是模型间的选择,不如说是liblinear库和libsvm库之间的选择,两者各有优缺点,主要体现在:
(1)libsvm对核函数的适用性更广,可选择各类线性核和非线性核;而liblinear是基于线性核SVM算法的优化,专注于线性核的求解;
(2)libsvm将primal问题转化为dual问题,基于SMO算法进行求解,因此其适用的样本量不能太高,否则存储核函数矩阵 K K K以及运算会非常吃力,一般只能处理万例以下的数据量;而libsvm即可以选择对primal,也可以对dual问题进行优化,并利用坐标下降法进行求解,所以求解简单,允许对百万级的数据进行求解。

因此,在选择LinearSVC/LinearSVR和SVC/SVR,以及背后的库时,可奉行如下原则:
(1)对于特征维度远大于数据量、特征稀疏性明显、数据量大(十万以上)的问题,优先采用LinearSVC/LinearSVR;
(2)对于数据量和特征维度均在百/千量级,可考虑用SVC/SVR中的非线性核来解决;
(3)选择用线性核解决问题的,使用LinearSVC/LinearSVR;
(4)能用线性核解决的,坚决采用LinearSVC/LinearSVR。

Referennce:
LIBSVM和LIBLINEAR的区别对比
图解SVM中gamma和c参数的作用

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值