机器学习(06)-SVM算法调参(基于sklearn)

SVM算法调参(基于sklearn)

  • 1. 简介
  • 2. 核函数
  • 3. 参数理解
    • 3.1 惩罚系数
    • 3.2 正则化参数penalty
    • 3.3 损失函数
    • 3.4 多分类问题
  • 4. SVM分类算法
  • 5. SVM回归算法
  • 6. 小结

1. 简介

  1. scikit-learn中SVM的算法库分为两类,一类是分类的算法库,包括SVC, NuSVC,和LinearSVC。另一类是回归算法库,包括SVR, NuSVR,和LinearSVR 。

  2. SVM和NuSVM区别仅仅在于对损失的度量方式不同,NuSVM有一个参数来控制训练集训练的错误率或支持向量的百分比。

  3. LinearSVM仅支持线性核函数,不支持各种低维到高维的核函数,对线性不可分的数据不能使用。

2. 核函数

  1. 线性核函数(Linear Kernel):表达式为:(,)=∙,普通的内积。LinearSVC 和 LinearSVR 只能使用它。

  2. 多项式核函数(Polynomial Kernel):表达式为:(,)=(∙+) ,其中 都需要自己调参,比较麻烦。线性不可分SVM常用的核函数之一。

  3. 高斯核函数(Gaussian Kernel):表达式为:(,)=(−||−||2), 其中大于0,需要自己调参。
    在SVM中也称为径向基核函数(Radial Basis Function,RBF)是libsvm默认核函数,也是scikit-learn默认的核函数。非线性数据使用默认的高斯核函数会有比较好的效果。

  4. Sigmoid核函数(Sigmoid Kernel)
    表达式为:(,)=ℎ(∙+), 其中都需要自己调参。线性不可分SVM常用的核函数之一。

3. 参数理解

3.1 惩罚系数

理解为调节优化方向中两个指标(间隔大小,分类准确度)偏好的权重。
soft-margin SVM针对hard-margin SVM容易出现的过度拟合问题,适当放宽了margin的大小,容忍一些分类错误(violation),把这些样本当做噪声处理,本质上是间隔大小和噪声容忍度的一种trade-off,至于具体怎么trade-off,对哪个指标要求更高,那就体现在C这个参数上了。

当C趋于无穷大时,这个问题也就是不允许出现分类误差的样本存在,那这就是一个hard-margin SVM问题(过拟合)
机器学习(06)-SVM算法调参(基于sklearn)_第1张图片

当C趋于0时,我们不再关注分类是否正确,只要求间隔越大越好,那么我们将无法得到有意义的解且算法不会收敛。(欠拟合)

3.2 正则化参数penalty

设目标函数是要最小化的,所有参数组成向量w。

如果往目标函数上加上 ∣ ∣ ω ∣ ∣ ||\omega|| ω(参数向量w的L1范数),这就是L1正则化;
如果往目标函数上加上 1 2 ∣ ∣ ω ∣ ∣ 2 \frac{1}{2}||\omega||^2 21ω2(参数向量w的L2范数的平方的一半),这就是L2正则化。

L1正则化的优点是优化后的参数向量往往比较稀疏;L2正则化的优点是其正则化项处处可导。

3.3 损失函数

机器学习(06)-SVM算法调参(基于sklearn)_第2张图片

3.4 多分类问题

SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。

目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。

  1. 一对多法(one-versus-rest,简称1-v-r SVMs, OVR SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
  2. 一对一法(one-versus-one,简称1-v-1 SVMs, OVO SVMs, pairwise)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别

4. SVM分类算法

参数 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

5. SVM回归算法

参数 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 ϵξiyiωϕ(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 ϵξiyiωϕ(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’

6. 小结

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

你可能感兴趣的:(统计机器学习,算法,机器学习)