导入:from sklearn.svm import SVC
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分类算法和回归算法
我们先简要回顾下SVM分类算法和回归算法,因为这里面有些参数对应于算法库的参数,如果不先复习下,下面对参数的讲述可能会有些难以理解。
3.SVM核函数概述
在scikit-learn中,内置的核函数一共有4种,当然如果你认为线性核函数不算核函数的话,那就只有三种。
4. SVM分类算法库参数小结
这里我们对SVM分类算法库的重要参数做一个详细的解释,重点讲述调参的一些注意点。
参数 | LinearSVC | SVC | NuSVC | |
惩罚系数C | 即为我们第二节中SVM分类模型原型形式和对偶形式中的惩罚系数C,默认为1,一般需要通过交叉验证来选择一个合适的C。一般来说,如果噪音点较多时,C需要小一些。 | NuSVC没有这个参数, 它通过另一个参数nu来控制训练集训练的错误率,等价于选择了一个C,让训练集训练后满足一个确定的错误率 | ||
nu | LinearSVC 和SVC没有这个参数,LinearSVC 和SVC使用惩罚系数C来控制惩罚力度。 | nu代表训练集训练的错误率的上限,或者说支持向量的百分比下限,取值范围为(0,1],默认是0.5.它和惩罚系数C类似,都可以控制惩罚的力度。 | ||
核函数 kernel | LinearSVC没有这个参数,LinearSVC限制了只能使用线性核函数 | 核函数有四种内置选择,第三节已经讲到:‘linear’即线性核函数, ‘poly’即多项式核函数, ‘rbf’即高斯核函数, ‘sigmoid’即sigmoid核函数。如果选择了这些核函数, 对应的核函数参数在后面有单独的参数需要调。默认是高斯核'rbf'。
还有一种选择为"precomputed",即我们预先计算出所有的训练集和测试集的样本对应的Gram矩阵,这样K(x,z)直接在对应的Gram矩阵中找对应的位置的值。
当然我们也可以自定义核函数, 由于我没有用过自定义核函数,这里就不多讲了。 | ||
正则化参数penalty | 仅仅对线性拟合有意义,可以选择‘l1’即L1正则化 或者 ‘l2’即L2正则化。默认是L2正则化,如果我们需要产生稀疏话的系数的时候,可以选L1正则化,这和线性回归里面的Lasso回归类似。 | SVC和NuSVC没有这个参数 | ||
是否用对偶形式优化dual | 这是一个布尔变量,控制是否使用对偶形式来优化算法,默认是True,即采用上面第二节的分类算法对偶形式来优化算法。如果我们的样本量比特征数多,此时采用对偶形式计算量较大,推荐dual设置为False,即采用原始形式优化 | SVC和NuSVC没有这个参数 | ||
核函数参数degree | LinearSVC没有这个参数,LinearSVC限制了只能使用线性核函数 | | ||
核函数参数gamma | LinearSVC没有这个参数,LinearSVC限制了只能使用线性核函数 | | ||
核函数参数coef0 | LinearSVC没有这个参数,LinearSVC限制了只能使用线性核函数 | | ||
样本权重class_weight | 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None" | |||
分类决策decision_function_shape | LinearSVC没有这个参数,使用multi_class参数替代。 | 可以选择'ovo'或者‘ovo’.目前0.18版本默认是'ovo'.0.19版本将是'ovr' OvR(one ve rest)的思想很简单,无论你是多少元分类,我们都可以看做二元分类。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元分类,得到第K类的分类模型。其他类的分类模型获得以此类推。
OvO(one-vs-one)则是每次每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元分类,得到模型参数。我们一共需要T(T-1)/2次分类。
从上面的描述可以看出OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而OvO分类相对精确,但是分类速度没有OvR快。一般建议使用OvO以达到较好的分类效果。 | ||
分类决策multi_class | 可以选择 ‘ovr’ 或者 ‘crammer_singer’
‘ovr’和SVC和nuSVC中的decision_function_shape对应的‘ovr’类似。
'crammer_singer'是一种改良版的'ovr',说是改良,但是没有比’ovr‘好,一般在应用中都不建议使用。 | SVC和nuSVC没有这个参数,使用decision_function_shape参数替代。 | ||
缓存大小cache_size | LinearSVC计算量不大,因此不需要这个参数 | 在大样本的时候,缓存大小会影响训练速度,因此如果机器内存大,推荐用500MB甚至1000MB。默认是200,即200MB. | ||
5. SVM回归算法库参数小结
SVM回归算法库的重要参数巨大部分和分类算法库类似,因此这里重点讲述和分类算法库不同的部分,对于相同的部分可以参考上一节对应参数。
参数 | LinearSVR | SVR | nuSVR |
惩罚系数C | 即为我们第二节中SVM分类模型原型形式和对偶形式中的惩罚系数C,默认为1,一般需要通过交叉验证来选择一个合适的C。一般来说,如果噪音点较多时,C需要小一些。大家可能注意到在分类模型里面,nuSVC使用了nu这个等价的参数控制错误率,就没有使用C,为什么我们nuSVR仍然有这个参数呢,不是重复了吗?这里的原因在回归模型里面,我们除了惩罚系数C还有还有一个距离误差ϵ来控制损失度量,因此仅仅一个nu不能等同于C.也就是说回归错误率是惩罚系数C和距离误差ϵ共同作用的结果。后面我们可以看到nuSVR中nu的作用。 | ||
nu | LinearSVR 和SVR没有这个参数,用ϵ控制错误率 | nu代表训练集训练的错误率的上限,或者说支持向量的百分比下限,取值范围为(0,1],默认是0.5.通过选择不同的错误率可以得到不同的距离误差ϵ。也就是说这里的nu的使用和LinearSVR 和SVR的ϵ参数等价。 | |
距离误差epsilon | | nuSVR没有这个参数,用nu控制错误率 | |
是否用对偶形式优化dual | 和SVC类似,可参考上一节的dual描述 | SVR和NuSVR没有这个参数 | |
正则化参数penalty | 和SVC类似,可参考上一节的penalty 描述 | SVR和NuSVR没有这个参数 | |
核函数 kernel | LinearSVR没有这个参数,LinearSVR限制了只能使用线性核函数 | 和SVC, nuSVC类似,可参考上一节的kernel描述 | |
核函数参数degree, gamma 和coef0 | LinearSVR没有这些参数,LinearSVR限制了只能使用线性核函数 | 和SVC, nuSVC类似,可参考上一节的kernel参数描述 | |
损失函数度量loss | 可以选择为‘epsilon_insensitive’ 和 ‘squared_epsilon_insensitive’ ,如果选择‘epsilon_insensitive’ ,则损失度量满足
和第二节的损失度量一样。是默认的SVM回归的损失度量标准形式。
如果选择为 ‘squared_epsilon_insensitive’ , 则损失度量满足 时可见会少一个松弛系数。其优化过程我们在SVM原理系列里没有讲,但是目标函数优化过程是完全相似的。
一般用默认的‘epsilon_insensitive’就足够了。 | SVR和NuSVR没有这个参数 | |
缓存大小cache_size | LinearSVC计算量不大,因此不需要这个参数 | 在大样本的时候,缓存大小会影响训练速度,因此如果机器内存大,和SVC,nuSVC一样,推荐用500MB甚至1000MB。默认是200,即200MB. |
6. SVM算法库其他调参要点
上面已经对scikit-learn中类库的参数做了总结,这里对其他的调参要点做一个小结。
1)一般推荐在做训练之前对数据进行归一化,当然测试集中的数据也需要归一化。。
2)在特征数非常多的情况下,或者样本数远小于特征数的时候,使用线性核,效果已经很好,并且只需要选择惩罚系数C即可。
3)在选择核函数时,如果线性拟合不好,一般推荐使用默认的高斯核'rbf'。这时我们主要需要对惩罚系数C和核函数参数γ进行艰苦的调参,通过多轮的交叉验证选择合适的惩罚系数C和核函数参数γ。
4)理论上高斯核不会比线性核差,但是这个理论却建立在要花费更多的时间来调参上。所以实际上能用线性核解决问题我们尽量使用线性核。
7. 以svm中的支持向量分类SVC为例
以svm中的支持向量分类SVC作为介绍,所有参数如下:
sklearn.svm.SVC(
C=1.0,
kernel='rbf',
degree=3,
gamma='auto',
coef0=0.0,
shrinking=True,
probability=False,
tol=0.001,
cache_size=200,
class_weight=None,
verbose=False,
max_iter=-1,
decision_function_shape='ovr',
random_state=None)
具体每个参数的使用方法介绍如下:
- C : float, optional (default=1.0)
误差项的惩罚参数,一般取值为10的n次幂,如10的-5次幂,10的-4次幂。。。。10的0次幂,10,1000,1000,在python中可以使用pow(10,n) n=-5~inf
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样会出现训练集测试时准确率很高,但泛化能力弱。
C值小,对误分类的惩罚减小,容错能力增强,泛化能力较强。
- kernel : string, optional (default=’rbf’)
svc中指定的kernel类型。
可以是: ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 或者自己指定。 默认使用‘rbf’ 。
- degree : int, optional (default=3)
当指定kernel为 ‘poly’时,表示选择的多项式的最高次数,默认为三次多项式。
若指定kernel不是‘poly’,则忽略,即该参数只对‘poly’有作用。
- gamma : float, optional (default=’auto’)
当kernel为‘rbf’, ‘poly’或‘sigmoid’时的kernel系数。
如果不设置,默认为 ‘auto’ ,此时,kernel系数设置为:1/n_features
- coef0 : float, optional (default=0.0)
kernel函数的常数项。
只有在 kernel为‘poly’或‘sigmoid’时有效,默认为0。
- probability : boolean, optional (default=False)
是否采用概率估计。
必须在fit()方法前使用,该方法的使用会降低运算速度,默认为False。
- shrinking : boolean, optional (default=True)
如果能预知哪些变量对应着支持向量,则只要在这些样本上训练就够了,其他样本可不予考虑,这不影响训练结果,但降低了问题的规模并有助于迅速求解。进一步,如果能预知哪些变量在边界上(即a=C),则这些变量可保持不动,只对其他变量进行优化,从而使问题的规模更小,训练时间大大降低。这就是Shrinking技术。
Shrinking技术基于这样一个事实:支持向量只占训练样本的少部分,并且大多数支持向量的拉格朗日乘子等于C。
- tol : float, optional (default=1e-3)
误差项达到指定值时则停止训练,默认为1e-3,即0.001。
- cache_size : float, optional
指定内核缓存的大小,默认为200M。
- class_weight : {dict, ‘balanced’}, optional
权重设置。如果不设置,则默认所有类权重值相同。
以字典形式传入。
- verbose : bool, default: False
是否启用详细输出。
多线程时可能不会如预期的那样工作。默认为False。
- max_iter : int, optional (default=-1)
强制设置最大迭代次数。
默认设置为-1,表示无穷大迭代次数。
Hard limit on iterations within solver, or -1 for no limit.
- decision_function_shape : ‘ovo’, ‘ovr’, default=’ovr’
##这个用法也不是很理解##
Whether to return a one-vs-rest (‘ovr’) decision function of shape (n_samples, n_classes) as all other classifiers, or the original one-vs-one (‘ovo’) decision function of libsvm which has shape (n_samples, n_classes * (n_classes - 1) / 2).
Changed in version 0.19: decision_function_shape is ‘ovr’ by default.
New in version 0.17: decision_function_shape=’ovr’ is recommended.
Changed in version 0.17: Deprecated decision_function_shape=’ovo’ and None.
- random_state : int, RandomState instance or None, optional (default=None)
伪随机数使用数据。
一些属性介绍:
- support_ : array-like, shape = [n_SV]
Indices of support vectors.
- support_vectors_ : array-like, shape = [n_SV, n_features]
Support vectors.
- n_support_ : array-like, dtype=int32, shape = [n_class]
Number of support vectors for each class.
- dual_coef_ : array, shape = [n_class-1, n_SV]
Coefficients of the support vector in the decision function. For multiclass, coefficient for all 1-vs-1 classifiers. The layout of the coefficients in the multiclass case is somewhat non-trivial. See the section about multi-class classification in the SVM section of the User Guide for details.
- coef_ : array, shape = [n_class-1, n_features]
Weights assigned to the features (coefficients in the primal problem). This is only available in the case of a linear kernel.
coef_ is a readonly property derived from dual_coef_ and support_vectors_.
- intercept_ : array, shape = [n_class * (n_class-1) / 2]
Constants in decision function.
参考:
(1)https://blog.youkuaiyun.com/xiaodongxiexie/article/details/70667101