资讯动态

聚类分析实战指南:从特征处理到算法选型与结果评估

发布时间:2026/10/16 14:20:11 来源:尧图企业网站定制
聚类分析在数据工作里看起来是最容易上手的方法之一一组无标签数据丢进去调个参数跑出几簇然后给每簇起个名字好像就完成任务了。但做多了你就会发现聚类是最容易被低估的方法之一同一个数据集换个算法、调个参数、甚至改一下归一化方式结果都可能完全不同。这篇文章我想结合自己这些年踩过的坑系统聊一聊聚类分析方法的选型逻辑、参数调优思路和结果评估方法给正准备用聚类解决实际问题的人一些可以直接上手的经验。适合读者刚接触无监督学习的数据分析师、准备用聚类做用户分群的运营/产品同学、以及做算法落地但被结果不可解释困扰的工程师。我不会把每个算法的公式抄一遍而是重点关注什么时候用哪个参数怎么定结果怎么判断好坏。1. 聚类不是跑个模型就完事特征处理才是第一道分水岭很多聚类项目翻车不是算法选错了而是数据在进模型之前就已经出了问题。聚类和分类有个本质区别分类有标签可以纠正特征分布的影响聚类完全没有监督信号特征怎么进聚类结构就怎么出。所以特征工程的每一步都直接决定了最终分群是否可解释、是否稳定。1.1 尺度差异会把欧氏距离变成某个特征的一言堂绝大多数聚类算法K-Means、层次聚类、DBSCAN 默认距离都依赖欧氏距离或相似度度量。欧氏距离对特征尺度非常敏感一个量纲大的特征会直接主导整个距离计算。举个例子你做用户分群特征是年龄20-60和年消费金额0-500000。如果不做标准化两个用户在年龄上相差30岁距离贡献是30消费上相差300元距离贡献就是300。最终聚类结果几乎只看消费金额年龄特征约等于被丢弃了。这不是算法的问题而是度量被尺度假象绑架了。我常用的处理方式就三步先处理缺失值和异常值聚类对异常值比分类更敏感后面会细说。数值特征做标准化。优先用 Z-score 标准化StandardScaler如果你想保留稀疏性用 MaxAbsScaler 或 RobustScaler 也行后者对离群点更稳健。离散特征要么做 one-hot 编码要么做目标编码。但注意 one-hot 会把特征维度撑大高维下聚类效果会衰减这涉及维度灾难后面我会展开。有人会问能不能不标准化直接用 MinMaxScaler可以但 MinMaxScaler 受极值影响很大——一个用户消费异常高会把其他所有用户的消费值压缩到很窄的区间。相对而言 Z-score 是更稳妥的起点。1.2 高相关特征等于在给重点特征重复投票聚类里还没有人告诉你你给两个高度相关的特征做了标准化距离计算中这个信息维度就被算了两遍。比如做商品分群特征里同时放了销售额和销售量如果这两个特征相关性高达 0.9那么这条信息在欧氏距离中的权重就比别的特征多一倍。处理方式一般是先看相关性矩阵把相关性高的特征合并或剔除。更系统的做法是先用 PCA 降维再用降维后的主成分做聚类。PCA 不只是为了降维它能让每个维度正交消除重复信息还能滤掉一部分噪声。我在实际项目里发现标准化 PCA 的组合在很多数据集上能明显改善聚类的稳定性和可解释性。当然也有例外如果特征本来就少且有业务含义直接保原始特征做聚类结果的可解释性可能反而更差——注意这里是可解释性更差因为主成分是特征的线性组合如果你需要跟老板解释每个簇的业务含义主成分需要额外做因子解读。所以我的建议是业务解释要求高的项目优先保留原始特征并做好标准化纯探索性分析可以大胆用 PCA。提示聚类对特征敏感的顺序是异常值 尺度 相关性 缺失值。处理特征的优先级和这个顺序一致。2. 主流聚类算法的性格各不相同选型之前先看清它们的前提假设聚类算法没有绝对的最好只有在某个数据形态下最合适。我经常跟人打比方K-Means 像个直性子的人速度快但是脑袋里只装得下圆形的簇DBSCAN 像个能屈能伸的探索者可以处理各种形状但你对它的参数要有耐心层次聚类像一位做族谱的学者给你完整层次但算得慢。2.1 K-Means 及其变体快、简单但别让它处理一切K-Means 的原理是迭代分配中心点让每个点到所属中心的距离平方和最小。它有两个很硬的前提假设簇形状接近球形严格来说凸形、各簇规模差异不大。经典 K-Means 对初始中心选择敏感实际使用中我很少直接跑一次默认参数而是设置n_init至少 10 次每次用不同的随机初始化取最好的一次用k-means做初始化策略能明显减少初始中心扎堆的问题如果样本量超过 10 万优先用 Mini-Batch K-Means它每轮只用一个小批量数据计算速度快一个量级结果跟全量 K-Means 接近。K-Means 的最大问题是它假设每个点只能属于一个簇而且簇一定是实心的。数据里有形状不规则、有狭长带状的簇K-Means 就会强行把那个带子切成两半。2.2 DBSCAN擅长发现任意形状但密度定义不好选DBSCAN 的核心思想是物以类聚人以密度分。它基于两个参数邻域半径 Eps 和最小邻居数 MinPts。原理是找密度相连的点组成簇把稀疏区域里的点标记为噪声。它的优势非常明显不需要预先指定簇数量 K可以发现任意形状的簇还能天然识别离群点。项目里做地理空间聚类或者对形状没有先验知识的数据做探索DBSCAN 往往比 K-Means 靠谱得多。它的难处在于 Eps 怎么选。选小了一个簇会碎成很多小块选大了不同簇会粘连在一起。一个相对可用的办法是计算每个点 k 近邻距离画出排序图找一个距离跳变的拐点作为 Eps。这里 MinPts 通常取 2 倍的维度数即可。2.3 层次聚类可视化最友好但样本量是硬约束层次聚类有凝聚式自底向上和分裂式自顶向下两种我不会把两类算法都记住但你必须记住凝聚式最常用。它每一步把最近的两个簇合并最终生成一棵树状图。它的优点是你不需要预先指定 K可以看树状图再决定从哪一层切分切分方式不同得到的聚类结果可以直接对照非常适合做探索性分析。缺点是算法复杂度高样本量到了 5 万以上就会明显变慢而且一旦某一步合并错了后面没法回退贪心策略的常见问题。如果你做的是小样本用户深度分析比如几百个核心用户分群层次聚类非常合适百万级数据就别想了老老实实用 Mini-Batch K-Means。2.4 GMM高斯混合模型和谱聚类升级版但要小心里面的参数GMM 假设数据由若干个高斯分布混合而成它给每个点输出属于每个簇的概率而不是硬分类。这有个很实际的好处边界上的点不再是强行归到某一类而是带着概率你可以据此筛选高置信度的样本。GMM 对簇的形状假设比 K-Means 宽松通过协方差类型球形、对角、完全控制。谱聚类则是一个图论方法先建相似度图再对图的拉普拉斯矩阵做特征分解来做降维聚类。它对非凸簇、互相缠绕的数据表现很好但有两个痛点计算复杂度高K 值一样要预先指定。我记得有次做文本主题聚类K-Means 怎么跑都分不开两组重叠很强的簇换成谱聚类就分离了。但谱聚类对相似度矩阵的构造很敏感不是默认参数就能用好的。2.5 算法选型速查看数据形态和需求定参数聚类算法选型速查表算法簇数量是否预知簇形状假设适合样本量输出主要风险K-Means必须指定凸形/球形10万硬标签形状不规则、规模悬殊时表现差Mini-Batch K-Means必须指定凸形/球形100万硬标签精度略降需调batch_sizeDBSCAN不需要任意形状10万级硬标签噪声密度不均时Eps难调层次聚类可选任意形状2万硬标签树状图计算量随样本量爆炸GMM必须指定椭圆/高斯10万级软标签概率高斯假设不满足时结果失真谱聚类必须指定任意形状5万硬标签相似度矩阵构造和特征分解开销大我的建议是作为第一版快速探索用 K-Means 和 DBSCAN 两个结果对照。如果两个结果在主要簇上高度重合说明结构是稳定的如果差异很大大概率是特征处理或者算法假设出了问题。3. 参数不定、K值难猜我的手肘法失灵与替代方案聚类参数调优里最经典的问题就是选 K。教科书告诉你画手肘图找到拐点但现实里我很少一次就能用找个干净利落的拐点。3.1 为什么手肘法经常失灵手肘法的逻辑是随着 K 增大组内平方和SSE会不断下降下降幅度在某个 K 处出现明显转折这个 K 就是手肘。但真实数据的 SSE 随 K 的增大基本是平滑递减的尤其当数据本身没有天然簇结构、或者簇的形状不均匀时拐点非常模糊甚至不存在。我做过一个用户消费行为的聚类SSE 从 K2 到 K15 一路平滑下降所谓手肘在 K5 和 K8 都有轻微转折看图像是两张嘴都能解释。这种时候就别硬靠手肘法了要靠业务可解释性去判断。3.2 轮廓系数也有它看不见的盲区轮廓系数衡量样本与自己簇内样本的相似度 vs 与最近簇样本的相似度取值 [-1, 1]越大越好。我常用它筛选 K但发现它有非常典型的盲区数据里有几个大大小小的天然簇时如果你选的 K 把一个小簇碎掉轮廓系数未必会发出警报——因为它只看离我最近的那一个簇全局结构是否合理它管不着。真实案例有一次 K4 的轮廓系数得分 0.62K6 反而更高但 K6 把两个逻辑上一体的群体经常联合购买商品的用户硬切成了两半。数值上更好业务上完全不可解释。从此我把轮廓系数当参考指标不把它当唯一判据。3.3 我现在的做法多维度交叉定 K现在遇到需要定 K 的场景我会按下面流程来先算轮廓系数、Davies-Bouldin 指数、Calinski-Harabasz 指数三个指标各自跑一遍 K2 到 K15分别记录最优 K。如果三个指标指向的 K 差异很大说明数据不存在清晰簇结构我倾向于选择更小、更粗的 K比如取 3-4再细拆。对每个候选 K 做层次聚类树状图可视化从图上看切分之后每个子簇是否站得住。最后让业务方看每个簇能不能讲出一个一眼就能懂的故事。讲不出来的 K 值哪怕指标再好看也直接否掉。注意在聚类里指标最优不等于业务可用。聚类是给业务做决策支持的工具不是学术指标的竞技场。3.4 DBSCAN 的参数调试套路如果选了 DBSCAN调参的难度集中在 Eps 上。我分享一个好用的步骤先固定 MinPts一般取 5维度低或 2*特征维度维度高对每个点计算到第 k 近邻居就是 MinPts 对应的近邻数量的距离把所有点的这个距离排序画图图中曲线应该有一个明显的膝盖位置这个纵坐标就是可选的 Eps。选小一点簇会变碎选大一点噪声会被吸进簇里。没有明显膝盖的时候我会用网格搜索配合轮廓系数来选。一定有同学想问有没有自动选参的工具有是有比如 HDBSCAN 就通过构建可变的距离阈值自动寻找密度不同的簇用起来比 DBSCAN 省心不少适合密度差异很大的数据。你可以拿它做备选方案来交叉验证结果。4. 聚类结果怎么评估别只看一个数字稳定性比簇内距离更重要聚类分完了第一个问题就是我怎么知道这结果好不好。分类有准确率、召回率聚类没有标准答案评估起来很像在黑夜里确认自己有没有走对方向。不过我们手里还是有几件趁手的工具。4.1 内部指标看紧致度分离度但各有偏好常用的三个内部指标轮廓系数样本对自己簇的归属感 vs 对相邻簇的疏离感适合看整体分离度。Davies-Bouldin 指数DBI越小越好衡量簇内紧致 簇间分散的比值。它对噪声相对敏感。Calinski-Harabasz 指数CH组间方差与组内方差的比值越大越好。它对凸簇比较友好对形状不规则的数据会偏向选更大的 K。你最该记住的是这三个指标的数学假设差异决定了它们给出的最优 K可能完全不同。遇到不一致的结果时再回到业务解释去决断千万别盲信排名第一的 K。4.2 稳定性评估跑一百遍看结果是否说了算聚类结果最大的隐患是每次跑出来都不一样。K-Means 换了随机种子结果就变了个样Mini-Batch 算法更是常态。如果一个聚类结果换个种子就散了那它基本就是随机数产物。我的稳定性检测做法很简单用不同随机种子跑 10-20 次同样的聚类参数计算两次运行结果的 ARIAdjusted Rand Index或 NMINormalized Mutual Information这两个指标衡量两个标签结果的一致性如果不同种子间 ARI 高0.8 以上说明结构稳定低于 0.6基本可以认为分群结构不稳定。也有更严谨的做法有放回抽样bootstrap子数据集做聚类再把原始数据映射到簇上比较映射结果和原始聚类结果的 ARI。这种方法衡量的是——聚类结构是否对数据扰动敏感是评估模型鲁棒性的好办法很多学术研究里会这么用。4.3 没有标签时怎么跟业务真实对齐内部指标只能证明数学上分得好不能证明业务上分得对。我的习惯是用两三个业务核心字段比如用户价值、活跃度、购买品类做交叉表分析看每个簇在这些字段上的分布差异是否明显。如果一个簇的均值和其他簇没有显著差异那它即使几何上独立业务上也是无效簇。印象很深的一次一个电商用户分群项目跑出了六个簇轮廓系数漂亮得不行但业务方一看交叉表四个簇的平均客单价几乎一样只是活跃度和下单时间略有波动。那四个簇实际上没有决策价值等于白分。后来我们改成把客单价这个字段作为先验信息额外加权才得到了真正对业务可用的分群。提示聚类结果要落地必须能映射到业务可改变的动作上。如果不能这个簇无论数学上多完美都只是数字游戏。5. 高维数据、噪声点和类别不平衡三个现实难题实际项目里的数据没几个是教科书形态。做聚类分析时高维、噪声和类别不平衡这三座大山几乎每次都会撞上。这里我把我踩过的坑和一些做法写出来。5.1 高维条件下的距离崩塌特征维度到了几百甚至几千欧氏距离的一个反直觉特性就出现了所有点之间的距离都会趋向接近——高维空间中任何两个点都不远不近不再是有一些点近有一些点远而是都差不多远。这个现象叫距离度量失真会让基于距离的聚类方法直接失效。应对方案优先级排序先用 PCA 降到 20-50 维能保留绝大部分方差时优先这么做换用余弦相似度做距离度量对高维稀疏文本向量有明显改善试试 UMAP/t-SNE 做可视化同时进行簇结构探索但 UMAP 结果里的一些距离意义并不适合直接作为聚类依据谨慎使用特征太多又没有降维条件时换用对特征维度不敏感的算法比如基于图或子空间的聚类方法。5.2 噪声点和离群点先处理再聚类否则聚类被点绑架聚类对离群点非常敏感。K-Means 的目标函数是最小化平方和几个离群值就能拽着簇中心跑偏DBSCAN 稍好但太多离群点也可能干扰密度估计导致很多正常点被误标记为噪声。我的流程是先做离群点检测最常用的是 IQR 法四分位距或孤立森林。把明显的离群点剔除后重新聚类往往结果会好很多。而且分离出来的离群点本身是有价值的——在某客户分群项目里被剔除的离群用户后来单独成簇被验证是最具价值的高端客户群体。但要小心不要为了指标好看而把太多点标记为离群点。一般控制离群点比例在 1%-5% 以内超出这个比例说明你的数据或者特征定义出现了更本质的问题比如没做对数变换、缺失值处理不当等。5.3 类别不平衡导致大簇吞小簇类别不平衡在聚类里表现为某些天然簇非常大、某些簇很小而 K-Means 这类算法在用欧氏距离均分空间时很容易把小的真实簇吸进大簇的阴影里。比如说做地理 POI 分类城市核心区域密度大郊区密度小K-Means 会把郊区碎片强行合并进核心区簇。处理思路有几种用密度类方法DBSCAN 等至少能发现低密度区域是独立的簇虽然密度参数难调但比 K-Means 强采样策略对小簇做 SMOTE 过采样合成少数类过采样——这个在无监督里的用法比较微妙需要结合先验知识改变距离度量或特征构造比如对地理数据做密度标准化最稳妥的方式选好算法后专门用小簇检测与离群分析的方法如 Isolation Forest 在局部区域的异常分数辅助识别而不是只依赖聚类输出。我见过太多大簇吞小簇的案例最后的解决往往不是换算法而是回头调整特征的权重和尺度让模型在有意义的维度上重新度量相似性。6. 我现在的落地套路从数据到决策的一个完整流程做多了聚类我反而不再热衷追新算法而是先有一套稳定的流程。分享我现在处理一个聚类问题的完整步骤大家可以直接照着搭。6.1 流程全景定目标先想清楚聚类结果给谁看、解决什么决策问题。是用户分群用于运营策略是商品归类用于SKU管理还是纯探索性数据分析目标不同特征取舍、K 的偏好都会不同。特征工程清洗、缺失处理、离群处理、标准化必要时做 PCA 或选代表性特征。算法初跑K-Means DBSCAN 并行跑。K-Means 跑 K3 到 K10 的多个版本DBSCAN 先按 KNN 距离图选 Eps 初值。结果粗评看轮廓系数、DBI、CH 以及簇的样本量分布看各簇在业务核心指标上的交叉表差异。稳定性测试不同随机种子跑多次计算 ARI看分群是否稳定。细调与最终确认结合业务方反馈调整特征权重或对簇做合并拆分。落地与监控输出簇标签供下游使用定期重新跑聚类对比新旧分群迁移情况。6.2 一组实际案例的决策树我直接整理一个决策树式的建议新手可以按这个顺序选择数据量超过 100 万且簇形状不确定Mini-Batch K-Means 起步数据量小于 2 万且你想解释聚类层次层次聚类 树状图数据形状不规则、有离群点你怀疑存在非凸簇DBSCAN 或 HDBSCAN需要输出概率、做软聚类、且有高斯假设依据GMM有重叠强烈的簇且非线性结构谱聚类做好相似度矩阵特征维度高且做文本数据降低维度用余弦相似度或考虑主题模型类方法对比验证。6.3 落地时的两个提醒第一聚类结果的簇数量不要贪多。实际业务决策场景里3-6 个簇讲解起来最轻松簇太多业务动作设计不过来而且可能只是过度拟合了噪声。宁可把粗分之后的簇再按二维特征做细分也不要让下游面对 15 个簇一脸蒙。第二定期重跑聚类是必须的。用户行为、商品属性都在变半年前的分群结构今天大概率已经失效。而且分群之间的迁移信息很有价值——比如某用户从 A 簇迁移到 B 簇往往意味着他的行为发生了质变这个信号在很多项目里比聚类结果本身更值得追踪。7. 踩过最深的坑一次漂亮却没用的聚类项目复盘讲了很多方法论最后分享一个我印象最深的失败项目。某次做用户分群试图给电商用户分群并设计差异化运营策略。我选了一堆行为特征做了标准化和 PCA用轮廓系数选了 K6最后结果指标相当不错簇边界清楚、Separation 明显业务方看了也很兴奋。但上线后小流量验证发现运营策略几乎没有带来任何转化提升。后来复盘才意识到问题这六个簇实际对应的是活跃度从高到低的梯度而不是真正的行为类型差异。高活跃和低活跃的数字天然差异巨大距离计算里这些特征主导了一切所以聚类反映的不是不同类型的用户而是不同活跃程度的用户。这对业务运营没有意义因为活跃梯度直接看数据分布就能看到不需要一个 K-Means 模型来发现。从那以后我做任何聚类都会先问自己一个问题我要找的是同一类型但不同表现的差异还是不同类型导致的差异如果是后者就要特别小心把量级型特征和类型型特征区分开来给量级型特征做对数变换或归一化或者干脆降权。形态上的差异比如买母婴品类 vs 买数码品类比程度上的差异买得多 vs 买得少更能指导差异化运营策略。这个教训很难从教科书里得到因为它们只教你算法怎么跑不教你什么样的聚类结果对业务才有意义。真实世界里聚类的价值一定是在结果能用、可解释、可执行这三个维度上体现的。算法只是帮你达到目标的一种工具你的判断力才是决定聚类项目成败的关键。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑