参考博文的原博地址:原博地址
1、SVC函数原型预览
SVC(C=1.0, cache_size=200,class_weight=None, coef0=0.0,decision_function_shape=None,degree=3, ganmma =‘auto’, kernel =‘rbf’, max_iter=-1,probability=False, random_state=None,shrinking=True, tol =0.001, verbose=False)
2、首先,我们先不要一个个参数看,对于支持向量机最关机的是它核函数的选择,所以我们先从核函数的选择出发。
先看kernel参数的官方说明。
kernel : string, optional (default=’rbf’). Specifies the kernel type to be used in the algorithm. It must be one of ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ or a callable. If none is given, ‘rbf’ will be used. If a callable is given it is used to pre-compute the kernel matrix from data matrices; that matrix should be an array of shape (n_samples, n_samples).
1.linear核函数:
K
(
x
i
,
x
j
)
=
x
i
T
x
j
K(x_i,x_j)=x_i^Tx_j
K(xi,xj)=xiTxj
2.polynomial核函数:
K
(
x
i
,
x
j
)
=
(
γ
x
i
T
x
j
+
r
)
d
,
d
>
1
K(x_i,x_j)=(\gamma x_i^Tx_j + r)^d, d>1
K(xi,xj)=(γxiTxj+r)d,d>1
3.RBF核函数(高斯核函数):
K
(
x
i
,
x
j
)
=
e
x
p
(
−
γ
∣
∣
x
i
−
x
j
∣
∣
2
)
,
γ
>
0
K(x_i,x_j)=exp(-\gamma ||x_i-x_j||^2),\gamma>0
K(xi,xj)=exp(−γ∣∣xi−xj∣∣2),γ>0
4.sigmoid核函数:
K
(
x
i
,
x
j
)
=
t
a
n
h
(
γ
x
i
T
x
j
+
r
)
,
γ
>
0
,
r
<
0
K(x_i,x_j)=tanh(\gamma x_i^Tx_j + r ), \gamma>0, r<0
K(xi,xj)=tanh(γxiTxj+r),γ>0,r<0
因为sklearn底层是调用libsvm的,因此sklearn中svm参数说明是可以直接参考libsvm中的。
首先介绍下与核函数相对应的参数:
1)对于线性核函数,没有专门需要设置的参数
2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高次项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的gamma,默认值是1/k(特征数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中gamma,默认值是1/k(k是特征数)。
4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中gamma,默认值是1/k(k是特征数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
具体来说说rbf核函数中C和gamma :
SVM模型有两个非常重要的参数C与gamma。其中 C是惩罚系数,即对误差的宽容度。c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差
gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
这里面大家需要注意的就是gamma的物理意义,大家提到很多的RBF的幅宽,它会影响每个支持向量对应的高斯的作用范围,从而影响泛化性能。我的理解:如果gamma设的太大,方差会很小,方差很小的高斯分布长得又高又瘦, 会造成只会作用于支持向量样本附近,对于未知样本分类效果很差,存在训练准确率可以很高,(如果让方差无穷小,则理论上,高斯核的SVM可以拟合任何非线性数据,但容易过拟合)而测试准确率不高的可能,就是通常说的过训练;而如果设的过小,则会造成平滑效应太大,无法在训练集上得到特别高的准确率,也会影响测试集的准确率。