支持向量机(supot vector machine)是机器学习中非常重要的一种算法,在神经网络普及之前,SVM在数据分类领域一直占据着主导地位。特点是对于训练数据集的数量要求不多,并且能够得出很好的效果。
1 线性SVM过程
决策边界:作为分类数据的边界,如公式1.1所示,W^t作为x(数据)的法向量存在,应与输入数据的维度一致。
公式1.1
图1 图片来源百度百科支持向量:一个标准的SVM模型,决定其分类效果的主要因素是决策边界。如图1所示,一个理想的SVM模型,其决策边界要与其支持向量保持最大距离,而上文所提到的支持向量就是距离决策边界最近的向量集合。
优化目标:首先找到一组支持向量,如公式1.2所示。根据找到的支持向量,结合点到超平面的距离公式,继而选出一组W与b的值,可以使决策边界与支持向量的距离最大化,如公式1.3所示。
公式1.2
公式1.3
根据公式1.1.2,我们可以使用放缩变换使其值大于等于1,所以支持向量到决策边界的距离就为1,故此优化目标可以简化到公式1.4所示。
公式1.4
求解过程:由公式1.1.4转化成极小值公式,使用拉格朗日乘子法进行求解,其简化方程如公式1.5所示。
公式1.5
对W与b求偏导,得到条件:,根据KKT定义,将其转换成如公式1.6所示条件。
公式1.6
将求出的偏导分别代入公式5,转换为求极小值公式,得出公式1.7。
公式1.7
最终模型:接下来,我们仅需要将训练数据一一代入公式1.7中,计算得出一组a的值,并将其代入至公式1.8中,得出我们的模型数据。
公式1.8
2 非线性SVM过程
非线性变换:在原本维度的线性不可分数据往往在更高的维度上变得线性可分,SVM就是利用这一特点将线性不可分数据进行分类的。首先,对数据集做非线性变换Φ,利用核函数将其特征映射到更高的维度,得出修改公式1.3为公式2.1,后续求解过程一致不变。
公式2.1
核函数:是对数据做非线性变换的一系列算法,包括多项式核函数、高斯核函数等。
多项式核函数:
高斯核函数:
Sigmoid:
3 实验与对比
数据集采用Kaggle数据集:泰坦尼克
数据文件:train.csv、test.csv
整体数据集包含891条训练集和418条测试集,每条包含十一位信息,其中有部分缺失。
求解:补全测试集中的所有是否生存。
图2 数据集信息分布本文测试用例:
船票等级 2 Pclass 891
性别 4 Sex 891
年龄 5 Age 714
亲友数量 6,7 SibSp,Parch 891
船票价格 9 Fare 891
登录港口 11 Embarked 889
年龄缺失的均补充为27,登录港口缺失均映射为0。
Sklearn中创建SVM实例:
from sklearn.svm import SVC
model = SVC(kernel,C,gamma)
kernel:String
linear :线性核函数
poly :多项式核函数
rbf :径像核函数/高斯核
sigmod :sigmod核函数
precomputed:核矩阵
C:Float
错误项的惩罚系数,C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力会降低。
基于高斯核函数不同惩罚系数对数据集的精度影响(Y轴为测试集上的精度,X轴为惩罚系数)gamma: float
核函数系数,仅对‘rbf’,‘poly’,‘sigmod’有效
基于高斯核函数不同gamma值对数据集的精度影响(Y轴为测试集上的精度,X轴为gamma值)
4 参考代码
5 问题与思考
1、SVM的主要应用场景是什么?
2、如何选取合适的核函数?
3、SVM在什么情况下容易产生过拟合问题?过拟合的根本原因是什么?
4、神经网络算法是否可以替代传统的SVM(SVM的关键优势是什么)?
5、如何在尽量不损失召回率的情况下提高SVM的速度?
参考答案:
1、SVM的核心思想就是找到不同类别之间的分界面,使得两类样本尽量落在面的两边,而且离分界面尽量远。相对来说,SVM更擅长处理样本数量偏少且特征较多的数据。
2、选自吴恩达:如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM;如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel; 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况
3、数据样本有脏点(噪声),因为SVM约束条件就是对于每个样本要正确分类,至于间隔最大是在这个约束条件的基础上进行的,所以如果约束条件成立就已经导致模型非常复杂,所以容易导致过拟合。
4、SVM是结构风险最小化,优化目标是最大化间隔,超参数很少,不容易过拟合,适合小样本。而反观神经网络,神经网络是需要海量数据去训练的,且其非线性表征更强、数据量更大使其在小样本方面的效果并不理想。
5、提高SVM速度分为两方面:
(1)选取适当的核函数,样本数量较多且非线性一般的情况下可采取多项式核函数,注意控制好多项式的维度。
(2)提高惩罚,使支持向量减少,会很有效的提高速度且减少内存开销。
网友评论