kp-028

无监督挖掘:聚类与关联规则

进阶 ≈ 30 分钟 聚类KMeans关联规则Apriori标准化lift

前置知识

本文基于模型知识整理。

一句话定义

无监督挖掘在无标签数据里找结构:聚类(KMeans)把相似对象分组形成「商品/店铺画像」,关联规则(support/confidence/lift)找出「经常一起出现」的组合。

为什么重要

采集数据几乎都没有标签,但「把 2000 个竞品分成几类打法」「哪些属性组合总一起出现」恰是业务最想问的问题。这两个方法不需要标注数据,是爬虫数据性价比最高的深挖手段。

前置知识

kp-026(文本可向量化);均值/方差概念。

核心概念

  • 特征标准化:各维除以标准差(z-score)——不标准化,大数值特征会垄断距离。
  • KMeans:指定 k,迭代「分配点到最近质心 → 重算质心」直至收敛。
  • k 的选择:肘部法(看 SSE 拐点)或轮廓系数(越大越好)。
  • 关联规则三度量:support(A∪B 出现占比)、confidence(A→B:P(B|A))、lift(P(B|A)/P(B),>1 才有正向关联)。

原理与机制

公式组:

z-score:        z = (x − μ) / σ
SSE(KMeans):    Σ_i Σ_{x∈C_i} ||x − c_i||²
support(A→B):   P(A ∩ B)
confidence:     P(B | A) = P(A ∩ B) / P(A)
lift:           P(B | A) / P(B)     # lift>1: A 的出现抬升了 B 的概率

商品画像聚类最小流程(sklearn):

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

X = df[["price", "rating", "review_count", "sales"]]
Xs = StandardScaler().fit_transform(X)           # ① 标准化, 不可省

scores = {k: silhouette_score(Xs, KMeans(n_clusters=k, n_init=10, random_state=42)
                              .fit_predict(Xs)) for k in range(3, 9)}
k = max(scores, key=scores.get)                  # ② 用轮廓系数选 k

labels = KMeans(n_clusters=k, n_init=10, random_state=42).fit_predict(Xs)
df["cluster"] = labels
print(df.groupby("cluster")[["price", "sales"]].mean())   # ③ 用业务字段解读簇

关联规则的朴素思路(小规模可直接双循环算三度量,或用 mlxtend 的 apriori+association_rules)。

实例或案例

2000 个竞品 SKU 聚成 4 簇后画像清晰:低价高销引流款(price 低 sales 高)、中价高评口碑款、高价低销形象款、高价高销头部款。运营据此判断自家 SKU 落在「高价低销」危险区——聚类把散点变成了可讨论的战场地图。关联侧:「礼盒装 × 高价」lift=2.3,提示礼盒与高定价存在稳定组合。

常见误区

  • 误区一:忘记标准化。 sales(千位)与 rating(1–5)直接算距离,聚类结果等于按 sales 分组。
  • 误区二:把聚类簇当「真实类别」。 簇是算法切出来的结构,业务解读要与人工抽检互证;k 不同结论不同。
  • 误区三:把 lift 关联当因果。 「A 与 B 一起出现」不等于「A 导致 B」;关联是共现证据,因果需实验验证。

自测题

  1. 聚类前为什么必须标准化?

答:距离度量受量纲支配,未标准化时大数值特征垄断距离,聚类退化为按该特征分组。

  1. lift 的含义与判读?

答:lift = P(B|A)/P(B);>1 表示 A 提升了 B 出现的概率,=1 无关,<1 负相关。

  1. k 如何选择?两种方法?

答:肘部法看 SSE 随 k 的拐点;轮廓系数选分数最高的 k;两者结合并经业务解读确认。

与其他知识点的关系

kp-026 的 TF-IDF 向量是文本聚类的特征源;kp-029 把簇画像画成散点/雷达图;kp-030 案例含一次完整聚类落地。

延伸阅读

scikit-learn 官方「Clustering」用户指南;mlxtend 文档的 frequent_patterns 模块。

相关知识点

学习进度