本节摘要:监督学习方法把时间序列异常检测转化为二分类问题:用带标签的数据(正常/异常)训练分类器,再用分类器预测新点。本节讲清监督学习的核心思想与适用场景,详解 SVM、决策树、随机森林三个代表算法的检测逻辑,给出基于 scikit-learn 的随机森林训练评估示例,并老实交代监督学习在异常检测里的三大缺陷:标签难拿、过拟合、未知异常泛化差。
阅读完本节,你应当能够:
某支付公司的反欺诈团队,过去三年积累了 2000 万条标注好的交易数据:哪些是正常交易,哪些是确认的欺诈。数据科学家把每笔交易转成特征向量(金额、频率、设备指纹、时间特征、行为序列),然后训练模型。
这时候,异常检测本质上已经变成了一个"二分类问题"——模型要学的是:"什么样的特征组合意味着欺诈?" 训练数据里有明确的答案(标签),模型要做的只是学出一条能把正常和异常分开的边界。
这就是监督学习的全部逻辑:把检测问题降级为分类问题。 它不再问"这个点偏离多少",而是问"这个点落在边界的哪一边"。边界是模型从海量标签里学出来的,可以是非常复杂的非线性形状。
但监督学习有个绕不开的前提:你得先有足够多、足够准的标签。 而异常检测里最稀缺的恰恰就是异常标签(第 7 章会细讲为什么)。所以监督学习在异常检测里的地位很微妙:一旦标签条件满足,它是精度上限最高的路线;标签条件不满足,它连门都进不去。 这一节的目标,就是让你在决定"要不要走监督路线"时,心里有杆秤。
不是所有检测场景都适合监督学习,四个前提缺一不可:
现实中 90% 的场景不满足前两条——这正是监督学习"听起来很美、用起来很难"的原因。
SVM(支持向量机):在特征空间找一个最优超平面,把正常与异常分开。线性可分就用硬间隔,非线性用核技巧(RBF 核)把数据映射到高维空间找超平面。优势:对高维数据有效、能处理非线性;代价:训练时间长、参数(核、正则)敏感。
决策树:学一串 if-else 规则划分数据——"特征 A 大于 3 且特征 B 小于 5 → 异常"。天然可解释,规则能直接翻译给业务听。但单棵树容易过拟合、对噪声敏感。
随机森林:多棵决策树的集成。每棵树用 bootstrap 抽样 + 随机特征子集训练,最终投票/平均。靠"多棵树互相纠正"降方差、抗过拟合,是监督检测里精度和鲁棒性的平衡点。
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import precision_score, recall_score, f1_score import numpy as np # X: 特征矩阵, y: 标签(0正常, 1异常) —— 由业务标注获得 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X_train, y_train) y_pred = rf.predict(X_test) print("Precision:", precision_score(y_test, y_pred)) print("Recall:", recall_score(y_test, y_pred)) print("F1:", f1_score(y_test, y_pred))
注意几个工程细节:一是数据极度不平衡时(异常只有 1%),直接训练会导致模型"学成只会判正常"——要用类别权重、过采样或欠采样处理;二是评估要看异常那一类的 Precision/Recall/F1,而不是整体准确率(第 7 章会系统讲);三是特征工程(第 2.4 节)决定上限,同样的随机森林,喂什么特征差距巨大。
标签难拿:异常标签需要业务专家逐条确认,成本极高(第 7.2 节详述)。这是监督学习在检测领域最大的拦路虎。
过拟合风险:异常样本少而特征多时,模型容易"背下"训练集里的异常,对新异常泛化差。对策:正则化、减少特征、交叉验证。
未知异常失灵:这是结构性的。训练集里没有的异常类型(比如全新的攻击手法、从未见过的故障模式),模型没有概念,必然漏报。监督学习天生"只见训练集里的世界"。
| 维度 | 监督 | 无监督/半监督 |
|---|---|---|
| 标签需求 | 大量完整标签 | 无/只有正常 |
| 精度上限 | 高 | 中 |
| 未知异常 | 抓不住 | 可能发现 |
| 落地门槛 | 标签成本高 | 参数调优成本高 |
| 典型场景 | 欺诈检测、已知故障 | 通用监控、探索性分析 |
结论:标签条件满足且异常类型稳定 → 监督学习值得上;否则先无监督/半监督跑量,再逐步沉淀标签演进到监督。
异常检测的标签天然不平衡(正常 99%、异常 1%)。三个常用手段:过采样(对异常样本做 SMOTE 合成)、欠采样(随机抽正常样本配平)、类别权重(把异常类的损失权重放大)。经验:先从类别权重入手,改动最小、风险最低;数据量允许再考虑 SMOTE。
监督模型的迭代不该靠"堆更多特征",而该靠"复盘漏报"。把每次漏报的案例收集起来:它长什么样?现有特征哪个维度没描述到它?加特征要服务于"补漏报盲区",而不是"让训练集分数更好看"。 这一条适用于所有检测路线。
⚠️ 常见坑:用整体准确率评估不平衡检测模型。 99% 正常、1% 异常的测试集,模型全判正常准确率也有 99%——这个 99% 毫无意义。必须看异常类的召回、精确、F1,或者干脆画 PR 曲线(第 7 章)。
💡 关键直觉:监督学习学的是"训练集定义的正常与异常"。 它的强项是把"已经见过的异常"分得又准又稳,弱项是"没见过的新异常"。所以监督模型的适用边界,本质上由"你的异常目录有多完整"决定。
时序数据给监督学习加了两层难度:一是特征必须包含时间结构(滞后特征、窗口统计、周期相对量,见第 2.4 节)——丢给模型原始点值序列,它学不到"周期"这个概念;二是训练/测试切分不能随机(会数据泄漏),要用时间顺序切分,拿"过去训练、未来测试"。这两点做不到,监督模型在时序上的效果会大打折扣。
把前面的要点串成一份可执行的工作流:
这套工作流的关键纪律:每一步都有"防泄漏"意识——特征不偷看未来、切分不随机、评估不只看整体准确率。监督学习在时序检测里 80% 的翻车都出在数据泄漏上,而不是模型选得不够好。
| 算法 | 适合场景 | 主要优势 | 主要代价 |
|---|---|---|---|
| 决策树 | 要可解释规则 | 规则直接可读 | 单树易过拟合 |
| 随机森林 | 默认首选 | 精度/鲁棒平衡、特征重要性 | 可解释性不如单树 |
| SVM | 高维非线性、小样本 | 核技巧强、泛化稳 | 训练慢、参数敏感 |
现场决策一句话:要解释用决策树,要性能用随机森林,样本小且非线性用 SVM(配 RBF 核)。 多数场景随机森林是安全默认项。
可以,但合成要谨慎——SMOTE 等过采样方法生成的是"特征空间里的插值",可能脱离真实异常的物理形态。更好的做法是"异常注入"(第 7.2 节):根据故障机理合成贴近真实分布的异常,而不是凭空插值。
这是监督学习最大的现实风险——训练集里没有的新异常,模型没概念。对策:建立"未知异常识别"机制——当模型对所有样本都给低置信度时触发人工审查;同时持续用新确认的异常样本重训模型。
够。随机森林的"随机特征子集"机制天然抗高维,几百维也能跑。但特征越多越难解释、越易过拟合,建议先做特征选择(第 2.4 节)压到几十维。
能。特征工程(第 2.4 节)对两条路线同样适用——特征是模型的上限,标签决定走哪条训练路线。先花功夫把特征做扎实,再根据标签情况选择监督/半监督,是更聪明的顺序。 现实中很多团队先按半监督把特征迭代成熟,等标签攒够后直接切换监督训练,特征几乎不用改,迁移成本很低。
下一节转向"没标签也能干"的无监督路线——K-Means 的簇心距离、PCA 的重构误差、DBSCAN 的噪声点,三种判据教你从数据内在结构里找异常。