不做标准化时聚类结果不可信,因量纲差异导致欧氏距离被大数值特征主导,如年收入掩盖年龄影响,使轮廓系数异常低。

不做标准化,聚类结果基本不可信——尤其是用 KMeans、AgglomerativeClustering 这类依赖欧氏距离的算法时,量纲大的特征会直接“压倒”其他特征,导致聚类只反映数值尺度,而非真实结构。
距离计算被量纲主导是根本问题
比如一个数据集含「年龄(18–80)」和「年收入(5000–200000)」,未经标准化时,收入差值动辄上万,而年龄差最多60;欧氏距离里收入项贡献占比常超95%,年龄几乎不参与决策。这不是模型“学得不好”,而是输入本身让距离失真。
常见错误现象包括:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 轮廓系数
silhouette_score异常低( - 聚类中心在可视化(如PCA降维后散点图)中呈明显线性拉伸,而非紧凑分组
- 改变某个高量纲特征的单位(如万元→元),聚类结果完全变化
StandardScaler 是最常用但不是万能的
StandardScaler 做的是 Z-score 标准化:(x − μ) / σ。它假设数据近似正态分布,对异常值敏感。实际中容易踩的坑有:
- 在训练集+验证集+测试集上一起
fit_transform→ 造成数据泄露,必须只在训练集上调用fit,再用transform处理其余数据 - 对含大量离群点的特征(如用户点击次数)仍用
StandardScaler→ 均值和标准差被扭曲,建议换RobustScaler - 把类别型变量(如
gender编码后的 0/1)也丢进StandardScaler→ 没必要,还可能干扰解释性
哪些情况可以跳过标准化?
不是所有聚类都强制要标准化:
- 用
DBSCAN且已人工设好eps(比如地理坐标用经纬度+米级阈值),此时你明确知道距离单位含义,标准化反而破坏物理意义 - 所有特征本就是同一量纲、同数量级(例如 PCA 后的前5个主成分),此时均值方差已统一
- 使用余弦相似度代替欧氏距离(如
sklearn.metrics.pairwise.cosine_similarity),它本身与向量长度无关
最容易被忽略的一点:标准化必须在降维(如 PCA)之前做。如果先 PCA 再标准化,等于对主成分再次缩放,破坏了方差解释比例——而 PCA 的核心前提正是各原始特征已中心化(即减去均值),这一步 StandardScaler 已隐式完成。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










