scikit-learn中SVM的算法库分为两类,一类是分类的算法库,包括SVC, NuSVC,和LinearSVC。另一类是回归算法库,包括SVR, NuSVR,和LinearSVR 。
SVM和NuSVM区别仅仅在于对损失的度量方式不同,NuSVM有一个参数来控制训练集训练的错误率或支持向量的百分比。
LinearSVM仅支持线性核函数,不支持各种低维到高维的核函数,对线性不可分的数据不能使用。
线性核函数(Linear Kernel):表达式为:(,)=∙,普通的内积。LinearSVC 和 LinearSVR 只能使用它。
多项式核函数(Polynomial Kernel):表达式为:(,)=(∙+) ,其中 都需要自己调参,比较麻烦。线性不可分SVM常用的核函数之一。
高斯核函数(Gaussian Kernel):表达式为:(,)=(−||−||2), 其中大于0,需要自己调参。
在SVM中也称为径向基核函数(Radial Basis Function,RBF)是libsvm默认核函数,也是scikit-learn默认的核函数。非线性数据使用默认的高斯核函数会有比较好的效果。
Sigmoid核函数(Sigmoid Kernel)
表达式为:(,)=ℎ(∙+), 其中都需要自己调参。线性不可分SVM常用的核函数之一。
理解为调节优化方向中两个指标(间隔大小,分类准确度)偏好的权重。
soft-margin SVM针对hard-margin SVM容易出现的过度拟合问题,适当放宽了margin的大小,容忍一些分类错误(violation),把这些样本当做噪声处理,本质上是间隔大小和噪声容忍度的一种trade-off,至于具体怎么trade-off,对哪个指标要求更高,那就体现在C这个参数上了。
当C趋于无穷大时,这个问题也就是不允许出现分类误差的样本存在,那这就是一个hard-margin SVM问题(过拟合)
当C趋于0时,我们不再关注分类是否正确,只要求间隔越大越好,那么我们将无法得到有意义的解且算法不会收敛。(欠拟合)
设目标函数是要最小化的,所有参数组成向量w。
如果往目标函数上加上 ∣ ∣ ω ∣ ∣ ||\omega|| ∣∣ω∣∣(参数向量w的L1范数),这就是L1正则化;
如果往目标函数上加上 1 2 ∣ ∣ ω ∣ ∣ 2 \frac{1}{2}||\omega||^2 21∣∣ω∣∣2(参数向量w的L2范数的平方的一半),这就是L2正则化。
L1正则化的优点是优化后的参数向量往往比较稀疏;L2正则化的优点是其正则化项处处可导。
SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。
目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。
参数 | LinearSVC | SVC | NuSVC |
---|---|---|---|
惩罚系数C | 默认为1,需要通过交叉验证来选择一个合适的C。一般来说,如果噪点较多,C需小一些。 | 同LinearSVC | 无 |
nu | 无 | 无 | nu代表训练集训练的错误率的上限,或者支持向量的百分比下限,取值范围为(0,1],默认是0.5。 |
核函数 kernel | 无 | ‘linear’线性核函数, ‘poly’多项式核函数, ‘rbf’高斯核函数, ‘sigmoid’sigmoid核函数。默认是高斯核’rbf’。“precomputed”, 即预先计算出所有训练集和测试集样本对应的Gram矩阵,这样(,)直接在对应的Gram矩阵中找对应的位置的值。 | 同SVC |
正则化参数penalty | ‘l1’ L1正则化, ‘l2’ L2正则化。默认是L2正则化,如果我们需要产生稀疏化的系数的时候,可以选L1正则化。 | 无 | 无 |
是否用对偶形式优化dual | 默认是True, 即采用对偶形式来优化算法,如果样本量比特征数多,此时采用对偶形式计算量较大,推荐dual设置为False,即采用原始形式优化 | 无 | 无 |
核函数参数degree | 无 | 核函数中的,默认为3。一般需要通过交叉验证选择一组合适的,, | 同SVC |
核函数参数gamma | 无 | 核函数中的,默认为’auto’, 即1/特征维度 | 同SVC |
核函数参数coef | 无 | 核函数中的,默认为0 | 同SVC |
样本权重class_weight | 指定样本各类别的权重,防止训练集某些类别的样本过多,导致训练的决策过于偏向这些类别。可以自己指定各个样本的权重,或者用“balanced”算法自己计算权重,样本量少的类别所对应的样本权重会高。如果样本类别分布没有明显的偏倚,选择默认"None" | 同LinearSVC | 同LinearSVC |
分类决策decision_function_shape | 无 | OvR(one ve rest)无论多少元分类,都看做二元分类,对于第K类的分类决策,我们把所有第K类的样本作为正例,其他所有样本都作为负例,然后在上面做二元分类,得到第K类的分类模型。OvO(one-vs-one)每次在所有的T类样本里面选择两类样本出来,T1类和T2类,把所有输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元分类,得到模型参数。我们一共需要T(T-1)/2次分类。从上面的描述可以看出OvR相对简单,但分类效果相对略差,而OvO分类相对精确,但是分类速度没有OvR快。一般建议使用OvO以达到较好的分类效果。 | 同SVC |
分类决策multi_class | OvR或者 ‘crammer_singer’ | 无 | 无 |
缓存大小cache_size | LinearSVC计算量不大,因此不需要这个参数 | 在大样本的时候,缓存大小会影响训练速度,因此如果机器内存大,推荐用500MB甚至1000MB。默认是200,即200MB | 同SVC |
参数 | LinearSVR | SVR | NuSVR |
---|---|---|---|
惩罚系数C | 在分类模型里,nuSVC使用nu这个等价的参数控制错误率,没有使用C。在回归模型里,nuSVR仍然有这个参数,因为除了惩罚系数C还有还有一个距离误差来控制损失度量,因此仅仅一个nu不能等同于C,也就是说回归错误率是惩罚系数C和距离误差共同作用的结果。 | 同上 | 同上 |
nu | 无 | 无 | 通过选择不同的错误率可以得到不同的距离误差 ϵ \epsilon ϵ。 |
距离误差epsilon | 训练集中的样本需满足 − ϵ − ξ i ≤ y i − ω ⋅ ϕ ( x i ) − b ≤ ϵ + ξ i -\epsilon-\xi_i \le y_i-\omega\cdot\phi(x_i)-b\le\epsilon+\xi_i −ϵ−ξi≤yi−ω⋅ϕ(xi)−b≤ϵ+ξi | 同上 | 无 |
损失函数度量loss | ‘epsilon_insensitive’ 满足 − ϵ − ξ i ≤ y i − ω ⋅ ϕ ( x i ) − b ≤ ϵ + ξ i -\epsilon-\xi_i \le y_i-\omega\cdot\phi(x_i)-b\le\epsilon+\xi_i −ϵ−ξi≤yi−ω⋅ϕ(xi)−b≤ϵ+ξi ,是默认的SVM回归的损失度量标准形式。 ‘squared_epsilon_insensitive’ ,满足 y i − ω ⋅ ϕ ( x i ) − b ≤ ϵ + ξ i y_i-\omega\cdot\phi(x_i)-b\le\epsilon+\xi_i yi−ω⋅ϕ(xi)−b≤ϵ+ξi,少一个松弛系数。一般使用默认的‘epsilon_insensitive’ | 无 | 无 |