2. 机器学习基础回顾:监督学习、无监督学习、半监督学习
好,咱们正式进入技术部分之前,我先带大家快速回顾一下机器学习的三个基本范式。为什么非要翻旧账?因为我发现不少同学在实际项目里,连“该用哪种学习方式”都没想清楚就开始调参——嗯,最后模型跑不起来,回头一看,数据标签都没标对。我以前在做一个内网异常流量检测的项目时,就踩过这个坑,后来花了两周补标签,才把模型救回来。所以,先把基础打牢,后面才不会走弯路。
简单来说,这三种学习方式的核心差别就一句话:数据有没有标签?有多少标签? 下面我逐一展开讲,每个我都会结合咱们这门课的主题——异常访问识别——来举例,确保你能直接套用。
2.1 监督学习:有老师带着学
监督学习,说白了就是“喂”给模型一堆已经标好答案的数据。比如你有一万条用户访问日志,每条日志都已经人工标注了“正常”或“异常”。模型的任务就是从这些“正确答案”里学会规律,以后看到新日志就能自己判断。
我习惯把它理解成请了一个家教。老师(标签)反复告诉你:这个特征是异常的,那个特征是正常的。模型慢慢就记住了。在异常访问场景中,最常见的监督算法有:
- 逻辑回归 – 快、可解释性强,适合快速筛选。
- 决策树 / 随机森林 – 能处理非线性关系,不容易过拟合。
- 支持向量机 (SVM) – 在小样本高维数据上表现不错。
- XGBoost / LightGBM – 工业界异常检测比赛的常胜将军。
但问题来了——现实中异常行为本来就少,一个系统可能一年只有几十条真正的高危告警。你要是硬上监督学习,模型会因为正负样本极度不平衡而“学废”。这时候就需要考虑无监督或半监督方案了。
2.2 无监督学习:没人管,自己找规律
无监督学习是模型完全没有标签,全靠数据自身的分布或结构来“聚类”或“降维”。你想想看:如果你把一万条日志扔给 K-Means 算法,它不会告诉你哪条是异常,但会把相似的日志归到一起。那些离所有簇都很远的点,往往就是异常点。
在异常访问识别中,无监督学习特别适合以下场景:
- 你还没有人工标注过任何数据。
- 异常模式不断变化,偷懒不想每次重新标。
- 想先用无监督方法快速发现可疑样本,再集中人力分析——我管这叫“半自动化狩猎”。
常用的无监督方法包括:
- K-Means / DBSCAN – 基于距离的聚类,DBSCAN 能自动识别噪声点。
- 孤立森林 (Isolation Forest) – 专为异常检测设计,用随机分割快速隔离异常点。
- 自编码器 (Autoencoder) – 深度学习中还原误差大的样本视为异常。
- PCA / t-SNE – 降维后直观观察离群点。
2.3 半监督学习:少量标签 + 大量无标签
半监督学习是前两者的折中。你手里只有少量标签(比如几十条),但海量的未标注数据。模型如何利用那几十条“种子”去学会识别所有正常和异常?常见做法有两种:
- 自训练 (Self-training) – 先用有标签数据训练一个初版模型,让它对无标签数据做出预测,选出高置信度的预测结果作为“伪标签”,再重新训练。
- 协同训练 (Co-training) – 用两个不同视角的特征训练两个模型,互相为对方提供新标签。
我觉得这在现实中最实用。你想想看,一个安全团队能标多少条日志?一天能标几百条就不错了,但系统每天可能产生上千万条。半监督学习恰好完美平衡了人工成本和模型效果。
| 对比维度 | 监督学习 | 无监督学习 | 半监督学习 |
|---|---|---|---|
| 是否需要标签 | 必须全部有标签 | 完全不需要 | 少量标签 + 大量无标签 |
| 典型任务 | 分类、回归 | 聚类、异常检测、降维 | 分类(利用无标签数据提升精度) |
| 异常识别适用场景 | 已知攻击类型,标签充足 | 未知攻击 / 零日漏洞 | 少量已知攻击 + 海量日常流量 |
| 模型复杂度 | 中等,依赖特征工程 | 较低,但易受噪声影响 | 较高,需要训练策略 |
| 评估方式 | 准确率、精确率、召回率、F1 | 轮廓系数、Davies–Bouldin 指数 | 在有标签验证集上评估 + 人工审查 |
为什么会这样?因为半监督学习的关键假设是:相似的样本应该属于同一类。只要少量种子能代表整体分布,就能把大部分无标签数据正确分类。我参与过的一个 Web 防火墙项目,当时只标了 500 条攻击日志,剩下 50 万条未标,用半监督 self-training 硬是做到了 98% 的召回率——当然,误报也多了点,后面再用规则过滤。
上图清晰的展示了三种学习方式在异常访问识别中的数据流向。记住:没有最好的范式,只有最适合当前数据条件的范式。在接下来的章节里,我会带你用真实日志数据分别走完监督、无监督和半监督的完整建模流程。你会发现,很多看似复杂的问题,只要选对了学习范式,代码量其实非常少。