scikit - learn
库中的支持向量机(SVM)是一种强大且广泛应用的机器学习模型,可用于分类和回归任务。下面详细介绍其原理,包括基本概念、线性可分情况、非线性情况以及核技巧等方面。
基本概念
支持向量机的核心目标是在特征空间中找到一个最优的超平面,使得不同类别的样本能够被尽可能准确地分开,并且这个超平面到各类别样本的间隔最大。这个间隔被称为“边际”,具有最大边际的超平面被认为是最优的决策边界,因为它能够在未知数据上具有较好的泛化能力。
线性可分情况
硬间隔 SVM
假设我们有一个二分类问题,训练数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x n , y n ) } D = \{(\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), \cdots, (\mathbf{x}_n, y_n)\} D={(x1,y1),(x2,y2),⋯,(xn,yn)},其中 x i ∈ R d \mathbf{x}_i \in \mathbb{R}^d xi∈Rd 是第 i i i 个样本的特征向量, y i ∈ { − 1 , + 1 } y_i \in \{-1, +1\} yi∈{−1,+1} 是对应的类别标签。如果存在一个超平面 w T x + b = 0 w^T\mathbf{x}+b = 0 wTx+b=0 能够将正类和负类样本完全分开,即对于所有正类样本 x i \mathbf{x}_i xi 有 w T x i + b > 0 w^T\mathbf{x}_i + b>0 wTxi+b>0,对于所有负类样本 x j \mathbf{x}_j xj 有 w T x j + b < 0 w^T\mathbf{x}_j + b < 0 wTxj+b<0,则称数据集是线性可分的。
硬间隔 SVM 的目标是找到一个超平面 w T x + b = 0 w^T\mathbf{x}+b = 0 wTx+b=0,使得它到最近样本点的距离(边际)最大。这个问题可以转化为一个约束优化问题:
目标函数:
min
w
,
b
1
2
∥
w
∥
2
\min_{w, b} \frac{1}{2}\|w\|^2
w,bmin21∥w∥2
约束条件:
y
i
(
w
T
x
i
+
b
)
≥
1
,
i
=
1
,
2
,
⋯
,
n
y_i(w^T\mathbf{x}_i + b) \geq 1, \quad i = 1, 2, \cdots, n
yi(wTxi+b)≥1,i=1,2,⋯,n
通过求解这个优化问题,可以得到最优的 w w w 和 b b b,从而确定最优超平面。在求解过程中,那些使得约束条件 y i ( w T x i + b ) = 1 y_i(w^T\mathbf{x}_i + b) = 1 yi(wTxi+b)=1 成立的样本点被称为“支持向量”,它们决定了最优超平面的位置和方向。
软间隔 SVM
在实际应用中,大多数数据集并不是完全线性可分的,可能存在一些噪声或异常点。为了处理这种情况,引入了软间隔 SVM。软间隔 SVM 允许一些样本点违反间隔约束,通过引入松弛变量 ξ i ≥ 0 \xi_i \geq 0 ξi≥0 来衡量样本点违反约束的程度。
目标函数:
min
w
,
b
,
ξ
1
2
∥
w
∥
2
+
C
∑
i
=
1
n
ξ
i
\min_{w, b, \xi} \frac{1}{2}\|w\|^2 + C\sum_{i = 1}^{n}\xi_i
w,b,ξmin21∥w∥2+Ci=1∑nξi
约束条件:
y
i
(
w
T
x
i
+
b
)
≥
1
−
ξ
i
,
ξ
i
≥
0
,
i
=
1
,
2
,
⋯
,
n
y_i(w^T\mathbf{x}_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad i = 1, 2, \cdots, n
yi(wTxi+b)≥1−ξi,ξi≥0,i=1,2,⋯,n
其中 C > 0 C>0 C>0 是一个惩罚参数,用于控制对违反间隔约束的样本点的惩罚程度。 C C C 值越大,对违反约束的惩罚越严重,模型会尽量减少违反约束的样本点; C C C 值越小,对违反约束的容忍度越高,模型更注重最大化边际。
非线性情况与核技巧
当数据集是非线性可分的时候,在原始特征空间中找不到一个线性超平面来分开不同类别的样本。此时,可以通过一个非线性映射 ϕ ( ⋅ ) \phi(\cdot) ϕ(⋅) 将原始特征空间 R d \mathbb{R}^d Rd 映射到一个更高维的特征空间 F \mathbb{F} F,使得数据在新的特征空间中变得线性可分。
然而,直接计算
ϕ
(
x
)
\phi(\mathbf{x})
ϕ(x) 可能会导致计算复杂度非常高,甚至不可行。为了解决这个问题,引入了核技巧。核函数
K
(
x
i
,
x
j
)
K(\mathbf{x}_i, \mathbf{x}_j)
K(xi,xj) 定义为:
K
(
x
i
,
x
j
)
=
ϕ
(
x
i
)
T
ϕ
(
x
j
)
K(\mathbf{x}_i, \mathbf{x}_j) = \phi(\mathbf{x}_i)^T\phi(\mathbf{x}_j)
K(xi,xj)=ϕ(xi)Tϕ(xj)
通过核函数,我们可以在原始特征空间中计算样本点在高维特征空间中的内积,而不需要显式地计算 ϕ ( x ) \phi(\mathbf{x}) ϕ(x)。常见的核函数有:
- 线性核函数: K ( x i , x j ) = x i T x j K(\mathbf{x}_i, \mathbf{x}_j)=\mathbf{x}_i^T\mathbf{x}_j K(xi,xj)=xiTxj
- 多项式核函数: K ( x i , x j ) = ( γ x i T x j + r ) d K(\mathbf{x}_i, \mathbf{x}_j)=(\gamma\mathbf{x}_i^T\mathbf{x}_j + r)^d K(xi,xj)=(γxiTxj+r)d,其中 γ > 0 \gamma > 0 γ>0, r r r 是偏移量, d d d 是多项式的次数。
- 径向基核函数(RBF): K ( x i , x j ) = exp ( − γ ∥ x i − x j ∥ 2 ) K(\mathbf{x}_i, \mathbf{x}_j)=\exp(-\gamma\|\mathbf{x}_i - \mathbf{x}_j\|^2) K(xi,xj)=exp(−γ∥xi−xj∥2),其中 γ > 0 \gamma > 0 γ>0。
- Sigmoid 核函数: K ( x i , x j ) = tanh ( γ x i T x j + r ) K(\mathbf{x}_i, \mathbf{x}_j)=\tanh(\gamma\mathbf{x}_i^T\mathbf{x}_j + r) K(xi,xj)=tanh(γxiTxj+r),其中 γ > 0 \gamma > 0 γ>0, r r r 是偏移量。
在使用核函数时,软间隔 SVM 的优化问题可以改写为:
目标函数:
min
α
1
2
∑
i
=
1
n
∑
j
=
1
n
α
i
α
j
y
i
y
j
K
(
x
i
,
x
j
)
−
∑
i
=
1
n
α
i
\min_{\alpha} \frac{1}{2}\sum_{i = 1}^{n}\sum_{j = 1}^{n}\alpha_i\alpha_jy_iy_jK(\mathbf{x}_i, \mathbf{x}_j) - \sum_{i = 1}^{n}\alpha_i
αmin21i=1∑nj=1∑nαiαjyiyjK(xi,xj)−i=1∑nαi
约束条件:
∑
i
=
1
n
α
i
y
i
=
0
,
0
≤
α
i
≤
C
,
i
=
1
,
2
,
⋯
,
n
\sum_{i = 1}^{n}\alpha_iy_i = 0, \quad 0 \leq \alpha_i \leq C, \quad i = 1, 2, \cdots, n
i=1∑nαiyi=0,0≤αi≤C,i=1,2,⋯,n
求解上述优化问题得到最优的拉格朗日乘子
α
∗
\alpha^*
α∗ 后,决策函数可以表示为:
f
(
x
)
=
sign
(
∑
i
=
1
n
α
i
∗
y
i
K
(
x
i
,
x
)
+
b
∗
)
f(\mathbf{x}) = \text{sign}\left(\sum_{i = 1}^{n}\alpha_i^*y_iK(\mathbf{x}_i, \mathbf{x})+b^*\right)
f(x)=sign(i=1∑nαi∗yiK(xi,x)+b∗)
scikit - learn
中的实现
在 scikit - learn
库中,支持向量机模型主要通过 SVC
(用于分类)和 SVR
(用于回归)类来实现。以下是一个简单的二分类示例:
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 只取前两个特征
y = iris.target
y = (y == 0).astype(int) # 二分类问题
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建 SVM 分类器
svm = SVC(kernel='linear', C=1.0)
# 训练模型
svm.fit(X_train, y_train)
# 预测
y_pred = svm.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy}")
在这个示例中,我们使用线性核函数和惩罚参数 C = 1.0 C = 1.0 C=1.0 来训练 SVM 分类器,并在测试集上评估其性能。
综上所述,scikit - learn
中的 SVM 模型基于最优超平面和核技巧的原理,通过求解约束优化问题来找到最优的决策边界,能够有效地处理线性和非线性分类与回归问题。