老园丁要出远门,把花园交给从未见过杂草的管家。管家干了一件漂亮事:他没有费力学“杂草长什么样”,而是围着整片花圃扎了一道紧贴植物外侧的篱笆。篱笆里,是正常;篱笆外,一律可疑。这就是 One-Class SVM 的智慧——只学习“正常”的模样,把边界之外的一切统统视为异常。现实中这样的场景太多了:设备故障难得一遇,欺诈手法天天翻新,质检缺陷五花八门,能拿到的干净标签几乎全是“正常”。本文会用花园篱笆的比喻,带你理解 One-Class SVM 背后的“最小包围球”思想(SVDD),认识核函数这个“变形法术”,拧动 nu 与 gamma 两个关键旋钮,再横向对比 Isolation Forest 和 AutoEncoder 两种常被放在一起讨论的模型,最后落到特征工程与模型评估这些工程细节上。读完你会明白:异常检测不是“认出坏人”,而是“守住最后的界线”。

岗位关联

对 AI 从业者而言,One-Class SVM 是你在“只有正样本、标签极度稀缺”的工业场景里最可靠的第一道防线,掌握它能让你在故障检测、反欺诈、质检等任务中快速交付一个可用的基线模型。

目录
  1. 可视化演示
  2. 异常检测:只有正样本的世界
  3. SVDD 思想:给花园罩一个玻璃球
  4. 核函数选择:能变形的法术网
  5. 超参调优:nu 与 gamma 两个旋钮
  6. 算法对比:三种管园方式
  7. 特征工程:先给植物量好尺寸
  8. 模型评估:看得出错才算好
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

异常检测:只有正样本的世界

老园丁要出差,管家面前是一整园花草。管家没见过杂草,但他知道一件事:老园丁种的花都在这片园子里。他的策略不是去学习“什么是杂草”,而是先锁定“什么算正常”——凡是正常档案上对不上的,都值得警惕。这正是异常检测的起点:你手里只有一份正常档案,却要回答“这个新来的东西正不正常”。

在机器学习里,这种设定叫单类异常检测。传统分类需要正、负两类样本,但现实里异常极其稀有:一万次设备运行才可能有一次故障,一年几千万笔交易里只有几千笔欺诈。能稳定拿到的只有“正常”样本。One-Class SVM 属于“边界法”:它不在数据里找异常,而是只给“正常”画一条闭合边界,边界内放行,边界外都是可疑分子。

最朴素的想法是“看距离”:新样本离所有已见过的正常样本都很远,那就该报警。把这句话写成数学就是:

min⁡i∥x−xi∥>θ⇒x 为异常\displaystyle \min_{i} \|x - x_i\| > \theta \Rightarrow x \text{ 为异常}

1. 欧氏距离 $\|x - x_i\|$:新样本与某个已见样本之间的直线距离,衡量“长得像不像”。

∥x−xi∥=∑j=1d(xj−xij)2\displaystyle \|x - x_i\| = \sqrt{\sum_{j=1}^{d}(x_j - x_{ij})^2}

2. 最近邻距离 $\displaystyle \min_{i}$:在所有已见样本里,找离 x 最近的那个。

dmin⁡(x)=min⁡i=1,2,…,n∥x−xi∥\displaystyle d_{\min}(x) = \min_{i=1,2,\dots,n} \|x - x_i\|

3. 阈值比较 θ:最近距离都超过阈值,说明 x 周边没有正常样本撑着,判为异常。

dmin⁡(x)>θ⇒x 是异常\displaystyle d_{\min}(x) > \theta \Rightarrow x \text{ 是异常}

管家发现,“比距离”的方法太脆:样本稍微稀疏一点,误报就变多。于是他决定换一个更结实的思路——在花园上空扣一只尽量小的玻璃罩,把所有正常的植物都罩进去。这就是下一节要讲的球。

SVDD 思想:给花园罩一个玻璃球

管家不满足于逐个比距离。他想,与其记下每一盆花的坐标,不如俯视整片花圃,扣一个透明的玻璃罩,把绝大多数植物都罩进去。罩子越小越好——越小说明管家对“正常”的理解越紧凑。以后有来客,不用翻档案,只需问一句:它在不在罩子里?

这只玻璃罩在数学里叫最小包围超球,是 SVDD(Support Vector Data Description,支持向量数据描述)的核心。它的任务是:在高维空间找到一个球心 c、半径 R,把尽量多的正常样本包进球里,同时让球尽量小。为了照顾个别长歪的样本,允许极少数样本站在球外,由松弛变量 ξ 和参数 nu 来承担惩罚。优化目标写成:

min⁡R,c,ξ  R2+1νn∑i=1nξi,s.t.∥ϕ(xi)−c∥2≤R2+ξi,  ξi≥0\displaystyle \min_{R,c,\xi} \; R^2 + \frac{1}{\nu n}\sum_{i=1}^{n}\xi_i, \quad \text{s.t.} \quad \|\phi(x_i) - c\|^2 \le R^2 + \xi_i, \; \xi_i \ge 0

1. 球半径 R:超球的半径平方,是我们要最小化的主要目标。

R2\displaystyle R^2

2. 松弛变量 $\xi_i$:第 i 个样本破球而出的距离,允许少数样本不待在球里。

ξi=max⁡(0,∥ϕ(xi)−c∥2−R2)\displaystyle \xi_i = \max(0, \|\phi(x_i) - c\|^2 - R^2)

3. 折中系数 $\displaystyle \frac{1}{\nu n}$:把越界总惩罚折算进目标,nu 越大,允许的越界越多。

1νn∑i=1nξi\displaystyle \frac{1}{\nu n}\sum_{i=1}^{n}\xi_i

4. 球心 c 与映射 φ:所有操作都在核函数映射后的高维空间里进行。

ϕ(x):Rd→F\displaystyle \phi(x): \mathbb{R}^d \rightarrow \mathcal{F}

训练完成后,真正顶着罩子内壁的少数样本被称为支持向量。它们像篱笆的柱桩,决定了球的位置和大小。有趣的是,罩子越缩越小,直到快碰到最外侧那几盆花的花瓣才停住——未来任何一株植物,只要叶片探出弧线,管家立刻报警。这“顶着罩子的花瓣”,就是我们下一节的主角——核函数和它的尺度参数。

核函数选择:能变形的法术网

花园里的植物并不会乖乖排成圆形。月季长成一条月牙,薄荷丛是一团蓬松的云。管家发现,任何圆形玻璃罩都套不出“正常”的轮廓。这时园丁留给他一张“法术网”(核函数):只要默念口诀,原本歪歪扭扭的花圃就会被“拍扁再撑开”,变成形状规整、能被圆罩轻松包住的样子。

这个法术在 SVM 家族里叫核函数(Kernel Function)。它不真的把数据搬到高维去算距离,而是通过核技巧在低维空间直接计算高维内积,既省力气又效果好。One-Class SVM 里最常用的默认选择就是 RBF(径向基函数)核,也被称为高斯核:

K(x,z)=exp⁡ ⁣(−γ∥x−z∥2)\displaystyle K(x,z) = \exp\!\left(-\gamma \|x - z\|^2\right)

1. 平方距离 $\|x - z\|^2$:两个样本在原始特征空间中的距离平方。

∥x−z∥2=∑j=1d(xj−zj)2\displaystyle \|x - z\|^2 = \sum_{j=1}^{d}(x_j - z_j)^2

2. 缩放系数 γ:gamma 越大,距离稍微拉开一点,相似度就迅速衰减;gamma 越小,衰减越平缓。

γ>0\displaystyle \gamma > 0

3. 指数映射 $\exp$:把非负的距离变成 (0,1] 的相似度分数,距离为 0 时相似度是 1。

exp⁡(−t)∈(0,1],t≥0\displaystyle \exp(-t) \in (0,1], \quad t \ge 0

除了 RBF,还有线性核(适合边界本来就接近线性的情况)和多项式核(适合有一定交互特征的数据)。但 RBF 因为能拟合任意形态的边界、参数只有 gamma 一个,成了默认首选。法术网用一次能把月牙地形拉直,用两次能把云团吹圆,但法力也有代价——用力过猛会把正常叶片也扯出圆外。所以选核函数像选工具的形状,而 gamma 是工具的锋利程度。下一节,我们去拧这两个决定性格的旋钮。

超参调优:nu 与 gamma 两个旋钮

管家拿到法术网后发现,上面有两个旋钮。一个写“容忍度”,叫 nu;一个写“精细度”,叫 gamma。nu 往大拧,意味着管家允许几株长势奇怪的植物待在篱笆外;gamma 往大拧,篱笆开始疯狂贴合每一片叶子,甚至把一片叶子上的虫洞都抠成边界。拧过头,整个花园会被切成无数碎块。

技术上讲,nu 是 One-Class SVM 最重要的超参:它是训练集中“离群点”比例的上界,同时也是支持向量比例的下界。比如 nu=0.05,模型最多容忍 5% 的训练样本被当成异常丢弃,且至少有 5% 的样本会成为顶着边界的支持向量。gamma 则是 RBF 核的带宽参数,直接影响边界的光滑程度。训练完成后,模型真正记住的不是整片花圃,而是少数支持向量:

f(x)=sign⁡ ⁣(∑i=1nαiK(xi,x)−ρ)\displaystyle f(x) = \operatorname{sign}\!\left(\sum_{i=1}^{n}\alpha_i K(x_i, x) - \rho\right)

1. 支持向量权重 $\alpha_i$:只有顶着边界的样本权重非零,其余样本不参与决策。

αi≥0\displaystyle \alpha_i \ge 0

2. 核函数加权和:新样本与每个支持向量的相似度乘以权重后汇总。

s(x)=∑i=1nαiK(xi,x)\displaystyle s(x) = \sum_{i=1}^{n}\alpha_i K(x_i, x)

3. 阈值 ρ:加权相似度要超过这个阈值才判正常。

ρ∈R\displaystyle \rho \in \mathbb{R}

4. 符号函数 $\operatorname{sign}$:结果为正返回 +1(正常),为负返回 -1(异常)。

sign⁡(t)={+1t≥0−1t<0\displaystyle \operatorname{sign}(t) = \begin{cases} +1 & t \ge 0 \\ -1 & t < 0 \end{cases}

调参经验上,nu 通常取 0.01~0.1 的小值,因为正常样本里没那么多怪胎;gamma 默认值常用 $\text{gamma} = \frac{1}{d \cdot \text{Var}(X)}$(sklearn 里的 scale)。更可靠的调参方法是网格搜索加验证集上的 F1 或召回率。记住:nu 是“容忍度”,不是“真实异常比例”;gamma 太大是过拟合的警报灯——篱笆绕每片叶子走,风一吹叶子就出了篱笆。

算法对比:三种管园方式

同一座花园,三位管家方法各不相同。SVM 管家画篱笆(边界法);Isolation Forest 管家玩“切西瓜”——闭眼随机切几刀,几刀就能把一株植物孤零零分出来的,说明它本来就孤立;AutoEncoder 管家是个“临摹画家”,他日日临摹正常植物的神态,换一个怪诞品种来临摹,笔触会乱得不成样子(重构误差大)。

Isolation Forest(孤立森林)的原理是随机切分特征空间,异常点分布稀疏,往往切几刀就被孤立。它的异常得分定义为:

s(x,n)=2−E(h(x))c(n)\displaystyle s(x, n) = 2^{-\frac{E(h(x))}{c(n)}}

1. 路径长度 $h(x)$:一棵随机树中把 x 孤独切出来所需的分割次数。

h(x)∈{0,1,2,…,n−1}\displaystyle h(x) \in \{0, 1, 2, \ldots, n-1\}

2. 平均路径 $E(h(x))$:森林中所有树上的路径长度取平均,抹平随机性。

E(h(x))=1T∑t=1Tht(x)\displaystyle E(h(x)) = \frac{1}{T}\sum_{t=1}^{T} h_t(x)

3. 归一化常数 $c(n)$:近似样本的期望路径长度,用来对齐不同规模的数据集。

c(n)=2ln⁡(n−1)+0.5772−2(n−1)n\displaystyle c(n) = 2\ln(n-1) + 0.5772 - \frac{2(n-1)}{n}

4. 得分映射 $2^{-\cdot}$:路径越短,指数绝对值越小,得分越接近 1,越异常。

s(x,n)∈(0,1]\displaystyle s(x, n) \in (0, 1]

AutoEncoder(自编码器)则先用正常样本训练“压缩再还原”,模型只会熟练地复原正常形态;遇到没见过的异常形态,还原出的残影就会与原图相差巨大,重构误差自然成为异常分数。三种方法各有地盘:One-Class SVM 适合几百到几千样本、边界清晰的场景;Isolation Forest 高维大数据又快又稳;AutoEncoder 最擅长图像、音频等原始信号。没有万能管家,画篱笆的怕地形复杂但胜在精确,切西瓜的快但看不清细节,临摹的画得慢但最懂神态——选工具之前,先想清楚你的花园长什么样。

特征工程:先给植物量好尺寸

花园档案册上记录的是“株高(米)、叶宽(厘米)、颜色深度(0-255)”。管家刚想画篱笆就发现不对:株高波动不到 0.5,颜色深度动辄差 200。如果直接揉在一起算距离,“叶色”会一个人把篱笆的方向拖走。必须先做一件事——把每个量纲都拉到同一把尺子上。

One-Class SVM 依赖距离和核函数,对特征尺度极其敏感。特征工程的目标是让“正常样本”在特征空间里尽量紧凑、均匀,这样学出的球才能又小又准。最基础的变换是标准化:

z=x−μσ\displaystyle z = \frac{x - \mu}{\sigma}

1. 均值 μ:该特征在正常样本上的平均水平。

μ=1n∑i=1nxi\displaystyle \mu = \frac{1}{n}\sum_{i=1}^{n}x_i

2. 标准差 σ:该特征在正常样本上的波动幅度。

σ=1n∑i=1n(xi−μ)2\displaystyle \sigma = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(x_i - \mu)^2}

3. 标准化变换 z:减均值再除标准差,让每个特征的尺度统一。

z=x−μσ\displaystyle z = \frac{x - \mu}{\sigma}

除了标准化,还有几个实用建议:删除方差接近零的“死特征”(它们不提供信息只增加噪声);用 PCA 去除冗余相关性;对长尾分布的特征做对数变换。要注意的是,标准化里的 μ 和 σ 只能用训练集(正常样本)去算,测试时直接复用,防止泄漏未来信息。统一尺子之后,篱笆才不会被一两个“嗓门大的特征”牵着鼻子走。特征工程在 One-Class SVM 里不是锦上添花,而是地基——地基偏了,篱笆扎得再漂亮也是歪的。

模型评估:看得出错才算好

管家干了一个月,老园丁回来了,问:“篱笆扎得怎么样?”管家犯难了:花园里确实没出现杂草,可这篱笆到底拦没拦住过东西?后来他一拍脑袋:虽然大部分时候没杂草,但翻翻门房记录,有几回邻居家的猫溜进来过——用这几个“历史异常”,就能试试篱笆灵不灵。

无监督异常检测的评估难在“没有足够标注”。常见做法是:训练时只用正常样本,验证/测试时混入少量已知异常,看模型把它们揪出来的能力。用 decision_function 输出连续分数(越靠球心越正常),调整阈值可以控制告警灵敏度。评估指标中,F1 分数综合了精确率和召回率:

F1=2×precision×recallprecision+recall\displaystyle F_1 = \frac{2 \times \text{precision} \times \text{recall}}{\text{precision} + \text{recall}}

1. 精确率 precision:模型报的异常里,有多少是真异常(不冤枉好人)。

precision=TPTP+FP\displaystyle \text{precision} = \frac{TP}{TP + FP}

2. 召回率 recall:真实异常里,有多少被模型抓住(不漏掉坏人)。

recall=TPTP+FN\displaystyle \text{recall} = \frac{TP}{TP + FN}

3. 调和平均:两个指标差距过大时,F1 会被拖得很低,防止“只报一个准的”这类投机行为。

F1∈[0,1]\displaystyle F_1 \in [0, 1]

具体操作时,遍历阈值画出 ROC 曲线看 AUC,或画 PR 曲线看精确率-召回率的权衡。异常检测中异常样本极其稀缺,ROC 曲线容易被大量负样本“稀释”,PR 曲线往往更接近实际业务感受。篱笆好不好,不能光听管家夸自己修得勤,要看猫真的钻过时被拦下几回(召回率),也要看好花被误判摞倒几棵(误报率)。记住:在异常检测里,虚惊一场的损失往往小于漏掉真凶的损失——调阈值时心里要有这杆秤。

AI 应用场景

工业质检:用合格品画像揪出没见过的问题

阶段:模型训练与上线部署

解决的问题:产线每天产出数十万件零件,次品形态千奇百怪,还会出现从未见过的缺陷类型。传统视觉规则要人工编写阈值、轮廓、颜色等判断逻辑,换一种新产品就要重写一套。One-Class SVM 只需要用良品特征训练,判定“不像良品”即为缺陷,换产线只需重新采集良品特征。

具体案例:某电子元器件工厂用 ResNet50 抽取良品图像的 256 维特征,喂给 One-Class SVM(RBF 核,nu=0.03,gamma=0.01),测试集上漏检率从人工规则的 3.8% 压到 1.5%,误检率从 4.2% 降到 2.9%;单张图像推理约 1.2ms,满足流水线节拍要求。

金融反欺诈:持卡人的习惯边界

阶段:特征工程与实时风控

解决的问题:欺诈交易的占比往往不足 0.1%,且黑产不断更换手法,历史欺诈样本很快失效。One-Class SVM 用持卡人自己的历史正常交易建模——“正常习惯”数据充足且稳定,凡是偏离习惯的行为都值得送人工复核。

具体案例:某支付公司对每笔交易构造 40 维特征(金额分布、交易时间、地点、商户类型、频次),用该卡近 90 天正常交易训练 One-Class SVM,把分数最低的 3% 交易送入人工复核。上线三个月,人工复核命中率从 5.1% 提升到 11.8%,同时大幅减少了规则拦截造成的误伤。

Python 演示

python40 行
import numpy as npfrom sklearn.svm import OneClassSVMfrom sklearn.preprocessing import StandardScaler  def main():    rng = np.random.RandomState(42)     # 1. 训练集:只有大量正常样本    X_train = rng.randn(300, 2) * 0.8     # 2. 测试集:60 个正常样本 + 10 个异常样本    X_test = rng.randn(60, 2) * 0.8    X_test = np.vstack([X_test, rng.randn(10, 2) * 2 + 3])    y_true = np.array([1] * 60 + [-1] * 10)     # 3. 特征工程:标准化,统一特征尺度    scaler = StandardScaler()    X_train_scaled = scaler.fit_transform(X_train)    X_test_scaled = scaler.transform(X_test)     # 4. 训练 One-Class SVM:只有正常样本,RBF 核    ocsvm = OneClassSVM(kernel='rbf', gamma='scale', nu=0.02)    ocsvm.fit(X_train_scaled)     # 5. 预测:+1 正常,-1 异常;分数越高越正常    y_pred = ocsvm.predict(X_test_scaled)    scores = ocsvm.decision_function(X_test_scaled)     # 6. 评估:简单以准确率衡量,分数排序供人工复核    accuracy = (y_pred == y_true).mean()    print('测试准确率: {:.2f}'.format(accuracy))    print('最可疑的 5 个样本(分数最低):')    top = scores.argsort()[:5]    for i in top:        print('  样本{} 分数={:.3f} 预测={}'.format(i, scores[i], y_pred[i]))  if __name__ == '__main__':    main()
目的:演示只用正常样本训练 One-Class SVM,对混入异常点的测试集做边界判定,并用 decision_function 分数辅助优先排查。
  1. X_train = rng.randn(300, 2) * 0.8训练集完全由正常样本构成,这是 One-Class SVM 的前提设定。
  2. scaler = StandardScaler()先用正常样本的均值方差做标准化,避免特征尺度不均。
  3. ocsvm = OneClassSVM(kernel='rbf', gamma='scale', nu=0.02)创建模型:RBF 核 + 自动 gamma + 2% 容忍度。
  4. ocsvm.fit(X_train_scaled)模型只见过正常样本,开始学习“篱笆”的位置。
  5. y_pred = ocsvm.predict(X_test_scaled)新样本离边界太远时返回 -1(异常)。
  6. scores = ocsvm.decision_function(X_test_scaled)连续分数越高越“正常”,用于后续按阈值分级。
  7. top = scores.argsort()[:5]取分数最低的前 5 个样本,类比管家把最可疑的几株植物挑出来供老园丁复核。

常见误区

误区我训练的代码里只有正常数据,模型会不会学不会?异常检测不应该把异常样本也喂进去,让模型“认识”它们吗?

正解One-Class SVM 的卖点恰恰是“只需要正样本”。它学的是一个包围正常样本的边界,而不是“正常 vs 异常”的分类面。异常样本既不必要也不建议加入训练,加入反而会把边界拉偏。类比:管家不需要见过杂草,只需要知道篱笆内是花。

为何常见:大多数人先接触的都是有标注的二分类任务,习惯性地把异常检测也套进“两类都要有”的框架里。

误区nu=0.1 是不是说测试集里正好有 10% 是异常?那我根据已知比例设 nu 不就行了?

正解nu 只是异常比例的上界,同时也是支持向量比例的下界,不等于真实比例。设太大等于默认花园里怪胎很多,边界会缩得过狠,把正常样本误杀;设太小则篱笆太松。它是“容忍度旋钮”,不是数据统计量。正确做法是在验证集上用 F1 或召回率来选。

为何常见:sklearn 文档描述 nu 时提到 “fraction of outliers“,很多人只看到”异常比例”几个字就以为它是可以直接对照数据的比例。

误区调参时发现 gamma 拉到很大,训练集上几乎零误判,所以 gamma 越大越好?

正解gamma 大意味着每个支持向量的影响半径很小,边界会紧贴训练样本的每一个局部凸起,变成“记忆背板”。测试时正常样本只要稍有偏移就会被判异常,泛化能力崩坏。gamma 过大是典型的过拟合。类比:篱笆精细到绕每片叶子走,风一吹叶子就“出了篱笆”。选 gamma 必须结合验证集效果,不能只看训练集。

为何常见:初学者习惯用训练误差衡量模型好坏,而且 gamma 直观上确实像“严格度”,容易误解成越严越好。

误区模型返回 -1 或 +1,那 +1 是不是就代表 99% 是正常?我可以拿这个标签当置信度排序?

正解predict 返回的只是经过阈值化的标签,不携带置信水平。要做排序、设不同告警级别,应该用 decision_function 的连续分数,再自行映射。即使连续分数也不是严格概率。类比:管家只说“在篱笆内”或“在篱笆外”,要量化“多靠外”,得看它离篱笆有多远,而不是只看内外这个布尔值。

为何常见:predict 的输出是二值,看起来就像分类结论,但 sklearn 分类器输出概率用的是 predict_proba,而 One-Class SVM 并没有这个接口。

面试题

Q1. One-Class SVM 的训练集应该包含什么?

单选题 · easy

  • A.大量正常样本加少量异常样本
  • B.只需要大量正常样本即可← 正确答案
  • C.正常异常样本按一比一比例
  • D.需要全部异常样本去训练

答案:B。One-Class SVM 的卖点就是只用正常样本学边界。异常样本既不必要也不建议加入训练,加入反而会拉偏边界。类比:管家不需要见过杂草,只需知道篱笆内是花。

Q2. SVDD 的核心思想是什么?

单选题 · easy

  • A.找一条直线把正常和异常分开
  • B.找一个最小超球包住正常样本← 正确答案
  • C.计算每个样本到最近邻距离
  • D.训练一个神经网络来重构数据

答案:B。SVDD 在核函数映射后的高维空间里寻找最小包围超球,包住大多数正常样本。A 是线性分类,C 是最朴素的近邻法,D 是 AutoEncoder 的思路。

Q3. nu 参数在 One-Class SVM 中的作用是?

单选题 · mid

  • A.控制核函数的宽度和形状
  • B.控制模型训练的最大轮数
  • C.离群点上界和支持向量下界← 正确答案
  • D.控制特征缩放的比例大小

答案:C。nu 是训练集中离群点比例的上界,同时也是支持向量比例的下界。它不是真实异常比例,也不是核函数或训练轮数的参数。类比:nu 是管家对“几株植物待在篱笆外”的容忍度。

Q4. RBF 核中 gamma 参数在篱笆比喻中对应什么?

单选题 · mid

  • A.篱笆的总长度大小
  • B.篱笆的精细贴合程度← 正确答案
  • C.篱笆的外观颜色
  • D.花园的整体面积大小

答案:B。gamma 控制 RBF 核的距离衰减速度,gamma 越大边界越精细、越容易过拟合,越小越平滑。它决定篱笆是紧贴每片叶子还是大而化之。

Q5. One-Class SVM 的 predict 返回 -1 表示什么?

单选题 · mid

  • A.该样本被判为正常
  • B.该样本被判为异常← 正确答案
  • C.该样本无法下判断
  • D.模型的训练过程失败

答案:B。sklearn 的 OneClassSVM 约定 +1 表示正常、-1 表示异常。返回 -1 说明样本落在学到的边界之外,类比管家发现叶子探出了篱笆。

Q6. 相比 One-Class SVM,Isolation Forest 的主要优势是?

单选题 · hard

  • A.不需要任何训练数据
  • B.高维大数据扩展性好且快← 正确答案
  • C.能输出严格的概率分布
  • D.完全不会产生任何误报

答案:B。Isolation Forest 通过随机切分估计路径长度,计算量更轻、对高维大数据扩展性好。它也需要训练数据,不输出概率,也会误报。类比:切西瓜的管家下手快,但谈不上精细。

Q7. One-Class SVM 训练完成后,模型实际依赖什么做出决策?

单选题 · extreme

  • A.全部训练样本的均值向量
  • B.少量支持向量及其权重系数← 正确答案
  • C.随机抽取的十个代表样本
  • D.训练数据集的完整拷贝

答案:B。训练完成后只有支持向量对应的 α 非零,决策函数是这些支持向量与核函数的加权求和。类比:决定篱笆形状的不是整片花园,而是顶着篱笆的那几根柱桩。

Q8. 以下哪些场景适合使用 One-Class SVM?

多选题 · easy

  • A.工业质检只有合格品图像样本← 正确答案
  • B.欺诈样本极少且形态不断变化← 正确答案
  • C.有百万标注的猫狗分类数据
  • D.设备故障数据丰富且标记完整

答案:AB。A 和 B 都是“正常数据充足、异常稀缺且未知”的典型场景。C 是两类标注齐全的分类任务,D 的故障数据丰富且完整,完全可以用有监督分类,两者都不需要 One-Class SVM。

Q9. 对于 One-Class SVM 的特征工程,正确的做法有?

多选题 · mid

  • A.对特征做标准化统一尺度← 正确答案
  • B.删除方差接近零的无效特征← 正确答案
  • C.用 PCA 去除冗余的相关性← 正确答案
  • D.把所有特征值乘一个大常数

答案:ABC。标准化、去死特征、去冗余都是让“正常样本”在特征空间里更紧凑。D 把所有特征乘大常数并不会改变距离的相对关系,却会破坏标准化后的尺度,是错误的操作。

Q10. 关于 One-Class SVM 的模型评估,下列说法正确的有?

多选题 · hard

  • A.测试时混入少量已知异常样本← 正确答案
  • B.类别不均衡时 PR 优于 ROC← 正确答案
  • C.可用决策分数调节告警阈值← 正确答案
  • D.训练集百分百准确说明可靠

答案:ABC。训练时只用正常样本,测试时混入已知异常才能算出检出率;异常样本极稀缺时 PR 曲线比 ROC 更反映业务真实感受;decision_function 的连续分数可以按业务容忍度调节阈值。D 是过拟合幻觉,训练集满分恰恰说明篱笆可能紧贴到了每一片叶子。