Sklearn.svm
-
scikit-learn中SVM的算法库分为两类,一类是分类的算法库,包括SVC, NuSVC,和LinearSVC 。另一类是回归算法库,包括SVR, NuSVR,和LinearSVR 。
-
SVM和NuSVM区别仅仅在于对损失的度量方式不同,NuSVM有一个参数来控制训练集训练的错误率或支持向量的百分比。
-
LinearSVM仅支持线性核函数,不支持各种低维到高维的核函数,对线性不可分的数据不能使用。
Kernel
-
线性核函数(Linear Kernel)
表达式为:𝐾(𝑥,𝑧)=𝑥∙𝑧,普通的内积。LinearSVC 和 LinearSVR 只能使用它。
-
多项式核函数(Polynomial Kernel)
表达式为:𝐾(𝑥,𝑧)=(𝛾𝑥∙𝑧+𝑟)𝑑 ,其中𝛾 𝑟 𝑑都需要自己调参,比较麻烦。线性不可分SVM常用的核函数之一。
-
高斯核函数(Gaussian Kernel)
表达式为:𝐾(𝑥,𝑧)=𝑒𝑥𝑝(−𝛾||𝑥−𝑧||2), 其中𝛾大于0,需要自己调参。
在SVM中也称为径向基核函数(Radial Basis Function,RBF)是libsvm默认核函数,也是scikit-learn默认的核函数。非线性数据使用默认的高斯核函数会有比较好的效果。 -
Sigmoid核函数(Sigmoid Kernel)
表达式为:𝐾(𝑥,𝑧)=𝑡𝑎𝑛ℎ(𝛾𝑥∙𝑧+𝑟), 其中𝛾𝑟都需要自己调参。线性不可分SVM常用的核函数之一。
SVM分类算法库
参数 | LinearSVC | SVC | NuSVC |
---|---|---|---|
惩罚系数C | 默认为1,需要通过交叉验证来选择一个合适的C。一般来说,如果噪点较多,C需小一些。 | 同上 | 无 |
nu | 无 | 无 | nu代表训练集训练的错误率的上限,或者支持向量的百分比下限,取值范围为(0,1],默认是0.5。 |
核函数 kernel | 无 | ‘linear’线性核函数, ‘poly’多项式核函数, ‘rbf’高斯核函数, ‘sigmoid’sigmoid核函数。默认是高斯核’rbf’。“precomputed”, 即预先计算出所有训练集和测试集样本对应的Gram矩阵,这样𝐾(𝑥,𝑧)直接在对应的Gram矩阵中找对应的位置的值。 | 同上 |
正则化参数penalty | ‘l1’ L1正则化, ‘l2’ L2正则化。默认是L2正则化,如果我们需要产生稀疏话的系数的时候,可以选L1正则化。 | 无 | 无 |
是否用对偶形式优化dual | 默认是True, 即采用对偶形式来优化算法,如果样本量比特征数多,此时采用对偶形式计算量较大,推荐dual设置为False,即采用原始形式优化 | 无 | 无 |
核函数参数degree | 无 | 核函数中的𝑑,默认为3。一般需要通过交叉验证选择一组合适的𝑑,𝛾,𝑟 | 同上 |
核函数参数gamma | 无 | 核函数中的𝛾,默认为’auto’, 即1/特征维度 | 同上 |
核函数参数coef | 无 | 核函数中的𝑟,默认为0 | 同上 |
样本权重class_weight | 指定样本各类别的权重,防止训练集某些类别的样本过多,导致训练的决策过于偏向这些类别。可以自己指定各个样本的权重,或者用“balanced”算法自己计算权重,样本量少的类别所对应的样本权重会高。如果样本类别分布没有明显的偏倚,选择默认"None" | 同上 | 同上 |
分类决策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以达到较好的分类效果。 | 同上 |
分类决策multi_class | OvR或者 ‘crammer_singer’ | 无 | 无 |
缓存大小cache_size | LinearSVC计算量不大,因此不需要这个参数 | 在大样本的时候,缓存大小会影响训练速度,因此如果机器内存大,推荐用500MB甚至1000MB。默认是200,即200MB | 同上 |
SVM回归算法库
参数 | LinearSVR | SVR | NuSVR |
---|---|---|---|
惩罚系数C | 在分类模型里,nuSVC使用nu这个等价的参数控制错误率,没有使用C。在回归模型里,nuSVR仍然有这个参数,因为除了惩罚系数C还有还有一个距离误差𝜖来控制损失度量,因此仅仅一个nu不能等同于C,也就是说回归错误率是惩罚系数C和距离误差𝜖共同作用的结果。 | 同上 | 同上 |
nu | 无 | 无 | 通过选择不同的错误率可以得到不同的距离误差𝜖。 |
距离误差epsilon | 训练集中的样本需满足 − ϵ − ξ i ∨ ≤ y i − w ∙ ϕ ( x i ) − b ≤ ϵ + ξ i ∧ -\epsilon - \xi_i^{\lor} \leq y_i - w \bullet \phi(x_i ) -b \leq \epsilon + \xi_i^{\land} −ϵ−ξi∨≤yi−w∙ϕ(xi)−b≤ϵ+ξi∧ | 同上 | 无 |
损失函数度量loss | ‘epsilon_insensitive’ 满足 − ϵ − ξ i ∨ ≤ y i − w ∙ ϕ ( x i ) − b ≤ ϵ + ξ i ∧ -\epsilon - \xi_i^{\lor} \leq y_i - w \bullet \phi(x_i ) -b \leq \epsilon + \xi_i^{\land} −ϵ−ξi∨≤yi−w∙ϕ(xi)−b≤ϵ+ξi∧,是默认的SVM回归的损失度量标准形式。 ‘squared_epsilon_insensitive’ ,满足 y i − w ∙ ϕ ( x i ) − b ≤ ϵ + ξ i ∧ y_i - w \bullet \phi(x_i ) -b \leq \epsilon + \xi_i^{\land} yi−w∙ϕ(xi)−b≤ϵ+ξi∧,少一个松弛系数。一般使用默认的‘epsilon_insensitive’。 | 无 | 无 |
调参小结
- 一般推荐在做训练之前对数据进行归一化,当然测试集中的数据也需要归一化。
- 在特征数非常多的情况下,或者样本数远小于特征数的时候,使用线性核,效果就已经很好,并且只需要选择惩罚系数C即可。
- 在选择核函数时,如果线性拟合不好,一般推荐使用默认的高斯核’rbf’。这时主要需要对惩罚系数C和核函数参数𝛾进行调参,通过多轮的交叉验证选择合适的惩罚系数C和核函数参数𝛾。
- 理论上高斯核不会比线性核差,但是这个理论却建立在要花费更多的时间来调参上。所以实际上能用线性核解决问题我们尽量使用线性核。