单类 SVM:仅用正常样本的边缘异常检测
单类 SVM:仅用正常样本的边缘异常检测
为什么需要单类 SVM
在异常检测任务中,我们经常遇到一种困境:正常样本很容易获取,而异常样本要么极少,要么完全缺失,甚至异常的类型都未知。传统的二分类或多元分类模型无法在这种情况下工作。**单类支持向量机(One-Class SVM)**正是为解决这类问题而生的算法,它只需要正常数据即可建立模型,通过寻找正常样本的“边界”,任何落在边界之外的点都被视为异常。
单类 SVM 的核心思想
单类 SVM 的目标不是将两类分开,而是将原点与正常样本分开。它将正常数据映射到高维特征空间,并寻找一个最优超平面,使得这个超平面与原点距离最大,同时尽可能将正常样本“包裹”在内。
可以直观理解为:模型在特征空间中画出一个“紧密的包围圈”,把全部正常数据包进去,圈外的区域即异常区。这个包围圈由支持向量决定,模型的复杂度和泛化能力也由支持向量的数量调节。
数学原理与优化问题
给定训练集 ${x_i}_{i=1}^n$ 全部为正常样本,单类 SVM 求解如下原始优化问题:
$$ \begin{aligned} \min_{w, \xi, \rho} \quad & \frac{1}{2} |w|^2 + \frac{1}{\nu n} \sum_{i=1}^n \xi_i - \rho \ \text{s.t.} \quad & w \cdot \phi(x_i) \ge \rho - \xi_i, \ & \xi_i \ge 0, \quad i=1,\dots,n \end{aligned} $$
其中:
- $w$ 是超平面的法向量。
- $\phi(x_i)$ 是核函数诱导的映射函数。
- $\rho$ 是偏移项,表示超平面到原点的距离。
- $\xi_i$ 是松弛变量,允许一些样本可以落在超平面靠近原点的一侧,即允许少量样本处于包围圈外。
- $\nu$ 是最关键的超参数,控制异常率的上界和支持向量比率的下界。$\nu \in (0, 1]$,表示你最多能接受多大比例的训练样本被当作异常,同时也是支持向量在训练样本中的最小比例。
决策函数为:
$$ f(x) = \text{sign}\big( w \cdot \phi(x) - \rho \big) $$
如果 $f(x) \ge 0$,则判定为正常;若 $f(x) < 0$,则判定为异常。利用拉格朗日对偶,可以将问题转化为:
$$ \begin{aligned} \min_{\alpha} \quad & \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j K(x_i, x_j) \ \text{s.t.} \quad & 0 \le \alpha_i \le \frac{1}{\nu n}, \ & \sum_{i=1}^n \alpha_i = 1 \end{aligned} $$
其中 $K(x_i, x_j) = \phi(x_i) \cdot \phi(x_j)$ 是核函数。最终 $\rho$ 可以通过任一支持向量 $x_k$ 求出:
$$ \rho = \sum_{i} \alpha_i K(x_i, x_k) $$
关键超参数详解
1. $\nu$ (nu)
- 含义:异常率上界 & 支持向量下界。
- 典型取值范围:$0.01 \le \nu \le 0.5$。如果已知训练数据中几乎没有污染,可设较小值(如 0.01);若怀疑训练数据本身可能包含少量异常,可适当增大。
- 影响:$\nu$ 越小,包围圈越紧,异常检测越严格,可能漏掉更多的真正异常;$\nu$ 越大,模型允许更多训练数据落在圈外,包围圈更宽松。
2. 核函数与 $\gamma$ (以 RBF 核为例)
- 线性核:适用于特征空间已较为分离的场景,计算快。
- RBF 核(高斯核):$K(x_i, x_j) = \exp(-\gamma |x_i - x_j|^2)$,最常用。
- $\gamma$ 控制单个样本的影响半径。$\gamma$ 越大,决策边界越复杂,越容易过拟合;$\gamma$ 越小,边界越平滑,可能欠拟合。通常建议从
1/n_features或'scale'自动计算开始尝试。
3. 核系数与多项式核
degree:多项式核的维度,默认为 3。coef0:核函数中的独立项,常设 0。
单类 SVM 实战流程(以 sklearn 为例)
准备数据
import numpy as np
from sklearn.svm import OneClassSVM
# 生成正常训练数据(仅含正常样本)
X_train = np.random.randn(100, 2) * 0.5 # 100个二维正态点
# 为测试集混入一些异常点
X_test = np.vstack([
np.random.randn(20, 2) * 0.5, # 正常测试点
np.random.uniform(low=-4, high=4, size=(5, 2)) # 异常点
])
模型训练与预测
# 初始化单类SVM
oc_svm = OneClassSVM(kernel='rbf', gamma='scale', nu=0.05)
oc_svm.fit(X_train)
# 预测:返回 +1 表示正常,-1 表示异常
y_pred_train = oc_svm.predict(X_train)
y_pred_test = oc_svm.predict(X_test)
获取异常评分
decision_function 返回点到超平面的带符号距离,负值表示异常。
scores = oc_svm.decision_function(X_test)
# 可以自行设定阈值,而不止依赖 predict 的固定 0 界限
常用的参数调优策略
- 无监督调优:若完全无标签,可观察不同 $\nu$ 和 $\gamma$ 下支持向量的比例,以及包围体体积的变化,避免过拟合。
- 半监督调优:若有极少标注异常,使用 F1-score、AUC 等指标在验证集上选择参数。
- 使用
gamma='scale':sklearn 中默认公式 $\gamma = 1 / (n_features \times \text{Var}(X))$,是一个稳健的起点。
常见核函数选择指南
| 数据特性 | 推荐核函数 | 说明 |
|---|---|---|
| 线性可分、特征维数高 | 线性核(kernel='linear') |
快速、不易过拟合 |
| 非线性边界、中等维度 | RBF 核(kernel='rbf') |
灵活、普适,需调 $\gamma$ |
| 稀疏数据或某些特定结构 | 多项式核(kernel='poly') |
计算量较大,谨慎使用 |
| 时序或特定领域知识 | 自定义核函数 | 可传递自定义核矩阵 |
优势与局限性
优势
- 无需异常样本:仅靠正常数据即可建模,适合冷启动的异常检测系统。
- 理论严谨:基于统计学习理论的间隔最大化原则,泛化性能有保障。
- 可解释性强:支持向量给出了决策边界的支撑点,便于追溯。
- 灵活:通过核函数可以有效处理非线性问题。
局限性
- 对 $\nu$ 和核参数敏感:无标签时调参困难。
- 假设训练数据纯净:如果训练正常样本中混入较多异常,$\nu$ 又设置过小,模型会把异常“包裹”进去,导致漏检。
- 高维诅咒:当特征维度极高且噪声较大时,RBF 核可能失效,建议先降维或选择线性核。
- 计算复杂度:标准实现时间复杂度在 $O(n^2) \sim O(n^3)$ 之间,不适宜超大规模数据(可选用线性单类 SVM 或在线变体)。
应用场景
- 网络安全:基于正常网络流量刻画基线,检测入侵攻击。
- 工业故障检测:利用正常工况下的传感器数据训练,识别设备早期故障。
- 金融反欺诈:建立正常交易画像,捕捉异常交易模式。
- 医疗健康:通过大量正常生理信号建模,预警异常体征。
- 数据清洗:识别并剔除数据集中的离群噪声点。
与其他单类算法的对比
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 单类 SVM | 寻找最大间隔超平面分离原点与正常样本 | 非线性处理能力强、理论完备 | 参数敏感,大数据慢 |
| 孤立森林 (Isolation Forest) | 利用随机树分区异常点更易被孤立 | 速度快、适合高维大数据 | 对局部异常不敏感 |
| 局部异常因子 (LOF) | 比较样本局部密度与其邻居密度 | 能发现局部密度异常 | 计算量较大、参数选择需谨慎 |
| 自编码器 (Autoencoder) | 重构误差较大的点视为异常 | 强非线性、可处理复杂数据 | 需要足够正常数据,训练较慢 |
实践中可将单类 SVM 作为基线,再与其他方法集成,提高鲁棒性。
实操建议与常见问题排查
- 数据标准化至关重要:SVM 对特征尺度敏感,训练前务必进行标准化(如
StandardScaler)。 - 训练数据要纯化:尽可能保证训练集不含异常,可用简单的统计异常检测先行过滤。
- 支持向量数量等于训练集大小:说明模型过拟合了,试着增大
gamma或减小nu。 - 决策分数直方图无负值:可能 $\gamma$ 过大导致每个样本都是支持向量,造成自我围裹;需减小 $\gamma$ 或增大
nu。 - 跨库迁移:sklearn 中异常预测为
-1,正常为+1,注意与其他库的符号区别。
小结
单类 SVM 为无异常先验下的边缘检测提供了优雅的解决方案。深入理解 $\nu$ 参数和核函数对边界形态的影响,是掌握该算法的关键。通过在标准化后的正常数据集上谨慎调参,单类 SVM 能够在众多高价值异常检测场景中发挥不可替代的作用。
核心口诀:
仅以正常画边界,原点到心距离裂。
nu 调紧松,gamma 定疏密,核函数选对才给力。