kp-028
无监督挖掘:聚类与关联规则
前置知识
本文基于模型知识整理。
一句话定义
无监督挖掘在无标签数据里找结构:聚类(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」;关联是共现证据,因果需实验验证。
自测题
- 聚类前为什么必须标准化?
答:距离度量受量纲支配,未标准化时大数值特征垄断距离,聚类退化为按该特征分组。
- lift 的含义与判读?
答:lift = P(B|A)/P(B);>1 表示 A 提升了 B 出现的概率,=1 无关,<1 负相关。
- k 如何选择?两种方法?
答:肘部法看 SSE 随 k 的拐点;轮廓系数选分数最高的 k;两者结合并经业务解读确认。
与其他知识点的关系
kp-026 的 TF-IDF 向量是文本聚类的特征源;kp-029 把簇画像画成散点/雷达图;kp-030 案例含一次完整聚类落地。
延伸阅读
scikit-learn 官方「Clustering」用户指南;mlxtend 文档的 frequent_patterns 模块。