机器学习基础:SVM算法总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

机器学习基础:SVM算法总结
机器学习基础:SVM算法总结
CONTENTS
1. 函数间隔与⼏何间隔
在分离超平⾯固定为\(w^Tx+b=0\)的时候,\(|w^Tx+b|\)表⽰点x到超平⾯的相对距离。

通过观察\(w^Tx+b\)和\(y\)是否同号,判断分类是否正确,引⼊函数间隔的概念,定义函数间隔\(γ′\)为:
\[γ′=y(w^Tx+b) \]
可以看到,它就是感知机模型⾥⾯的误分类点到超平⾯距离的分⼦。

对于训练集中m个样本点对应的m个函数间隔的最⼩值,就是整个训练集的函数间隔。

函数间隔并不能正常反应点到超平⾯的距离,在感知机模型⾥我们也提到,当分⼦成⽐例的增长时,分母也是成倍增长。

为了统⼀度量,我们需要对法向量w加上约束条件,这样我们就得到了⼏何间隔\(γ\),定义为:
\[γ=\frac{y(w^Tx+b)}{||w||_2}=\frac{γ′}{||w||_2} \]
⼏何间隔才是点到超平⾯的真正距离,感知机模型⾥⽤到的距离就是⼏何距离。

2. ⽀持向量
在感知机模型中,我们可以找到多个可以分类的超平⾯将数据分开,并且优化时希望所有的点都被准确分类。

但是实际上离超平⾯很远的点已经被正确分类,它对超平⾯的位置没有影响。

我们最关⼼是那些离超平⾯很近的点,这些点很容易被误分类。

如果我们可以让离超平⾯⽐较近的点尽可能的远离超平⾯,最⼤化⼏何间隔,那么我们的分类效果会更好⼀些。

SVM的思想起源正起于此。

如下图所⽰,分离超平⾯为\(w^Tx+b=0\),如果所有的样本不光可以被超平⾯分开,还和超平⾯保持⼀定的函数距离(下图函数距离为1),那么这样的分类超平⾯是⽐感知机的分类超平⾯优的。

可以证明,这样的超平⾯只有⼀个。

和超平⾯平⾏的保持⼀定的函数距离的这两个超平⾯对应的向量,我们定义为⽀持向量,如下图虚线所⽰。

3. ⽬标函数与优化
SVM的模型是让所有点到超平⾯的距离⼤于⼀定的距离,也就是所有的分类点要在各⾃类别的⽀持向量两边。

⽤数学式⼦表⽰为:
\[max \, γ=\frac{y(w^Tx+b)}{||w||_2}\quad s.t \, y_i(w^Tx_i+b)=γ′^{(i)}≥γ′(i=1,2,...m) \]
⼀般我们都取函数间隔γ′为1,这样我们的优化函数定义为:
\[max \, γ=\frac{1}{||w||_2}\quad s.t \, y_i(w^Tx_i+b)≥1(i=1,2,...m) \]
也就是说,我们要在约束条件\(yi(wTxi+b)≥1(i=1,2,...m)\)下,最⼤化\(\frac{1}{||w||2}\)。

可以看出,这个感知机的优化⽅式不同,感知机是固定分母优化分⼦,⽽SVM是固定分⼦优化分母,同时加上了⽀持向量的限制。

由于\(\frac{1}{||w||2}\)的最⼤化等同于\(\frac{1}{2}||w||_2^2\)的最⼩化。

这样SVM的优化函数等价于:
\[min \, γ=\frac{1}{2}||w||_2^2\quad s.t \, y_i(w^Tx_i+b)≥1(i=1,2,...m) \]
由于⽬标函数\(\frac{1}{2}||w||_2^2\)是凸函数,同时约束条件不等式是仿射的,根据凸优化理论,我们可以通过拉格朗⽇函数将我们的优化⽬标转化为⽆约束的优化函数。

具体的,优化函数转化为:
\[L(w,b,α)=\frac{1}{2}||w||_2^2−\sum_{i=1}^{m}α_i[y_i(w^Tx_i+b)−1]满⾜α_i≥0 \]
由于引⼊了朗格朗⽇乘⼦,我们的优化⽬标变成:
\[\underbrace{min}_{w,b}\, \underbrace{max}_{\alpha_i>=0}\,L(w, b, a) \]
优化函数满⾜KKT条件,也就是说,我们可以通过拉格朗⽇对偶将我们的优化问题转化为等价的对偶问题来求解。

也就是说,现在我们要求的是:
\[\underbrace{max}_{\alpha_i>=0}, \underbrace{min}_{w,b}\,L(w, b, a) \]
从上式中,我们可以先求优化函数对于w和b的极⼩值。

接着再求拉格朗⽇乘⼦α的极⼤值。

⾸先我们来求L(w,b,α)基于w和b的极⼩值,即\(\underbrace{min}_{w,b}\,L(w, b, a)\)。

这个极值我们可以通过对w和b分别求偏导数得:
\[\begin{split} \frac{\partial L}{\partial w} &= 0 \Rightarrow w = \sum_{i=1}^{m}\alpha_iy_ix_i \\ \frac{\partial L}{\partial b} &= 0 \Rightarrow \sum_{i=1}^{m} = 0 \end{split} \]
从上两式⼦可以看出,我们已经求得了w和α的关系,只要我们后⾯接着能够求出优化函数极⼤化对应的α,就可以求出我们的w了,⾄于b,由于上两式已经没有b,所以最后的b可以有多个。

既然我们已经求出w和α的关系,就可以带⼊优化函数\(L(w, b, a)\)消去w了。

我们定义:
\[\Psi(\alpha) = \underbrace{min}_{w,b}\,L(w, b, a) \]
现在我们来看将w替换为α的表达式以后的优化函数\(ψ(α)\)的表达式:
4. 线性可分SVM算法过程
5. sklearn SVM 算法使⽤总结
5.1 分类
参数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限制了只
能使⽤线性核函数
如果我们在kernel参数使⽤了多项式核函数 'poly',那么我们就需要对这个参数进⾏调
参。

这个参数对应K(x,z)=(γx·z+r)d中的d。

默认是3。

⼀般需要通过交叉验证选择⼀组
合适的γ,r,d
核函数参数gamma LinearSVC没有这个参
数,LinearSVC限制了只
能使⽤线性核函数
如果我们在kernel参数使⽤了多项式核函数 'poly',⾼斯核函数‘rbf’, 或者sigmoid核函
数,那么我们就需要对这个参数进⾏调参。

多项式核函数中这个参数对应
K(x,z)=(γx·z+r)d 中的γ。

⼀般需要通过交叉验证选择⼀组合适的γ,r,d⾼斯核函数中这
个参数对应K(x,z)=exp(−γ||x−z||2) 中的γ。

⼀般需要通过交叉验证选择合适的γsigmoid
核函数中这个参数对应K(x,z)=tanh(γx·z+r)中的γ。

⼀般需要通过交叉验证选择⼀组合
适的γ,r γ默认为'auto',即1特征维度
核函数参数coef0LinearSVC没有这个参
数,LinearSVC限制了只
能使⽤线性核函数
如果我们在kernel参数使⽤了多项式核函数 'poly',或者sigmoid核函数,那么我们就需
要对这个参数进⾏调参。

多项式核函数中这个参数对应K(x,z)=(γx·z+r)d 中的r。

⼀般
需要通过交叉验证选择⼀组合适的γ,r,dsigmoid核函数中这个参数对应
K(x,z)=tanh(γx·z+r)中的r。

⼀般需要通过交叉验证选择⼀组合适的γ,r coef0默认为0
样本权重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.2 回归
参数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即我们第⼆节回归模型中的ϵ,训练集中的样本需满⾜−ϵ−ξ∨i≤yi−w·ϕ(xi)−b≤ϵ+ξ∧i nuSVR没有这个参数,⽤nu控制错误率
是否⽤对偶
形式优化
dual
和SVC类似,可参考上⼀节的dual描述SVR和NuSVR没有这个参数
正则化参数
penalty和SVC类似,可参考上⼀节的penalty 描述SVR和NuSVR没有这个参数
核函数kernel LinearSVR没有这个参数,LinearSVR限制了只能使⽤线性核函数和SVC, nuSVC类似,可参考上⼀节的
kernel描述
核函数参数
degree, gamma 和coef0LinearSVR没有这些参数,LinearSVR限制了只能使⽤线性核函数和SVC, nuSVC类似,可参考上⼀节的
kernel参数描述
损失函数度量loss 可以选择为‘epsilon_insensitive’ 和 ‘squared_epsilon_insensitive’ ,如果选
择‘epsilon_insensitive’ ,则损失度量满⾜−ϵ−ξ∨i≤yi−w·ϕ(xi)−b≤ϵ+ξ∧i,即和第⼆节
的损失度量⼀样。

是默认的SVM回归的损失度量标准形式。

如果选择为
‘squared_epsilon_insensitive’ , 则损失度量满⾜(yi−w·ϕ(xi)−b)2≤ϵ+ξi,此时可见会少
⼀个松弛系数。

其优化过程我们在SVM原理系列⾥没有讲,但是⽬标函数优化过程是
完全相似的。

⼀般⽤默认的‘epsilon_insensitive’就⾜够了。

SVR和NuSVR没有这个参数
缓存⼤⼩cache_size LinearSVC计算量不⼤,因此不需要这个参数
在⼤样本的时候,缓存⼤⼩会影响训练
速度,因此如果机器内存⼤,和
SVC,nuSVC⼀样,推荐⽤500MB甚⾄
1000MB。

默认是200,即200MB.
5.3 调参总结
⼀般推荐在做训练之前对数据进⾏归⼀化,当然测试集中的数据也需要归⼀化。

在特征数⾮常多的情况下,或者样本数远⼩于特征数的时候,使⽤线性核,效果已经很好,并且只需要选择惩罚系数C即可。

在选择核函数时,如果线性拟合不好,⼀般推荐使⽤默认的⾼斯核'rbf'。

这时我们主要需要对惩罚系数C和核函数参数γ进⾏艰苦的调参,通过多轮的交叉验证选择合适的惩罚系数C和核函数参数γ。

理论上⾼斯核不会⽐线性核差,但是这个理论却建⽴在要花费更多的时间来调参上。

所以实际上能⽤线性核解决问题我们尽量使⽤线性核。

相关文档
最新文档