P4-2.2 无监督学习¶
Section ID:
P4-2.2Version:v2026.07.20
在 P4-2.1 里,我们看的是用带 label 的案例训练 model 的监督学习。这一次要看的是:在没有 label 的数据里寻找结构的无监督学习。
无监督学习并不是 没有答案就随便学。它更准确地说,是在没有人工预先贴好 label 的情况下,去寻找数据中的相似性、分组、坐标轴、密度或异常点的方法。这里 model 常常不是在匹配某个答案,而是在做出结构候选,好让人更好地理解数据,或为下一步工作做准备。
这一节会说明 unsupervised learning、在没有标签时阅读结构、clustering 和 dimensionality reduction 之间的大体区分。后面的章节会带着这个抓手继续判断当前语境,而 结构探索到底是什么意思 这个基础含义,会通过本节和 概念词汇表 再次接回。
本节范围¶
这一节先把 无监督学习在没有标签的数据中读取结构时处理的是哪些问题 关上。k-means 和 DBSCAN 会在 P4-17 聚类部分继续处理,PCA 和 t-SNE 会在 P4-18 降维部分继续处理。
- 没有 label,到底是什么意思?
- 无监督学习在学什么?
- clustering、dimensionality reduction、outlier detection 分别是什么问题?
- 为什么无监督学习的结果必须谨慎解释?
- 在真实工作里,监督学习和无监督学习会怎样接起来?
用无监督学习留下的判断标准¶
- 能把无监督学习说明成
在没有标签的数据里寻找结构的方法。 - 能用例子区分 clustering、dimensionality reduction、outlier detection。
- 能说明
相似数据会被分到一起并不自动等于有了有意义的正确答案。 - 能理解无监督学习的结果仍然需要人去解释和复核。
- 能说明无监督学习可以作为后续监督学习或数据分析的准备阶段。
先用一个场景来理解¶
想一想网店里的客户数据。假设现在有下面这些信息,但还没有像 优质客户、流失风险、普通客户 这样的标签。
| 客户 | 最近 30 天访问次数 | 购买次数 | 平均购买金额 | 优惠券使用 |
|---|---|---|---|---|
| 客户 A | 20 | 8 | 高 | 经常使用 |
| 客户 B | 3 | 0 | 低 | 几乎不用 |
| 客户 C | 18 | 7 | 高 | 经常使用 |
| 客户 D | 5 | 1 | 中 | 偶尔使用 |
如果是监督学习,每个客户可能已经有 优质客户、流失风险、普通客户 之类的 label。但在无监督学习里,开始时没有这些 label。于是问题就变成:相似客户会不会自然分到一起、哪些轴能把它们区分开、以及有没有特别不一样的客户。
这里最重要的一点是,model 并不会自动理解 客户类型 的意义。它可以找出相似模式,但这个分组究竟代表 高价值客户、优惠券敏感客户,还是 临时参加活动的人,仍然需要人结合数据和业务语境来解释。
即便是同一张客户表,在无监督学习里,它也不是 拿来匹配答案标签的表,而是 拿来阅读结构候选的表。下面这张图展示的,就是同一份输入表,怎样分出 cluster candidates、reduced view 和 outlier candidate。
flowchart TD
A["客户表<br/>访问 / 购买 / 金额 / 优惠券使用"]
B["聚类候选<br/>活跃 / 浏览中 / 沉睡"]
C["降维视图<br/>二维行为地图"]
D["异常点候选<br/>不寻常的购买模式"]
E["人工解释<br/>命名并检查"]
F["下一步任务<br/>分析或监督学习"]
A --> B
A --> C
A --> D
B --> E
C --> E
D --> E
E --> F
和监督学习比较来看¶
监督学习和无监督学习,从数据的形状开始就不一样。
| 区分 | 监督学习 | 无监督学习 |
|---|---|---|
| 数据 | 输入 X 和 label y 同时存在 | 只有输入 X,没有显式的 y |
| 问题 | 这个输入的正确输出是什么? | 这些数据里面有什么结构? |
| 代表问题 | classification、regression | clustering、dimensionality reduction、outlier detection |
| 结果解释 | 更容易用真实 label 直接比较性能 | 结果的意义需要人来解释和验证 |
| 例子 | 预测一封邮件是垃圾还是正常 | 先把相似邮件类型分组 |
因为没有 label,所以在无监督学习里,很难像监督学习那样简单地说 答对了多少百分比。相反,更需要问的是:这个分组对业务有没有意义、可视化是否真的帮助理解、异常候选是否值得实际检查。
按流程来看¶
无监督学习的基本流程可以读成下面这样。
flowchart TB
A["1. 无标签数据<br/>只有 X"]
B["2. 表示方式<br/>选择特征"]
C["3. 结构候选<br/>簇 / 坐标轴 / 密度"]
D["4. 检查<br/>可视化并比较"]
E["5. 解释<br/>命名或使用该模式"]
F["6. 下一步任务<br/>分析或监督学习"]
A --> B
B --> C
C --> D
D --> E
E --> F
这张图里的关键,是 human interpretation。无监督学习得到的是数据中的结构候选。model 做出的分组或轴,仍然需要由人来命名、解释,并确认它是否在实际工作里可用。
在无监督学习里最常见的三类问题¶
无监督学习有很多用法,但最重要的是先区分下面这三类问题。
| 问题 | 要问什么 | 简单例子 |
|---|---|---|
| clustering | 相似案例会不会分到一起? | 把购买模式相近的客户分组 |
| dimensionality reduction | 很多 feature 能不能压缩成更少的轴? | 把 100 个 feature 降成 2 维图 |
| outlier detection | 有没有特别不一样的案例? | 找出不寻常的支付模式作为复核候选 |
scikit-learn 的无监督学习文档也会处理 clustering、manifold learning、matrix factorization、outlier detection、density estimation 等多种类别。本节会以 clustering、dimensionality reduction、outlier detection 为中心来讲。
clustering:把相似的东西放到一起¶
clustering 是把没有标签的数据,按相似性分成若干组的方法。
如果按访问次数和购买次数来看客户数据,可能会出现下面这样的分组。
| 候选分组 | 数据里看见的模式 | 人可能贴上的解释 |
|---|---|---|
| 组 A | 访问多、购买也多 | 活跃客户 |
| 组 B | 访问多但购买少 | 浏览型客户或比价客户 |
| 组 C | 访问少、购买也少 | 休眠客户候选 |
但这些名字并不是 model 告诉你的,而是人看着数据后贴上的解释。clustering 的结果更像是 看起来这里有这样的分组 的出发点,而不是立刻断定 这个客户一定就是这种人。
Google 对 clustering 的说明,也把它解释成 按 similarity 把没有标签的例子分成组。真正用起来时,还必须明确到底采用了什么相似标准,而且 feature 一多,比较方式也会变得更复杂。
这里尤其要小心,不要把 cluster ID 出来了 误读成 已经有了正确答案标签。
| 看到的东西 | 它真正表示什么 | 它还不是什么 |
|---|---|---|
| Cluster 0、1、2 | model 暂时把相似案例分到一起的结果 | 现实里已经确认好的客户类型标签 |
| 2 维图里彼此很近的点 | 在某个表示空间里看起来接近 | 并不自动表示相同原因或同一业务群体 |
| outlier candidate | 它和大多数案例看起来不太一样 | 还不是已确认的错误或风险判断 |
也就是说,无监督学习的输出更接近 结构候选,而不是 答案。先把这一点接受下来,后面在看聚类或降维结果时,就不容易夸大它。
dimensionality reduction:把很多东西压缩到更少的轴上¶
dimensionality reduction 是把很多 feature 压缩成更少几个轴的方法。
例如,如果一个客户要由 50 个 feature 来描述,人就很难一眼看出来。降维可以把这些信息压成 2 个或 3 个轴,帮助可视化,也让主要变化方向更容易看见。
降维本身可能会丢掉一部分信息。所以,不能只因为两个点在 2 维图里看起来很近,就断定它们在原始数据里一定代表同样的意思。还必须确认哪些信息被保留了,哪些信息被压缩掉了。
outlier detection:把不同之处读成复核候选¶
outlier detection 是用来寻找那些看起来和大多数案例不一样的数据。
例如,在支付服务里,如果某次支付出现在异常时间、金额异常、地区也异常,那它就可能成为一个 outlier candidate。但 outlier 不等于欺诈,也可能是旅行中的正常消费,或者一次合法的大额购买。
因此,无监督学习的结果更适合先读成 复核候选。先去看 model 为什么把它标成异常,再把这个信号和真正的业务标准结合起来做判断。
解释结果时要小心的点¶
因为没有 label,所以在无监督学习里,结果解释会特别重要。
- model 做出来的分组,不会自动变成有意义的现实群体。
- 看起来接近的点,不一定就是因为同一个原因而接近。
- 降维图不一定保留了原始数据的全部信息。
- outlier candidate 不一定就是真正的错误、风险或欺诈。
- 一旦开始给结果命名,就已经进入了人的解释。
所以,无监督学习更应该读成 我们找到了理解数据的结构候选,而不是 我们已经找到了正确答案。
它可以怎样接到监督学习上¶
无监督学习并不是和监督学习完全分开的世界。在真实工作里,它们经常可以连起来。
例如,先把客户做 clustering,再分析每个 cluster 的行为,从而制定不同的营销策略;或者把 cluster ID 当成新的 feature,再送进监督学习 model;也可以先用降维做可视化,再检查是不是存在 label 错误。
即使这样,注意点也不变。无监督学习的结果可以成为下一步工作的材料,但它本身并不保证就是现实里的正确答案。
解释无监督学习结果时,可以按下面这个顺序。
- 先看数据里出现了哪些分组或哪些轴。
- 再看人能不能给这些分组贴上怎样的解释。
- 最后才决定这些结果是否要用于下一步分析或监督学习准备。
经过这个顺序,就能减少把无监督学习结果过早固定成 答案 的错误。
实际工作里,也常常要先判断:现在这个问题到底该不该按无监督学习来读。
| 当前状态 | 要不要按无监督学习来读 | 原因 |
|---|---|---|
| 没有 label,想先看分组、坐标轴或异常点 | 要 | 因为当前目标是理解结构,而不是预测答案 |
| 没有 label,但需要给下一步分析准备结构候选 | 要 | 因为 cluster、轴、outlier candidate 可以成为后续材料 |
| 已经有稳定 label,而且目标是给新案例匹配输出 | 通常不要 | 因为比起结构探索,更直接的是监督学习问题 |
案例与示例¶
案例 1. 当客户类型名称还没有,但想先看相似模式会不会自己显现出来时¶
假设某个网店已经收集了很多客户行为数据,但像 忠诚客户、流失风险客户、价格敏感客户 这样的类型 label 还没有。即便如此,人还是会很自然地想:能不能先看看数据里有没有一些分组自己显现出来?
在这个场景里,问题不是像监督学习那样去匹配正确 label,而是先只看访问次数、购买金额、优惠券使用等值,检查相似客户会不会聚成几组,或者有没有特别突出的客户。
所以,无监督学习会被解释成 在没有标签的数据里寻找结构候选的方法。model 不会直接告诉你 这一组就是 VIP,它只是先把一些值得人去解释的模式暴露出来。
可检查的结果,可以看它有没有真正形成下一步检查问题。比如,如果相似购买模式的客户确实分出了几个组,而且人能够解释它们之间的差别,那么无监督学习的结果就成了下一步分析的出发点。
flowchart TD
A["客户行为表"]
B["还没有标签"]
C["寻找相似模式"]
D["出现分组候选"]
E["出现异常点或降维视图线索"]
F["人工解释稍后再做"]
G["把结果用于下一步分析问题"]
A --> B --> C
C --> D
C --> E
D --> F
E --> F
F --> G
Checklist¶
- 能不能说明什么时候无监督学习的目标不是
把答案猜对,而是做出结构候选? - 能不能说明为什么 cluster ID、2 维图中的接近、outlier candidate 都不能立刻当成答案标签?
- 能不能说明无监督学习结果怎样接到下一步分析或监督学习准备上?
- 能不能说明无监督学习是在没有标签的数据里寻找结构候选的方法?
- 能不能区分 clustering、dimensionality reduction、outlier detection 分别在显露什么结构候选?
- 能不能说明无监督学习结果仍然需要人来解释,而且很难像监督学习那样直接和正确答案比较评估?
来源与参考资料¶
- scikit-learn developers,
Unsupervised learning, scikit-learn User Guide, 确认日期:2026-06-25. https://scikit-learn.org/stable/unsupervised_learning.html - Google for Developers,
What is clustering?, Machine Learning, 确认日期:2026-06-25. https://developers.google.com/machine-learning/clustering/overview