SVMs in Practice
本节内容:
SVM的参数选择、SVM解决多分类问题、实践中logistic回归和SVM的选择
相关机器学习概念:
线性核函数(Linear kernel)
1. Using SVM Packages
有许多软件库可以实现SVM,Ng常用的是liblinear和libsvm
要使用现成的软件库,需要我们自己选择的有:
-参数C
-核函数(相似度函数)
如果特征变量n很大而样本量m很小,为了避免过拟合,可以选用线性核函数Llinear kernel)去拟合一个线性边界。
线性核函数(Linear kernel)实质上就是不使用任何核函数:
若θTx=θ0+θ1x1+...+θnxn≥0\theta^T x=\theta_0+\theta_1x_1+...+\theta_nx_n ≥0θTx=θ0+θ1x1+...+θnxn≥0,预测y=1y=1y=1
如果特征变量n很小而样本量m很大,此时可以选用高斯核函数(Gaussian kernel)去拟合一个更复杂的非线性边界。
高斯核函数(Gaussian kernel):
fi=exp(−‖x−l(i)‖22σ2)f_i=exp(-\frac{‖ x-l^{(i)} ‖^2}{2\sigma^2})fi=exp(−2σ2‖x−l(i)‖2), where l(i)=x(i)l^{(i)}=x^{(i)}l(i)=x(i)
如果选用高斯核函数,我们还需要选择σ\sigmaσ.
如果使用Octave或者Matlab实现SVM,我们需要自己写出核函数的代码。以高斯核函数为例:
function sim = gaussianKernel(x1, x2, sigma)
% Note: x1 and x2 are column vectors
% sim = gaussianKernel(x1, x2) returns a gaussian kernel between x1 and x2
% and returns the value in sim
sim = exp(-(x1-x2)'*(x1-x2)/(2*sigma.^2));
end
NOTE: 使用高斯核函数之前要对特征变量进行归一化处理
线性核函数和高斯核函数是最常用的两种核函数,其他可能遇到的核函数包括:
多项式核函数(Polynomial kernel)
字符串核函数(String kernel),卡方核函数(Chi-square kernel),直方图交叉核函数(Histogram intersection kernel)
NOTE: 不是所有的相似度函数都是有效的核函数,它们必须满足摩塞尔定理(Mercer’s Theorem),以保证优化结果不会发散。
\quad
2. Multi-class Classification
SVM多分类问题的两种解决思路:
1、SVM包内置的多分类函数
2、一对多(one vs. all)
和logistic回归的多分类问题一样,y∈{1,2,3,...,K}y∈\{1,2,3,...,K\}y∈{1,2,3,...,K},有θ(1),θ(2),...,θ(K)\theta^{(1)},\theta^{(2)},...,\theta^{(K)}θ(1),θ(2),...,θ(K)。我们选择使(θ(i))Tx(\theta^{(i)})^T x(θ(i))Tx最大的类别iii.
3. Logistic Regression vs. SVMs
为了在有限的时间内得到最好的训练效果,建议:
如果n相对m而言很大,使用logistic回归或者不带核函数的SVM
如果n很小(如1~1,000),m大小适中(如10 ~ 50,000),使用高斯核函数的SVM
如果n很小,m很大(>50,000),人工选择更多的特征变量,使用logistic回归或者不带核函数的SVM
NOTE: 一个好的神经网络可能可以得到更好的训练效果,但训练一个神经网络的时间成本可能会更高
NOTE: SVM的优化问题是凸优化问题,不用担心局部最优问题