今天和大家分享一个与随机森林有点相似的模型 - - 支持向量机(Support Vector Machine,SVM) ,是一种有监督的回归和分类的机器学习模型,包括线性可分和非线性可分,但通常更用于分类。基本思想就是在样本空间中找到一个划分的超平面,将不同类别的样本分隔开。通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。( 有关凸优化问题的理解)
🐣 一、什么是支持向量机
支持向量机(SVM),是一种有监督的回归和分类的机器学习模型。SVM的出色和优雅,通常被认为是最好的分类器。其主要包括线性可分和非线性可分,线性可分时,可用硬间隔和软间隔最大化学习SVM;线性不可分时,通过核函数和软间隔最大化学习SVM。当SVM训练完成后,大部分样本都不需要保留,最终模型只与支持向量有关(通常用于解决小样本问题)。通常,二分类的支持向量机中使用的方法是基于找到分离的超平面。我们可以借助以下图形便于理解:
这就是线性可分,在二维空间上,两类点被一条直线完全分开叫做线性可分。这段理解是我copy的,应该能够帮助大家更好地理解:
A1和 A2是 n 维欧氏空间中的两个点集。如果存在 n 维向量 w 和实数 b,使得所有属于A1的点 xi 都有 wxi +b >0 ,而对于所有属于A2的点xj则有 wxj + b <0 ,则我们称A1和A2线性可分。从图来看,二维扩展到多维空间中时,将A1和A2完全正确地划分开的wx+b=0就成了一个超平面。为了使这个超平面更具鲁棒性,我们会去找最佳超平面,以最大间隔把两类样本分开的超平面,也称之为 最大间隔超平面 。具有以下特征:
- 两类样本分别分割在该超平面的两侧;
- 两侧距离超平面最近的样本点到超平面的距离被最大化了。
这时候我们就要找支持向量机了,再借助一张图理解:
样本中距离超平面最近的一些点,这些点叫做支持向量。
而现实中更多的情况是线性不可分的,正如这样:也就是多维的。
通常的解决方法就是:将二维线性不可分样本映射到高维空间中,让样本点在高维空间线性可分,例如:
对于在有限维度向量空间中线性不可分的样本,我们将其映射到更高维度的向量空间里,再通过间隔最大化的方式,学习得到支持向量机,就是非线性 SVM。如果想了解更多有关SVM原理,可以访问该链接,用数学函数和公式更好地理解原理这里就不展开了,SVM原理。
🐤 二、SVM的R过程
我们先对数据进行简单的处理,整理出一个二分类模型。
data("iris")
# 150行 5列的样本
dim(iris)
# 取两类物种的花萼长宽,便于后续的二分类SVM模型学习和展示
iris_sub <- subset(iris,select=c("Sepal.Length","Sepal.Width","Species"),Species%in%c("setosa","virginica"))
dim(iris_sub)
# 画图这两个指标的图,以length为x轴,width为y轴
attach(iris_sub)
par(mfrow=c(1,1)) # 调整下画布
plot(Sepal.Length, Sepal.Width, col=ifelse(Species=="setosa", "red", "blue"), pch=16)
在优化过程中,引入一个参数: 支持向量机的惩罚因子
支持向量机能够通过最大化边界得到一个优化的超平面以完成对训练数据的分离,不过有时算法也允许被错误分类样本的存在,惩罚因子能实现SVM对分类误差及分离边界的控制,如果控制因子比较小,分离间隔会比较大(软间隔)将产生比较多的被错分样本;相反当加大惩罚因子时,会缩小分类间隔,从而减小错分样本。
我们先展示当惩罚因子较小的情况:
# 将惩罚因子设置为1,用iris_sub数据集训练SVM:
library(e1071)
model<-svm(Species~.,data = iris_sub,kernel="linear",cost=1,scale = F)
points(iris_sub[model$index,c(1,2)],col="black",cex=1.5)
summary(model)
# 还可以看到当惩罚因子为1时,共找到了12个支持向量,第一类和第二类均包含6个支持向量。最后两行说明了两个类别以及每个类别的level。
# 添加分割线
w <- t(model$coefs)%*%model$SV
b <- -model$rho
abline(a = -b/w[1,2],b = -w[1,1]/w[1,2], col="grey", lty=5)
可以从图中看到,当惩罚因子为1时,我们是能够找到12个支持向量,第一类和第二类均有6个。
进一步,我们提高惩罚因子,看看具体变化:
# 将惩罚因子设置为500,重新训练一个SVM分类器
plot(Sepal.Length,Sepal.Width,col=ifelse(Species=="setosa", "red", "blue"), pch=16)
model1 <- svm(Species~.,data = iris_sub, kernel="linear",cost=5000, scale = F)
points(iris_sub[model1$index, c(1,2)],col="black",cex=2)
w = t(model1$coefs)%*%model1$SV
b = -model1$rho
abline(a = -b/w[1,2],b = -w[1,1]/w[1,2],col="grey",lty=5)
# SVM模型可视化
plot(model1, iris_sub, Sepal.Length~Sepal.Width,slice=list(Sepal.Width=3,Sepal.Length=4))
summary(model1)
# 当惩罚因子增加到500时,只找到了3个支持向量,第一类包含2个支持向量,第二类包含1个支持向量。
通过提高惩罚因子,我们发现支持向量是有所减少的。当提高到500时,只找到了3个支持向量。其中第一类为2个,第二类为1个。
可能很多人会好奇支持向量机到底用来做什么,总结一下特点:
- 支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量;
- SVM的目标是对特征空间划分得到最优超平面,SVM方法核心是最大化分类边界;
- SVM的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”;
- 少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒性”。这种鲁棒性主要体现在: ①增、删非支持向量样本对模型没有影响;②支持向量样本集具有一定的鲁棒性;③有些成功的应用中,SVM方法对核的选取不敏感;
- SVM在小样本训练集上能够得到比其它算法好很多的结果。SVM优化目标是结构化风险最小,而不是经验风险最小,避免了过拟合问题,通过margin的概念,得到对数据分布的结构化描述,减低了对数据规模和数据分布的要求,有优秀的泛化能力。
🦅 三、SVM的优缺点
主要优点:
- SVM是一种有坚实理论基础的新颖的适合小样本学习方法。它基本上不涉及概率测度及大数定律等,也简化了通常的分类和回归等问题;
- 计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”;
- 少数支持向量决定了最终结果,对异常值不敏感, 这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒性”;
- SVM学习问题可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值;
- 有优秀的泛化能力。(机器学习算法对新鲜样本的适应能力。学习的目的是学到隐含在数据背后的规律,对具有同一规律的学习集以外的数据,经过训练的网络也能给出合适的输出,该能力称为泛化能力。)
存在缺点:
- 对大规模训练样本难以实施;
- 解决多分类问题困难;
- 对参数和核函数选择敏感(支持向量机性能的优劣主要取决于核函数的选取,所以对于一个实际问题而言,如何根据实际的数据模型选择合适的核函数从而构造SVM算法。)
参考链接:
https://blog.csdn.net/promisejia/article/details/81241201
https://zhuanlan.zhihu.com/p/77750026
https://blog.csdn.net/qq_35290785/article/details/89675916
https://blog.51cto.com/abool/2044989