聚类算法在特征发现中的作用-从数据驱动到模式挖掘
聚类算法在特征发现中的作用-从数据驱动到模式挖掘
引言
在机器学习项目中,我们经常面临一个有趣的问题:通过聚类,能否发现潜在特征?特征不是在特征工程阶段就已经定义了吗?这个问题触及了传统特征工程与数据驱动特征发现之间的本质区别。本文将深入探讨常用聚类算法的特点、适用场景,以及聚类算法在特征发现中的独特作用和价值。
1. 常用聚类算法概览
聚类算法是机器学习中重要的无监督学习方法,不同的算法适用于不同的数据特征和业务场景。以下是常用的聚类算法及其特点:
1.1 K-Means聚类
算法原理:
- 通过迭代将样本划分到距离最近的聚类中心
- 然后更新聚类中心,重复直到收敛
- 目标是最小化簇内平方和(WCSS)
优点:
- ✅ 实现简单,收敛速度快
- ✅ 效果较优,可解释性强
- ✅ 适合大规模数据
- ✅ 计算复杂度相对较低(O(nkt),n为样本数,k为聚类数,t为迭代次数)
缺点:
- ❌ 需要预先指定聚类数量k
- ❌ 对初始值敏感,容易陷入局部最优
- ❌ 不适合非凸形状的簇(假设簇是球形的)
- ❌ 对异常值敏感
适用场景:
- 聚类数量已知或可估计
- 数据呈球形分布
- 需要快速聚类结果
- 大规模数据集
代码示例:
1
2
3
4
5
6
7
8
from sklearn.cluster import KMeans
# 初始化K-Means
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X)
# 获取聚类中心
centers = kmeans.cluster_centers_
1.2 层次聚类(Hierarchical Clustering)
算法原理:
- 凝聚式(Agglomerative):自底向上,从单点开始逐步合并
- 分裂式(Divisive):自上向下,从整体开始逐步分割
- 生成树状结构(Dendrogram)
优点:
- ✅ 不需要预先指定聚类数量
- ✅ 生成层次结构,便于可视化
- ✅ 可在不同层次选择聚类结果
- ✅ 对数据分布假设较少
缺点:
- ❌ 计算复杂度高(O(n³)或O(n²log n))
- ❌ 对大规模数据不友好
- ❌ 一旦合并/分裂,无法撤销
- ❌ 对噪声和异常值敏感
适用场景:
- 需要层次结构信息
- 数据量中等(<10k样本)
- 需要可视化聚类过程
- 聚类数量不确定
代码示例:
1
2
3
4
5
6
7
8
9
10
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
# 凝聚式层次聚类
clustering = AgglomerativeClustering(n_clusters=3)
labels = clustering.fit_predict(X)
# 生成树状图
linkage_matrix = linkage(X, method='ward')
dendrogram(linkage_matrix)
1.3 DBSCAN聚类
算法原理:
- 基于密度的聚类算法
- 通过定义eps(邻域半径)和min_samples(最小样本数)来识别密集区域
- 自动识别噪声点(离群点)
优点:
- ✅ 自动确定聚类数量
- ✅ 可以处理任意形状的簇
- ✅ 能够识别噪声点
- ✅ 对异常值不敏感
缺点:
- ❌ 参数选择困难(eps和min_samples)
- ❌ 对高维数据性能下降(维度灾难)
- ❌ 不同密度差异大的聚类效果差
- ❌ 边界点归属可能受样本顺序影响
适用场景:
- 聚类数量未知
- 聚类形状不规则
- 数据包含噪声点
- 低维或中维数据(<30维)
代码示例:
1
2
3
4
5
6
7
8
from sklearn.cluster import DBSCAN
# DBSCAN聚类
dbscan = DBSCAN(eps=0.5, min_samples=5)
labels = dbscan.fit_predict(X)
# 识别噪声点(标签为-1)
noise_mask = labels == -1
1.4 HDBSCAN聚类(Hierarchical DBSCAN)
算法原理:
- HDBSCAN = Hierarchical DBSCAN(层次DBSCAN)
- DBSCAN的改进版本,结合了层次聚类的思想
- 通过构建密度层次树来处理不同密度的聚类
- 自动选择最优的聚类结果
核心概念:层次(Hierarchy)的含义
HDBSCAN的”层次”概念需要特别理解:
1.4.1 技术层面的层次:密度层次
HDBSCAN的层次是基于密度的层次,不是业务语义的层次:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
密度层次结构示例:
高密度阈值(eps=2.0):
┌─────────────────┐
│ 聚类A (10个点) │ ← 最密集的区域
│ 聚类B (8个点) │
└─────────────────┘
中等密度阈值(eps=5.0):
┌─────────────────────────┐
│ 聚类A + 聚类C (15个点) │ ← 聚类A和C合并
│ 聚类B (8个点) │
└─────────────────────────┘
低密度阈值(eps=10.0):
┌─────────────────────────────┐
│ 聚类A+C+B (23个点) │ ← 所有聚类合并
└─────────────────────────────┘
层次的含义:
- 不是:业务上的”大类包含小类”(如”风险类别A包含子类别A1、A2”)
- 而是:在不同密度阈值下,聚类会合并或分裂
- 本质:密度从高到低,聚类从细分到粗分的过程
1.4.2 层次的工作原理
步骤1:构建层次树(Cluster Tree)
1
2
3
4
5
6
7
8
9
# HDBSCAN内部会:
# 1. 在不同eps值下运行DBSCAN
# 2. 记录每个eps值下的聚类结果
# 3. 构建一个"聚类树",展示聚类如何随密度变化
# 伪代码示例
for eps in [0.5, 1.0, 2.0, 5.0, 10.0]:
clusters = dbscan(X, eps=eps, min_samples=5)
# 记录:eps=0.5时有5个聚类,eps=1.0时有3个聚类...
步骤2:提取稳定聚类(Stable Clusters)
1
2
3
4
# HDBSCAN会:
# 1. 分析哪些聚类在多个eps值下都存在(稳定)
# 2. 选择最稳定的聚类作为最终结果
# 3. 这样可以自动处理不同密度的聚类
可视化示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
聚类树(简化版):
eps=0.5: [A] [B] [C] [D] [E] (5个聚类)
↓
eps=1.0: [A] [B+C] [D] [E] (4个聚类,B和C合并)
↓
eps=2.0: [A] [B+C+D] [E] (3个聚类,B+C和D合并)
↓
eps=5.0: [A+B+C+D] [E] (2个聚类)
↓
eps=10.0: [A+B+C+D+E] (1个大聚类)
最终选择:根据稳定性选择 [A], [B+C], [D], [E]
1.4.3 层次与业务的关系
重要理解:
- HDBSCAN的层次 ≠ 业务层次
- HDBSCAN的层次是技术层面的密度层次
- 业务层次是语义层面的分类层次(如大类包含小类)
- 但层次可以反映业务关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
业务场景示例: 主要类别(密集区域,高密度): - 正常样本群体(80%样本,特征相似) 少数类别(稀疏区域,低密度): - 风险类别A(5%样本) - 风险类别B(5%样本) - 风险类别C(10%样本) HDBSCAN的层次可能发现: - 高密度:正常样本群体独立 - 低密度:所有风险类别合并成一个"风险群体" 这反映了业务上的层次关系: - 顶层:正常 vs 风险(大类) - 底层:风险类别A、B、C(小类)
- 如何利用层次发现业务关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
from hdbscan import HDBSCAN # 使用HDBSCAN clusterer = HDBSCAN( min_cluster_size=5, min_samples=3, cluster_selection_epsilon=0.0 # 不合并,保留所有层次 ) labels = clusterer.fit_predict(X) # 获取层次信息 cluster_tree = clusterer.condensed_tree_ # 可以分析不同密度下的聚类关系 # 如果设置cluster_selection_epsilon > 0 # 可以控制哪些聚类应该合并(反映业务层次)
实际应用建议:
- 如果业务确实有层次关系(如大类包含小类):
1 2 3 4 5 6 7 8 9 10
# 可以通过调整cluster_selection_epsilon来控制层次 # epsilon=0.0: 保留所有细分聚类(小类) # epsilon>0: 合并相似聚类(形成大类) # 示例:发现"风险大类"和"风险小类" clusterer_fine = HDBSCAN(min_cluster_size=3, cluster_selection_epsilon=0.0) # 结果:风险类别A、B、C分别独立 clusterer_coarse = HDBSCAN(min_cluster_size=5, cluster_selection_epsilon=2.0) # 结果:风险类别A、B、C合并为"风险大类"
- 如果业务没有明确的层次关系:
- HDBSCAN的层次仍然有用
- 可以帮助发现不同密度下的聚类结构
- 自动选择最稳定的聚类结果
优点:
- ✅ 自动处理不同密度的聚类(核心优势)
- ✅ 不需要手动调整eps参数
- ✅ 提供层次信息,可以分析聚类关系
- ✅ 更稳定的聚类结果
- ✅ 适合密度差异大的数据集
缺点:
- ❌ 计算复杂度较高(需要构建层次树)
- ❌ 层次概念可能不易理解
- ❌ 需要理解
cluster_selection_epsilon参数
适用场景:
- 不同聚类密度差异大(如主要类别 vs 少数类别)
- 需要自动处理密度差异
- 希望获得稳定的聚类结果
- 需要分析聚类之间的层次关系
代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from hdbscan import HDBSCAN
# 基础用法
clusterer = HDBSCAN(
min_cluster_size=5, # 最小聚类大小
min_samples=3, # 核心点最小邻居数
cluster_selection_epsilon=0.0, # 控制聚类合并(0=不合并,>0=合并)
metric='euclidean'
)
labels = clusterer.fit_predict(X)
# 获取层次信息
condensed_tree = clusterer.condensed_tree_
# 可以可视化聚类树,分析不同密度下的聚类关系
# 控制层次(合并相似聚类)
clusterer_coarse = HDBSCAN(
min_cluster_size=5,
cluster_selection_epsilon=2.0 # 合并距离<2.0的聚类
)
labels_coarse = clusterer_coarse.fit_predict(X)
1.5 谱聚类(Spectral Clustering)
算法原理:
- 基于图论的聚类方法
- 利用数据的相似度矩阵进行特征分解
- 在低维空间中进行聚类
优点:
- ✅ 可以处理非凸形状的簇
- ✅ 对数据分布假设较少
- ✅ 适合处理复杂形状的数据
缺点:
- ❌ 计算复杂度高(需要特征分解)
- ❌ 需要构造相似度矩阵
- ❌ 参数选择(相似度度量、聚类数)影响大
- ❌ 对大规模数据不友好
适用场景:
- 非凸形状的聚类
- 数据具有图结构
- 需要处理复杂形状的数据
- 中小规模数据集
代码示例:
1
2
3
4
5
from sklearn.cluster import SpectralClustering
# 谱聚类
spectral = SpectralClustering(n_clusters=3, affinity='rbf')
labels = spectral.fit_predict(X)
1.6 高斯混合模型(GMM)
算法原理:
- 基于概率模型的聚类方法
- 假设数据由多个高斯分布混合而成
- 使用EM算法进行参数估计
优点:
- ✅ 提供概率输出(软聚类)
- ✅ 可以处理不同形状和大小的簇
- ✅ 理论基础扎实
- ✅ 可以处理重叠的簇
缺点:
- ❌ 需要预先指定聚类数量
- ❌ 假设数据服从高斯分布
- ❌ 计算复杂度较高
- ❌ 对初始值敏感
适用场景:
- 需要概率输出
- 数据近似服从高斯分布
- 需要软聚类结果
- 聚类有重叠
代码示例:
1
2
3
4
5
6
7
8
from sklearn.mixture import GaussianMixture
# 高斯混合模型
gmm = GaussianMixture(n_components=3, random_state=42)
labels = gmm.fit_predict(X)
# 获取概率分布
probabilities = gmm.predict_proba(X)
1.7 其他常用算法
均值漂移聚类(Mean Shift):
- 基于密度估计的非参数方法
- 自动确定聚类数量
- 适合处理球形聚类
OPTICS:
- DBSCAN的改进版本
- 可以处理不同密度的聚类
- 生成聚类可达性图
BIRCH:
- 适合大规模数据的层次聚类
- 使用CF树结构
- 内存效率高
相似度传播(Affinity Propagation):
- 不需要预先指定聚类数量
- 通过消息传递进行聚类
- 计算复杂度较高
1.8 算法选择指南
| 数据特征 | 推荐算法 | 关键考虑 |
|---|---|---|
| 聚类数量已知 | K-Means, GMM | 快速、简单 |
| 聚类数量未知 | DBSCAN, 层次聚类, Mean Shift | 自动确定 |
| 非凸形状 | DBSCAN, 谱聚类 | 形状灵活性 |
| 大规模数据 | K-Means, BIRCH | 计算效率 |
| 包含噪声 | DBSCAN, OPTICS | 噪声处理能力 |
| 需要概率输出 | GMM | 软聚类 |
| 需要层次结构 | 层次聚类 | 树状结构 |
| 密度差异大 | HDBSCAN, OPTICS | 多密度处理 |
| 高维数据 | 谱聚类(需降维), K-Means(需降维) | 维度处理 |
选择流程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1. 确定聚类数量是否已知
├─ 已知 → K-Means 或 GMM
└─ 未知 → DBSCAN 或 层次聚类
2. 检查数据形状
├─ 球形 → K-Means, GMM
└─ 非球形 → DBSCAN, 谱聚类
3. 检查数据规模
├─ 大规模 → K-Means, BIRCH
└─ 中小规模 → 层次聚类, 谱聚类
4. 检查是否有噪声
├─ 有噪声 → DBSCAN, OPTICS
└─ 无噪声 → K-Means, GMM
5. 检查密度分布
├─ 密度均匀 → DBSCAN, K-Means
└─ 密度差异大 → HDBSCAN, OPTICS
2. 聚类确实可以发现潜在特征,但方式和传统特征工程不同
2.1 特征工程 vs 特征发现的区别
传统特征工程:
- 基于领域知识,人工构造特征
- 例如:从原始数据中提取 COUNT、MEAN、STD 等统计特征
- 这是”显式”的特征定义
聚类特征发现:
- 基于数据驱动,自动发现隐藏模式
- 是”隐式”的特征发现
- 发现的是特征间的关系和组合模式
2.2 聚类发现潜在特征的具体方式
A. 聚类标签作为新特征
1
2
3
# 原始特征:[年龄, 收入, 消费频次]
# 聚类后发现3个用户群体
# 新特征:用户类型 = [价格敏感型, 品质追求型, 冲动消费型]
B. 聚类中心距离特征
1
2
3
# 每个样本到各聚类中心的距离
# 样本A: [距离群体1=0.2, 距离群体2=1.5, 距离群体3=2.1]
# 这些距离本身就是新的特征维度
C. 聚类内模式特征
1
2
3
# 发现某个聚类内的特征分布规律
# 例如:高收入群体中,年龄和消费呈现特定的比例关系
# 可以构造 "收入年龄比" 这样的新特征
2.3 与业务的结合案例
电商用户分析:
- 原始特征:购买次数、浏览时长、客单价
- 聚类发现:用户被分为5个群体
- 新发现的潜在特征:
- “购买决策速度” = 浏览时长/购买次数
- “价格敏感度” = 通过聚类内价格分布发现
- “忠诚度等级” = 基于聚类稳定性
分类检测场景:
- 原始特征:行为频次、类型标识、记录特征
- 聚类发现:样本被分为不同类别群体
- 新发现的潜在特征:
- “行为模式相似度”
- “异常行为指数”
- “群体归属概率分布”
2.4 聚类特征发现的价值
A. 发现非线性特征组合
1
2
传统特征工程:income + age
聚类发现:income^2 * age / frequency (通过聚类边界反推)
B. 识别异常模式
1
2
某些样本不属于任何聚类(噪声点)
→ 可以构造"异常度"特征
C. 动态特征发现
1
2
随着数据增加,聚类结果可能变化
→ 发现数据演化中的新模式
2.5 实际操作中的应用
A. 两阶段特征工程
1
2
3
4
5
第一阶段:基于领域知识构造基础特征
↓
第二阶段:基于聚类发现组合特征和模式特征
↓
第三阶段:将发现的特征用于监督学习
B. 迭代发现过程
1
初始特征 → 聚类 → 分析聚类特点 → 构造新特征 → 重新聚类
2.6 局限性和注意事项
A. 稳定性问题
- 聚类结果可能不稳定,发现的特征需要验证
- 需要多次运行确保特征的一致性
B. 过拟合风险
- 基于训练数据发现的特征可能不泛化
- 需要在独立数据集上验证
C. 业务解释性
- 发现的特征需要能够业务解释
- 纯数学意义的特征组合可能没有实际价值
2.7 最佳实践建议
- 结合使用:将聚类发现的特征与传统特征工程结合
- 交叉验证:在多个数据集上验证发现的特征
- 业务验证:确保发现的特征有业务含义
- 持续监控:定期检查发现特征的有效性
总结
本文介绍了常用的聚类算法及其特点,并深入探讨了聚类算法在特征发现中的独特作用。
常用聚类算法总结:
- K-Means:适合聚类数量已知、数据呈球形分布的场景
- 层次聚类:适合需要层次结构、聚类数量不确定的场景
- DBSCAN:适合聚类数量未知、形状不规则、包含噪声的场景
- HDBSCAN:适合不同密度差异大的场景,自动处理密度层次,提供稳定的聚类结果
- 谱聚类:适合非凸形状、复杂结构的数据
- GMM:适合需要概率输出、数据近似高斯分布的场景
聚类特征发现的核心价值: 聚类确实能发现潜在特征,但这种”发现”是对已有特征关系和模式的挖掘,而不是凭空创造特征。它是特征工程的补充和延伸,帮助我们从数据中自动发现那些人工可能忽略的特征组合和模式。
这就像是:传统特征工程给了我们”词汇”,而聚类帮助我们发现这些”词汇”可以组成什么样的”句子”和”语法规则”。
算法选择建议:
- 根据数据特征选择合适的聚类算法
- 结合使用多种算法,相互验证结果
- 将聚类发现的特征与传统特征工程结合
- 持续监控和验证发现特征的有效性
本文基于机器学习实践经验总结,介绍了常用聚类算法的特点、适用场景和选择指南,并深入探讨了聚类算法在特征发现中的独特价值和应用方法。
