学习目标
学习本课后,你将能够:
- 解释无监督学习与监督学习的区别。
- 区分特征矩阵 X 与未预先给定的目标变量 y。
- 解释聚类,并比较 K-means、层次聚类和 DBSCAN。
- 理解降维的用途以及 PCA 的作用。
- 描述异常检测任务及其结果的局限。
- 选择初步质量检查方法,并说明发现结构的边界。
1. 什么是无监督学习?
在上一课中,我们使用 (X, y) 样本对:对象的特征,以及模型需要学习预测的已知答案。这里的起点通常是特征矩阵 X,而没有需要复现的目标变量 y。
没有目标标签并不意味着算法没有目标。研究者需要提出问题:把相似的能耗曲线分组,将大量测量压缩成少数几个成分,或者找出与常见行为明显不同的观测。
不要将其与自监督学习(self-supervised learning)混淆。 在自监督学习中,训练信号由数据本身构造,例如模型学习恢复输入中被隐藏的部分,或预测序列的下一个片段。这种方法常用于大型模型的预训练。文献通常将其作为单独的学习范式,但不同研究对术语边界的使用并不完全一致。半监督学习(semi-supervised learning)则结合少量带标签数据和大量无标签数据。
例如,我们有数百栋建筑的运行记录:温度、湿度、能耗、时段和设备模式。算法可能发现重复的运行曲线,例如夜间运行、工作日或负荷峰值。只有在检查各组特征后,研究者才为其赋予有意义的名称。
2. 聚类:寻找相似观测
算法并不知道领域中的“相似”意味着什么。如果按年度能耗对建筑分组,可能得到一种结构;如果按每日负荷曲线分组,结果可能完全不同。结果取决于特征选择、特征尺度、距离度量和算法参数。
K-means:围绕中心形成群组
K-means要求预先指定群组数量 k。算法放置聚类中心,将每个观测分配给最近的中心,再把中心更新为所属观测的均值,并重复这些步骤,直到分配趋于稳定。它适合作为数值特征的基础方法,但更适合形状紧凑、尺度相近的群组。
k需要事先选择。不同的初始中心可能得到不同结果,因此实现通常会进行多次初始化。K-means 对特征尺度和离群值敏感:数值范围很大的特征可能主导距离计算。
层次聚类
层次聚类会构建合并或拆分对象的树状结构。在凝聚式方法中,最初每个对象各自成组,然后逐步合并距离较近的群组。可以在不同细节层次查看树状图,但距离度量和连接规则(linkage)会影响结果。
DBSCAN:基于密度的群组
DBSCAN寻找观测密度较高的区域,能够发现形状不规则的群组,并将孤立点标记为噪声。它不直接要求输入聚类数量,但对邻域半径和最小邻居数敏感;当不同群组的密度差异很大时,效果可能不理想。
3. 没有正确标签时,如何评估聚类?
无监督学习通常没有真实标签可供直接比较,因此评估比分类任务中的 accuracy 更复杂。
- 内部评估。 轮廓系数(silhouette coefficient)衡量组内紧密程度以及与邻近群组的分离程度。接近 1 通常表示分离更清晰,接近 0 表示群组重叠,负值可能提示分配不合理。但它衡量的是几何结构,而不是实际价值。
- 稳定性。 更换随机初始化、抽样数据或轻微调整参数后,结构是否仍然出现?
- 领域审查。 能否用原始特征描述群组?划分对研究问题是否有意义?它是否只是尺度差异或数据错误造成的假象?
- 外部评估。 独立标签可以在事后用于验证,但不能在训练时偷偷使用,然后仍称结果为完全无监督。
4. 降维与 PCA
如果每个对象有 80 个指标,人很难直接观察整体结构。降维方法会构建紧凑表示,用于可视化、减少噪声或后续分析。
PCA(主成分分析,Principal Component Analysis)会创建新的坐标轴,即主成分;每个主成分都是原始特征的线性组合。第一主成分沿着数据方差最大的方向,后续主成分在与前面正交的条件下尽可能解释剩余方差。PCA 并不是挑选最重要的原始特征,也不保证保留罕见但重要的事件。
t-SNE 和 UMAP 常用于将复杂表示可视化到二维空间。地图上的距离和群组大小可能受参数和随机性的影响。不能自动把分离的岛状区域解释为客观类别。
5. 异常检测
例如:建筑能耗曲线异常、设备温度与振动的罕见组合,或用户行为中不常见的操作序列。异常不一定是错误或故障,而是需要进一步检查的信号。
Isolation Forest 通过随机划分尝试隔离稀有观测;Local Outlier Factor 将某个点的局部密度与邻居密度进行比较。如果物理边界或运行要求已经明确,简单阈值规则也可能有用。
需要区分数据离群值与有意义的罕见事件。异常数值可能来自传感器故障、运行模式变化、真实故障,也可能是此前未见但有效的新状态。不要自动删除异常;首先调查其来源。
6. 连续案例:研究建筑运行模式
假设我们拥有建筑逐小时记录,包括室外温度、能耗、湿度、人员数量和时段。目标是理解重复出现的运行模式,而不是预测预先标注的类别。
- 提出问题。 找出典型的小时或日曲线。
- 选择观测单位。 例如一栋建筑的一天。没有明确的聚合规则时,不要混合小时记录与日记录。
- 选择特征。 平均负荷、峰值负荷、夜间能耗、温度变化范围和运行小时比例。每个指标都需要明确单位与计算周期。
- 准备特征。 检查缺失值、重复记录、时区和尺度。对于基于距离的方法,尺度尤其重要。
- 比较方法。 先以 K-means 作为基础方法,再检查层次聚类或 DBSCAN 是否改变结论。
- 验证结果。 检查群组画像、稳定性、内部指标和领域解释。
- 谨慎表述结论。 “在这个数据集中发现了三种重复曲线”比“建筑只有三种类型”更准确。
实践任务
为同一个任务提出两套不同特征:(a) 按能耗规模对建筑分组;(b) 按每日负荷曲线形状分组。对每套特征说明观测单位、尺度处理方法和一种误读风险。解释为什么建筑相同,结果仍可能不同。
优秀答案标准:说明聚类依赖研究问题和数据表示,而不是宣布某一种结果是唯一正确的。
7. 局限与检查清单
- 算法可能发现数学结构,但它在领域中没有实际意义。
- 特征选择、距离、尺度和参数都会改变群组。
- 在高维空间中,距离可能变得不够有信息量;压缩也可能丢失罕见结构。
- 聚类不一定是自然类别,异常也不一定是错误。
- 二维可视化不能证明原始特征空间中确实存在聚类。
- 如果后来获得可靠标签并转为预测任务,可以使用监督学习,但必须正确划分数据。
8. Python 实践:K-means
示例使用 scikit-learn 生成合成点。生成器也会返回教学标签,但我们将其丢弃:聚类算法只接收特征矩阵 X。
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 生成合成特征;丢弃生成器提供的参考标签。
X, _ = make_blobs(
n_samples=300,
centers=3,
cluster_std=1.2,
random_state=42
)
X_scaled = StandardScaler().fit_transform(X)
model = KMeans(n_clusters=3, n_init=10, random_state=42)
cluster_ids = model.fit_predict(X_scaled)
# 评估几何分离程度,而非语义正确性。
score = silhouette_score(X_scaled, cluster_ids)
print("Silhouette score:", round(score, 3))
print("Cluster IDs:", sorted(set(cluster_ids)))代码说明: make_blobs 生成点;StandardScaler 将特征调整到可比较尺度;KMeans 寻找三个群组;silhouette_score 衡量几何分离程度。簇编号只是技术标识:簇 0 并不比簇 1 更好或更重要。
运行环境: Python 3.9+ 和当前版本的 scikit-learn。使用 python -m pip install scikit-learn 安装。在真实项目中,只能在当前分析阶段允许使用的数据上拟合转换器。