文章

聚类算法在特征发现中的作用-从数据驱动到模式挖掘

聚类算法在特征发现中的作用-从数据驱动到模式挖掘

聚类算法在特征发现中的作用-从数据驱动到模式挖掘

引言

在机器学习项目中,我们经常面临一个有趣的问题:通过聚类,能否发现潜在特征?特征不是在特征工程阶段就已经定义了吗?这个问题触及了传统特征工程与数据驱动特征发现之间的本质区别。本文将深入探讨常用聚类算法的特点、适用场景,以及聚类算法在特征发现中的独特作用和价值。

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 层次与业务的关系

重要理解

  1. HDBSCAN的层次 ≠ 业务层次
    • HDBSCAN的层次是技术层面的密度层次
    • 业务层次是语义层面的分类层次(如大类包含小类)
  2. 但层次可以反映业务关系
    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(小类)
    
  3. 如何利用层次发现业务关系
    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. 如果业务确实有层次关系(如大类包含小类):
    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合并为"风险大类"
    
  2. 如果业务没有明确的层次关系
    • 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 最佳实践建议

  1. 结合使用:将聚类发现的特征与传统特征工程结合
  2. 交叉验证:在多个数据集上验证发现的特征
  3. 业务验证:确保发现的特征有业务含义
  4. 持续监控:定期检查发现特征的有效性

总结

本文介绍了常用的聚类算法及其特点,并深入探讨了聚类算法在特征发现中的独特作用。

常用聚类算法总结

  • K-Means:适合聚类数量已知、数据呈球形分布的场景
  • 层次聚类:适合需要层次结构、聚类数量不确定的场景
  • DBSCAN:适合聚类数量未知、形状不规则、包含噪声的场景
  • HDBSCAN:适合不同密度差异大的场景,自动处理密度层次,提供稳定的聚类结果
  • 谱聚类:适合非凸形状、复杂结构的数据
  • GMM:适合需要概率输出、数据近似高斯分布的场景

聚类特征发现的核心价值聚类确实能发现潜在特征,但这种”发现”是对已有特征关系和模式的挖掘,而不是凭空创造特征。它是特征工程的补充和延伸,帮助我们从数据中自动发现那些人工可能忽略的特征组合和模式。

这就像是:传统特征工程给了我们”词汇”,而聚类帮助我们发现这些”词汇”可以组成什么样的”句子”和”语法规则”。

算法选择建议

  1. 根据数据特征选择合适的聚类算法
  2. 结合使用多种算法,相互验证结果
  3. 将聚类发现的特征与传统特征工程结合
  4. 持续监控和验证发现特征的有效性

本文基于机器学习实践经验总结,介绍了常用聚类算法的特点、适用场景和选择指南,并深入探讨了聚类算法在特征发现中的独特价值和应用方法。

本文由作者按照 CC BY 4.0 进行授权