ML-7-支持向量机SVM
什么是SVM
支持向量机(Support Vector Machine, SVM)是最受欢迎的机器学习模型之一。它特别适合处理中小型复杂数据集的分类任务。
SMV在众多实例中寻找一个最优的决策边界,这个边界上的实例叫做支持向量,它们“支持”(支撑)分离开超平面,所以它叫支持向量机。
如上图,我们计算直线到分割实例的距离,使得我们的直线与数据集的距离尽可能的远,那么我们就可以得到唯一的解。最大化上图虚线之间的距离就是我们的目标。而上图中重点圈出的实例就叫做支持向量。
代码
背景
1 | import numpy as np |
Med_1_mL | Med_2_mL | Virus Present |
---|---|---|
6.50823 | 8.58253 | 0 |
4.12612 | 3.07346 | 1 |
6.42787 | 6.36976 | 0 |
3.67295 | 4.90522 | 1 |
1.58032 | 2.44056 | 1 |
该数据集模拟了一项医学研究,对感染病毒的小白鼠使用不同剂量的两种药物,观察两周后小白鼠是否感染病毒。
- 特征: 药物Med_1_mL 、药物Med_2_mL
- 标签:是否感染病毒(1感染/0不感染)
特点
我们可以做出大概的判断,当加大药物剂量可使小白鼠避免被感染。
训练
1 | # 导入所需库 |
剖析
SVC参数C
SVC方法参数C
代表L2正则化参数,正则化的强度与C
的值城反比,即C值越大正则化强度越弱,其必须严格为正。
例如——1
2
3model = SVC(kernel='linear', C=0.05)
model.fit(X, y)
plot_svm_boundary(model,X,y)
我们减少C的值,可以看到模型拟合数据的程度减弱。
核技巧
SVC方法的kernel
参数可取值{'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}
。像前文中所使用的那样,我们可以使kernel='linear'
进行线性分类。那么如果我们像进行非线性分类呢?
多项式内核
多项式内核kernel='poly'
的原理简单来说就是,用单一特征生成多特征来拟合曲线
我们使用多项式内核,并通过degree=5
设置多项式的最高次数为5。我们可以看出分割出现了一定的弧度。
1 | model = SVC(kernel='poly', C=0.05,degree=5) |
高斯RBF内核
SVC方法默认内核为高斯RBF
这时我们需要引入gamma
参数来控制钟形函数的形状。增加gamma值会使钟形曲线变得更窄,因此每个实例影响的范围变小,决策边界更不规则。减小gamma值会使钟形曲线变得更宽,因此每个实例的影响范围变大,决策边界更平坦。
1 | model = SVC(kernel='rbf', C=1,gamma=0.01) |