支持向量机(Support Vector Machine,简称SVM)是一种二分类模型,基本模型是定义在特征空间上的间隔最大的线性分类器。SVM的理论基础是统计学中的结构风险最小化和VC维理论。
SVM的目标是寻找到最优的超平面,可以将不同类别的样本数据分隔开。即:寻求最优分类边界。
SVM的关键技术是核函数,核函数可以将在低维度空间中的线性不可分问题映射为高维度空间中的线性可分问题。
1、相关术语
支持向量
距离超平面最近的样本点使公式的等号成立,样本点被称为"支持向量" (support vector) ,两个异类支持向量到超平面的距离之和,称为"间隔" (margin)。
支持向量机的一个重要性质:训练完成后,大部分的训练样本都不需保留,最终模型仅与支持向量有关。
核函数
核函数表示特征空间中的内积,作用是使用低维空间数据模拟高维空间的内积,达到线性可分的目的。
任何一个核函数都隐式地定义了一个称为"再生核希尔伯特空间" (Reproducing Kernel Hilbert Space ,简称RKHS) 的特征空间。
基于核函数的学习方法,统称为"核方法" (kernel methods)。最常见的,是通过"核化" (即引入核函数)来将线性学习器拓展为非线性学习器。
备注:高斯核亦称RBF 核
软间隔与正则化
“硬间隔” (hard margin):所有样本的划分都必须是正确的。
“软间隔” (soft margin):允许某些样本不满足约束条件。
软间隔优化目标可写为
min
w
,
b
1
2
∥
ω
∥
2
+
C
∑
i
=
1
m
l
0
/
1
(
y
i
(
w
T
x
i
+
b
)
−
1
)
\min_{w,b}\: \frac{1}{2}\left \| \omega \right \|^2+C\sum_{i=1}^{m}l_{0/1}(y_i(w^Tx_i+b)-1)
w,bmin21∥ω∥2+Ci=1∑ml0/1(yi(wTxi+b)−1)
其中
C
>
0
C>0
C>0是二个常数,
l
0
/
1
l_{0/1}
l0/1是"0/1损失函数"
l
0
/
1
=
{
1
,
i
f
z
<
0
;
0
,
o
t
h
e
r
w
i
s
e
l_{0/1}=\left\{\begin{matrix} 1, \:\: if\:\: z<0; & \\ 0, \:otherwise & \end{matrix}\right.
l0/1={1,ifz<0;0,otherwise
l
0
/
1
l_{0/1}
l0/1非凸、非连续,数学性质不太好,人们通常用一些其他函数来代替
l
0
/
1
l_{0/1}
l0/1, 称为"替代损失" (surrogate loss),包括hinge 损失、指数损失(exponential loss)、对率损失(logistic loss)
替代损失函数的共性:
优化目标中的第一项用来描述划分超平面的"间隔"大小,另一项
Σ
i
=
1
m
l
(
f
(
x
i
)
,
y
i
)
\Sigma_{i=1}^ml(f(x_i),y_i)
Σi=1ml(f(xi),yi)用来表述训练集上的误差,可写为更一般的形式
min
f
Ω
(
f
)
+
C
Σ
i
=
1
m
l
(
f
(
x
i
)
,
y
i
)
\min_f\: \Omega(f)+C\, \Sigma_{i=1}^ml(f(x_i),y_i)
fminΩ(f)+CΣi=1ml(f(xi),yi)
其中
Ω
(
f
)
\Omega(f)
Ω(f)称为"结构风险" (structural risk),用于描述模型
f
f
f的某些性质;第二项
Σ
i
=
1
m
l
(
f
(
x
i
)
,
y
i
)
\Sigma_{i=1}^ml(f(x_i),y_i)
Σi=1ml(f(xi),yi)称为"经验风险" (empirical risk),用于描述模型与训练数据的契合程度;C 用于对二者进行折中。
从降低过拟合风险角度来说,
Ω
(
f
)
\Omega(f)
Ω(f) 称为正则化项, C 则称为正则化常数。
正则化可理解为一种"罚函数法"即对不希望得到的结果施以惩罚,从而使得优化过程趋向于希望目标。
2、Sklearn代码实现
支持向量机 (SVMs) 可用于的监督学习算法包括分类,回归 和 异常检测。
Sklearn库中的算法,如下:
多元分类:SVC, NuSVC 和 LinearSVC;
回归:SVR, NuSVR 和 LinearSVR;
异常检测:类OneClassSVM实现了一个用于离群点检测的单类SVM。
示例:鸢尾花数据集分类,同时使用GridSearchCV评估参数组合
from sklearn import datasets, svm
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
def svm_trainer():
"""
SVC训练模型
SVC模型的参数说明,如下
C:正则强度,C越大误差越小,容易过拟合
gamma:内核系数,gamma越大,支持向量越少,gamma值越小,支持向量越多
:return:
"""
# 加载鸢尾花数据集
iris = datasets.load_iris()
x = iris.data
y = iris.target
# 拆分数据集
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=5)
# 不同核函数
kernels = ['linear', 'poly', 'rbf', 'sigmoid']
for k in kernels:
model = svm.SVC(kernel=k, C=10, gamma='scale')
# 模型训练
model.fit(train_x, train_y)
# 预测-测试数据
print('{}'.format(k), model.score(test_x, test_y))
# GridSearchCV网格搜索,评估 param_grid 参数值的所有可能组合,计算出最佳组合
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
clf = GridSearchCV(svm.SVC(), param_grid)
clf.fit(train_x, train_y)
print('GridSearchCV Result:')
print('best estimator', clf.best_estimator_)
print('best score', clf.best_score_)
print('best parameters', clf.best_params_)
if __name__ == '__main__':
# 训练模型
svm_trainer()
运行结果,如下:
通过输出可看出多种参数组合中,{‘C’: 1, ‘kernel’: ‘linear’}是本次试验的最佳组合。