《R语言实战》第二版碎碎念之九:支持向量机

支持向量机(SVM)是一类可用于分类和回归的有监督机器学习模型。其流行归功于两个方面:一方面,他们可输出较准确的预测结果;另一方面,模型基于较优雅的数学理论。SVM旨在在多维空间中找到一个能将全部样本单元分成两类的最优平面,这一平面应使两类中距离最近的点的间距(margin)尽可能大,在间距边界上的点被称为支持向量(support vector,它们决定间距),分割的超平面位于间距的中间。对于一个N维空间(即N个变量)来说,最优超平面(即线性决策面, linear decision surface)为N–1维。当变量数为2时,曲面是一条直线;当变量数为3时,曲面是一个平面;当变量数为10时,曲面就是一个九维的超平面。有可能数据本身就是非线性的,SVM通过核函数将数据投影到高维,使其在高维线性可分。SVM可以通过R中kernlab包的ksvm()函数和e1071包中的svm()函数实现。 ksvm()功能更强大,但svm()相对更简单。

library(e1071)

fit.svm <- svm(class~.,data = df.train)

fit.svm

svm.pred <- predict(fit.svm,na.omit(df.validate))

svm.perf <- table(na.omit(df.validate)$class,svm.pred,dnn=c("Actual","Predicted"))

svm.perf

由于方差较大的预测变量通常对SVM的生成影响更大, svm()函数默认在生成模型前对每个变量标准化,使其均值为0、标准差为1。从结果来看, SVM的预测准确率不错,但不如随机森林方法。与随机森林算法不同的是,SVM在预测新样本单元时不允许有缺失值出现。

svm()函数默认通过径向基函数(Radial Basis Function, RBF)将样本单元投射到高维空间。一般来说RBF核是一个比较好的选择,因为它是一种非线性投影,可以应对类别标签与预测变量间的非线性关系。在用带RBF核的SVM拟合样本时,两个参数可能影响最终结果: gamma和成本 (cost)。 gamma是核函数的参数,控制分割超平面的形状。 gamma越大,通常导致支持向量越多。我们也可将gamma看作控制训练样本“到达范围”的参数,即gamma越大意味着训练样本到达范围越广,而越小则意味着到达范围越窄。 gamma必须大于0。

成本参数代表犯错的成本。一个较大的成本意味着模型对误差的惩罚更大,从而将生成一个更复杂的分类边界,对应的训练集中的误差也会更小,但也意味着可能存在过拟合问题,即对新样本单元的预测误差可能很大。较小的成本意味着分类边界更平滑,但可能会导致欠拟合。与gamma一样,成本参数也恒为正。

svm()函数默认设置gamma为预测变量个数的倒数,成本参数为1。不过gamma与成本参数的不同组合可能生成更有效的模型。在建模时,我们可以尝试变动参数值建立不同的模型,但利用格点搜索法可能更有效。可以通过tune.svm()对每个参数设置一个候选范围, tune.svm()函数对每一个参数组合生成一个SVM模型,并输出在每一个参数组合上的表现。

tuned <- tune.svm(class~.,data = df.train,gamma = 10^(-6:1),cost = 10^(-10:10))

对不同的gamma和成本拟合一个带RBF核的SVM模型。一共将尝试八个不同的gamma (从0.000 001到10)以及21个成本参数(从0.01到1010)。总体来说共拟合了168 (8×21)个模型,并比较了其结果。训练集中10折交叉验证误差最小的模型所对应的参数为gamm=?,成本参数为?。

tuned调和模型通常能减少误差。

fit.svm <- svm(class~.,data = df.train,gamma=0.01,cost=1)

gamma和cost由tuned给出推荐值,tune.svm函数给出的gamma和cost数值不一定就合理,特别是数值很大或很小的情况下。

svm.pred <- predict(fit.svm,na.omit(df.validate))

svm.perf <- table(na.omit(df.validate)$class,svm.pred,dnn=c("Actual","Predicted"))

svm.perf

发表评论

电子邮件地址不会被公开。 必填项已用*标注