共计 1769 个字符,预计需要花费 5 分钟才能阅读完成。
在金融风控、医疗诊断等领域,我们常常遇到数据非线性可分的情况。比如信用卡欺诈检测中,正常交易和欺诈交易在高维特征空间中往往呈现出复杂的分布边界。这时候传统的线性分类器就显得力不从心,而非线性支持向量机(SVM)凭借其强大的核技巧,能够有效处理这类问题。

线性 SVM vs 非线性 SVM
线性 SVM 的决策函数可以表示为:
$$f(x) = w^T x + b$$
其中 $w$ 是权重向量,$b$ 是偏置项。而对于非线性 SVM,我们引入核函数将数据映射到高维空间:
$$f(x) = \sum_{i=1}^n \alpha_i y_i K(x_i, x) + b$$
这里 $K(x_i, x)$ 就是核函数,它巧妙避免了显式计算高维特征映射。
核函数的本质是计算两个向量在特征空间的内积,常见的有:
– RBF 核:$K(x,y)=exp(-\gamma ||x-y||^2)$
– 多项式核:$K(x,y)=(x^T y + c)^d$
Python 实现示例
下面是用 sklearn 实现 RBF 核 SVM 的完整代码:
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
# 生成非线性可分数据
X, y = make_moons(n_samples=100, noise=0.1, random_state=42)
# 创建 SVM 模型管道
model = make_pipeline(StandardScaler(),
SVC(kernel='rbf', C=1.0, gamma='scale')
)
# 训练模型
model.fit(X, y)
# 可视化决策边界
def plot_decision_boundary(model, X, y):
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
h = 0.02
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k')
plt.show()
plot_decision_boundary(model, X, y)
关键参数说明
C:惩罚系数,控制模型对误分类的容忍度。C 越大,模型越容易过拟合。gamma:RBF 核的参数,影响单个样本对决策边界的影响力。gamma 越大,决策边界越复杂。
性能优化
不同核函数的计算复杂度差异明显:
– 线性核:$O(n \times d)$
– RBF 核:$O(n^2 \times d)$
– 多项式核:$O(n^2 \times d^2)$
对于大规模数据,可以采用 Nystroem 方法近似计算核矩阵:
from sklearn.kernel_approximation import Nystroem
nystroem = Nystroem(kernel='rbf', gamma=0.2, n_components=100)
X_transformed = nystroem.fit_transform(X)
避坑指南
- 特征缩放:RBF 核对特征尺度敏感,务必先标准化数据
- 类别不平衡:可以设置 class_weight 参数或使用 SMOTE 过采样
- 交叉验证:不要在整个数据集上做标准化,应该在每个 fold 内单独处理
开放性问题
- 当特征维度远大于样本量时,随机傅里叶特征 (RFF) 可能是比核矩阵更高效的选择
- 相比深度学习,SVM 在小样本、高维数据上仍有优势,且模型更易解释
在实际项目中,我发现合理选择核函数和调参对 SVM 性能影响巨大。通过交叉验证找到最优的 C 和 gamma 组合,往往能获得比默认参数好得多的效果。同时,对于超大规模数据,线性 SVM 配合随机梯度下降可能是更实用的选择。
正文完
发表至: 未分类
近两天内
