支持向量机SVM

机器学习专题 · 掌握支持向量机算法

专题:Python机器学习系统学习

关键词:Python, 机器学习, SVM, 支持向量机, 核技巧, RBF核, 软间隔, SVR, 合页损失

一、SVM概述

支持向量机(Support Vector Machine,SVM)是一种经典的监督学习算法,由Vapnik等人于1990年代提出,在深度学习兴起之前一直是最优秀的分类算法之一。SVM的核心思想是在特征空间中找到一个最优分离超平面,使得不同类别的样本不仅被正确分开,而且分类间隔(Margin)达到最大。

SVM建立在统计学习理论的VC维理论和结构风险最小化原理基础之上,具有扎实的数学理论基础。与传统的经验风险最小化方法不同,SVM追求的是结构风险最小化,这使得模型具有出色的泛化能力,即使训练样本有限,也能在测试集上表现良好。

SVM的独特优势体现在以下几个方面:首先,它能够有效处理高维数据,在特征维度远高于样本数量的情况下仍能保持良好性能;其次,通过引入核技巧(Kernel Trick),SVM可以自然地处理非线性分类问题,而不需要显式地计算高维空间中的映射;最后,SVM的决策函数仅由少数支持向量决定,模型具有很好的稀疏性和鲁棒性。

核心思想:SVM的目标是在特征空间中找到一个超平面,使其不仅能将不同类别的样本正确分开,而且使得离超平面最近的样本点(支持向量)到超平面的距离(间隔)最大化。这个"最大间隔"原则是SVM最本质的特征。

二、线性SVM

线性SVM是SVM家族中最基础的成员,它假设训练数据在原始特征空间中是线性可分的。线性SVM的目标是找到一个能将所有样本正确分类且具有最大间隔的线性决策边界。

2.1 分离超平面

在二维空间中,线性分类器的决策边界是一条直线;在三维空间中是一个平面;在高维空间中,我们称之为超平面(Hyperplane)。SVM的分离超平面可以用以下方程表示:

w·x + b = 0

其中 w 是法向量,决定了超平面的方向;b 是偏置项,决定了超平面与原点的距离。对于二分类问题,我们约定正类样本满足 w·x + b > 0,负类样本满足 w·x + b < 0,并进一步将其归一化为 w·x + b >= +1(正类)和 w·x + b <= -1(负类)。这里的 +1 和 -1 仅仅是标记约定,并不代表实际的距离尺度。

2.2 函数间隔与几何间隔

样本点 (x_i, y_i) 到超平面的函数间隔定义为 y_i(w·x_i + b)。函数间隔能够反映样本点被正确分类的程度——如果分类正确,函数间隔为正,且绝对值越大说明分类的置信度越高。但是函数间隔有一个严重的问题:如果我们等比缩放 w 和 b,超平面本身不变,函数间隔却会随之改变。

为解决这一问题,我们引入几何间隔(Geometric Margin)。几何间隔是样本点到超平面的真实欧氏距离,其定义为 y_i(w·x_i + b) / ||w||。几何间隔具有尺度不变性,是真正反映样本点与超平面物理距离的度量。

2.3 最大间隔分类器

最大间隔分类器(Maximum Margin Classifier)是线性SVM在数据完全线性可分情况下的解。其优化目标是在确保所有样本被正确分类的前提下,最大化所有样本中最小几何间隔。这个最小的几何间隔就是支持向量到超平面的距离。

通过巧妙的数学推导,最大化几何间隔等价于最小化 ||w||²/2,约束条件为所有样本的函数间隔至少为1。这个优化问题是一个凸二次规划(Convex Quadratic Programming)问题,具有全局最优解,不存在局部极值问题。

2.4 支持向量

支持向量(Support Vectors)是训练数据中距离决策边界最近的样本点,它们恰好位于间隔边界上,即满足 y_i(w·x_i + b) = 1。这个名称恰如其分地反映了它们的重要性——这些样本点"支撑"起了整个分类边界。如果移除或移动支持向量,决策边界将发生改变;而其他远离边界的样本点(非支持向量)即使被移除,也不会影响已经训练好的模型。这一特性使得SVM模型具有天然的稀疏性,存储和计算效率都很高。

重要理解:SVM的决策函数完全由支持向量决定。这意味着大多数训练样本(非支持向量)对最终模型没有任何贡献,模型只"记住"了那些最难分类的少数样本。这与kNN等需要记住所有训练样本的算法形成鲜明对比。

2.5 优化目标

线性SVM的优化问题可以形式化表述为:

min (1/2)||w||^2
s.t. y_i(w·x_i + b) >= 1, i = 1, 2, ..., n

这是一个典型的凸二次规划问题。求解时通常利用拉格朗日对偶性(Lagrange Duality)将其转化为对偶问题,引入拉格朗日乘子 α_i >= 0。对偶问题的优点是:目标函数只涉及样本间的内积运算,这为后续引入核技巧奠定了基础。求解对偶问题得到 α_i 后,决策函数可以表示为:

f(x) = sign(Σ α_i y_i (x_i · x) + b)

其中求和仅对支持向量(α_i > 0 对应的样本)进行,进一步体现了模型的稀疏性。

2.6 硬间隔与软间隔

硬间隔SVM(Hard Margin SVM)要求所有训练样本必须被正确分类且位于间隔边界之外。这在数据完全线性可分时效果很好,但一旦数据中存在噪声或异常点,硬间隔SVM就会产生严重的过拟合问题。硬间隔还有一个根本性的局限——现实生活中大多数数据集都不是线性可分的。软间隔SVM(Soft Margin SVM)的提出就是为了解决这一问题,它允许部分样本被错误分类或落在间隔内部,以换取更强的泛化能力。

三、软间隔SVM

软间隔SVM是实际应用中最常用的线性SVM变体,它通过在优化目标中引入松弛变量来容忍一定程度的分类错误,从而在间隔最大化和分类错误之间取得平衡。

3.1 松弛变量

软间隔SVM为每个训练样本引入一个非负的松弛变量 ξ_i >= 0。ξ_i 衡量了样本违反间隔约束的程度:当 ξ_i = 0 时,样本被正确分类且位于间隔边界之外;当 0 < ξ_i <= 1 时,样本落在间隔内部但仍在正确的一侧;当 ξ_i > 1 时,样本被错误分类。引入松弛变量后,约束条件变为:

y_i(w·x_i + b) >= 1 - ξ_i, i = 1, 2, ..., n

3.2 惩罚参数C

软间隔SVM的优化目标变为在最大化间隔(最小化 ||w||²)和最小化分类错误(最小化 Σξ_i)之间取得平衡:

min (1/2)||w||^2 + C Σ ξ_i

这里的惩罚参数C是一个重要的超参数,它在间隔大小和分类错误之间起到权衡作用:

C参数的选择通常通过交叉验证来完成。在实际应用中,C的取值通常在 0.001 到 1000 之间以对数尺度进行搜索。

3.3 合页损失

从损失函数的角度来看,软间隔SVM实际上是在最小化合页损失(Hinge Loss)加上L2正则化项。合页损失的定义为:

L(y, f(x)) = max(0, 1 - y·f(x))

合页损失的名称来源于其形状像一本打开的书中间凸起的"合页"。当样本被正确分类且函数间隔大于1时,损失为0;当样本落在间隔内部或被错误分类时,损失随函数间隔线性增长。与逻辑回归的对数损失相比,合页损失对已经正确分类且远离边界的样本不再施加额外的惩罚,这进一步强化了SVM关注困难样本的特性。

关键理解:合页损失是SVM与其他分类器之间本质区别的体现。SVM不关心那些已经被正确分类且远离决策边界的样本——一旦一个样本的置信度足够高(函数间隔 ≥ 1),它的损失就变成了0。这与逻辑回归不同,逻辑回归会对所有样本持续施加梯度更新。

四、核技巧(Kernel Trick)

核技巧是SVM能够处理非线性分类问题的关键,也是SVM最富有创造性和数学美感的组成部分。核技巧的核心思想是将原始特征空间中的数据通过某种非线性映射隐式地映射到高维特征空间,使得原本线性不可分的数据在高维空间中变得线性可分。

4.1 为什么需要核函数

现实世界中的分类问题往往是线性不可分的。例如,二维平面上的异或(XOR)数据模式——两个正类样本分布在坐标轴的第一和第三象限,负类样本在第二和第四象限——不可能用一条直线将其分开。然而,如果我们将数据映射到更高维的空间,比如添加一个特征维度 z = x₁×x₂,那么数据在高维空间中就变得线性可分了。问题在于,显式地进行高维映射并计算映射后的内积,计算复杂度非常高,甚至可能映射到无穷维空间。

核函数正是解决这一困境的巧妙方法。核函数 K(x_i, x_j) 能够直接计算两个样本在高维特征空间中的内积,而不需要显式地知道映射函数 φ 的具体形式:

K(x_i, x_j) = φ(x_i) · φ(x_j)

这就是所谓的"核技巧"——通过核函数在低维空间完成高维空间的内积计算,计算复杂度与原始空间一致。

4.2 核函数的本质

从数学角度看,核函数本质上是在原始特征空间中定义了一种新的相似性度量。一个有效的核函数必须满足Mercer条件,即对应的核矩阵是半正定的。从另一个角度看,使用核函数的SVM等价于在由该核函数定义的再生核希尔伯特空间(RKHS)中寻找最大间隔线性分类器。

核技巧的美妙之处在于,它将SVM的线性版本和非线性版本统一在了同一个框架之下——我们只需要将对偶问题中的内积 x_i·x_j 替换为核函数 K(x_i, x_j) 即可。因此,线性SVM可以被视为使用线性核的特殊情况。

4.3 常用核函数

不同的核函数对应不同的特征映射方式,适用于不同类型的数据分布:

4.4 核函数的选择指南

数据类型/场景推荐核函数说明
特征维度高(如文本分类)线性核特征已经足够表达,非线性映射反而可能过拟合
特征维度低,样本量适中RBF核通用性最强,默认首选
数据具有多项式结构多项式核当特征间存在已知的多项式关系时使用
样本量非常大线性核RBF核在大数据上训练极其缓慢
不确定如何选择RBF核RBF核是默认推荐,先进行参数调优

实践建议:在实际应用中,RBF核通常是首选方案。它可以处理非线性关系,需要调整的参数较少(只有C和γ两个主要参数),而且数值稳定性好。建议先使用RBF核,通过网格搜索(Grid Search)结合交叉验证来确定最优的C和γ组合。

五、SVR支持向量回归

SVM的思想不仅可以用于分类问题,还可以推广到回归问题,这就是支持向量回归(Support Vector Regression,SVR)。SVR在股票价格预测、时间序列分析、工程建模等领域都有广泛应用。

5.1 SVR的基本思想

与传统的回归方法试图最小化预测值与真实值之间的误差不同,SVR的核心思想是寻找一个函数 f(x),使得所有训练样本最多在 ε 的误差范围内偏离 f(x)。换句话说,SVR构建了一个以 f(x) 为中心、宽度为 2ε 的"不敏感管道"(ε-tube),鼓励所有样本点落在管道内部。落在管道内部的样本不产生损失,只有管道外部的样本才会贡献损失。

SVR同样支持使用核技巧处理非线性回归问题。与分类SVM类似,SVR也可以通过引入松弛变量和惩罚参数C来处理管道外的样本。

5.2 ε-不敏感损失函数

ε-不敏感损失函数是SVR区别于标准回归方法的关键所在,其定义为:

L(y, f(x)) = max(0, |y - f(x)| - ε)

当预测误差 |y - f(x)| 小于 ε 时,损失为0;当误差超过 ε 时,只对超出部分计算线性损失。ε 参数控制了对误差的容忍程度:ε 越大,管道越宽,模型越简单(可能有更多支持向量位于管道边界上);ε 越小,管道越窄,模型越复杂,越容易过拟合。ε 的取值通常需要结合数据的噪声水平和尺度和C参数一起调节。

5.3 SVR vs 标准线性回归

对比维度SVR标准线性回归
优化目标最小化管道外误差 + 正则化最小化所有样本的均方误差
对异常值敏感度低(仅关注管道外样本)高(每个样本都影响模型)
模型稀疏性有(仅支持向量决定模型)无(所有样本决定模型)
非线性处理天然支持(核技巧)需要手动构造特征
参数调整需要调整 C, ε, 核参数基本无需调整

六、SVM的scikit-learn实现

scikit-learn提供了完善的SVM实现,其中最主要的类是 sklearn.svm.SVC(分类)和 sklearn.svm.SVR(回归)。下面详细介绍SVC的核心参数和使用要点。

6.1 SVC参数详解

from sklearn.svm import SVC # SVC的核心参数 model = SVC( C=1.0, # 惩罚参数,值越大严格分类,越小容忍误差 kernel='rbf', # 核函数类型:'linear','poly','rbf','sigmoid' gamma='scale', # RBF核参数:'scale'=1/(n_features*X.var()),'auto'=1/n_features degree=3, # 多项式核的度数(仅当kernel='poly'时生效) coef0=0.0, # 核函数中的独立项r(仅poly和sigmoid核) class_weight=None, # 类别权重:'balanced'或字典,处理不平衡数据 probability=False, # 是否启用概率估计(启用会降低速度) tol=1e-3, # 收敛容忍度 max_iter=-1, # 最大迭代次数,-1表示无限制 random_state=None # 随机种子 )

这些参数中,C、kernel 和 gamma 是最重要的三个调参对象。对于RBF核,C和γ的组合决定了模型的整体性能。通常采用网格搜索(GridSearchCV)来寻找最佳参数组合。

from sklearn.model_selection import GridSearchCV param_grid = { 'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001], 'kernel': ['rbf'] } grid = GridSearchCV(SVC(), param_grid, cv=5, verbose=1) grid.fit(X_train, y_train) print(f"最佳参数: {grid.best_params_}") print(f"最佳交叉验证得分: {grid.best_score_:.4f}")

6.2 数据标准化的重要性

SVM对特征的尺度极其敏感。原因在于SVM的优化目标中包含距离计算(无论是原始空间中的内积还是RBF核中的欧氏距离)。如果一个特征的数值范围远大于其他特征,该特征将会主导距离计算,导致模型性能下降。因此,在使用SVM之前,必须对特征进行标准化或归一化处理:

from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline # 使用pipeline确保标准化与模型绑定 svm_pipeline = make_pipeline( StandardScaler(), SVC(C=10, kernel='rbf', gamma='scale') ) svm_pipeline.fit(X_train, y_train) y_pred = svm_pipeline.predict(X_test)

StandardScaler 将每个特征减去均值后除以标准差,使得所有特征均值为0、方差为1。这是SVM最常用的数据预处理方式。

6.3 多分类策略

SVM天然是二分类器,但可以通过组合策略扩展到多分类问题。scikit-learn的SVC内部自动实现了两种多分类策略:

一般来说,OvO在类别数量不多时更准确(因为每个子问题更简单),但训练时间随类别数平方增长。OvR训练的子分类器数量与类别数线性相关,更适合类别较多的情况。

6.4 概率输出

SVM不直接输出概率,而是输出样本到决策边界的距离(即决策函数值)。如果应用程序需要概率输出(如用于排序或与概率模型集成),可以通过设置 probability=True 来启用Platt缩放——这是一种将SVM输出映射到[0,1]概率区间的后处理技术。

model = SVC(probability=True) model.fit(X_train, y_train) probabilities = model.predict_proba(X_test) # 返回形状为 (n_samples, n_classes) 的概率矩阵

需要注意的是,启用 probability=True 会额外进行一次交叉验证来校准概率,这会显著增加训练时间。如果不需要概率输出,建议保持 probability=False 以获得更快的训练速度。

七、SVM的优缺点

理解SVM的优缺点有助于我们在实际项目中正确选择和合理使用这一算法。

7.1 优点

7.2 缺点

7.3 适用场景

场景类型推荐使用SVM的理由
小样本高维数据(如基因表达数据)SVM在小样本高维场景下表现最优
文本分类文本特征稀疏且维度高,线性SVM非常高效
图像识别(特征工程后)配合RBF核在HOG、SIFT等手工特征上表现优异
生物信息学蛋白质分类、药物发现等小样本高维问题
作为基准模型SVM性能稳定,常作为新算法的比较基线
样本量超过10万建议改用随机森林、XGBoost或神经网络

总体评价:SVM是机器学习领域的一座丰碑。在深度学习全面普及之前,SVM是学术界和工业界最主流的分类算法之一。虽然在图像、语音等端到端学习领域已被深度学习超越,但在小样本、高维特征、文本处理等特定场景中,SVM仍然是一个极具竞争力的选择。对于每一位机器学习从业者来说,深入理解SVM的原理都是构建扎实理论根基的重要一步。