You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HDBSCAN聚类模型簇命名:如何获取簇分类规则与参数

HDBSCAN簇规则提取与命名解决方案

问题描述

我已构建基础HDBSCAN模型(聚类可视化图已生成),需要为各聚类簇命名。请问是否可以获取类似决策树的分类规则或各簇特征参数,来实现簇的精准分类?例如:类别-1需满足COMP_2_Pass=1且REBOUND_3<-2300这类过滤逻辑。感谢解答。

用户提供的HDBSCAN原始实现代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import umap.umap_ as umap
import hdbscan
from sklearn.preprocessing import StandardScaler
# 移除标签列
X = df_cleaned.drop(columns=['Failure_area'])

# 特征标准化
X_scaled = StandardScaler().fit_transform(X)

# UMAP降维做2D可视化
reducer = umap.UMAP(random_state=42)
X_umap = reducer.fit_transform(X_scaled)

# HDBSCAN聚类
clusterer = hdbscan.HDBSCAN(min_cluster_size=40, min_samples=55)
cluster_labels = clusterer.fit_predict(X_scaled)

# 将聚类结果合并到原数据集
df_clustered = df_cleaned.copy()
df_clustered['HDBSCAN_cluster'] = cluster_labels

from matplotlib.colors import ListedColormap

# 获取唯一簇标签
unique_labels = np.unique(cluster_labels)
n_clusters = len(unique_labels)

# 创建自定义颜色映射(噪声簇用指定蓝色)
colors = ['#0096FF'] + [plt.cm.tab20(i) for i in range(1, n_clusters)]
cmap = ListedColormap(colors)

# 绘制聚类结果图
plt.figure(figsize=(10, 7))
scatter = plt.scatter(
    X_umap[:, 0], X_umap[:, 1],
    c=cluster_labels,
    cmap=cmap,
    s=10
)

plt.title("UMAP + HDBSCAN 全数据集聚类结果")
plt.xlabel("UMAP维度1")
plt.ylabel("UMAP维度2")
plt.grid(True)

# 添加带正确刻度的颜色条
cbar = plt.colorbar(scatter, ticks=unique_labels)
cbar.set_label('簇ID')

plt.show()

# 输出各簇样本数量
print(df_clustered['HDBSCAN_cluster'].value_counts().sort_values(ascending=False))

实现方法

一、统计特征分布提炼规则(基础方法)

通过计算各簇的特征统计量,手动筛选差异显著的特征阈值:

  • 计算每个簇的均值、中位数、四分位数、极值,定位与其他簇差异明显的特征
  • 用箱线图可视化特征在各簇的分布,直观识别分界点
# 计算各簇特征统计量
cluster_stats = df_clustered.groupby('HDBSCAN_cluster').agg([np.mean, np.median, lambda x: x.quantile(0.25), lambda x: x.quantile(0.75)])
# 重命名列名提升可读性
cluster_stats.columns = ['_'.join(col).strip() for col in cluster_stats.columns.values]
print(cluster_stats)

# 可视化单个特征的簇间分布(以REBOUND_3为例)
plt.figure(figsize=(12,6))
sns.boxplot(x='HDBSCAN_cluster', y='REBOUND_3', data=df_clustered)
plt.title('REBOUND_3在各簇的分布')
plt.show()

二、用决策树生成可解释分类规则

以HDBSCAN的簇标签为目标变量,训练浅决策树直接导出规则:

  • 限制树的深度(如max_depth=3)避免过拟合,保证规则简洁易懂
  • 用export_text直接生成类似"IF-THEN"的规则文本
from sklearn.tree import DecisionTreeClassifier, export_text

# 用原始特征训练(比标准化特征更易生成业务可读规则)
X_rules = df_cleaned.drop(columns=['Failure_area'])
y_rules = df_clustered['HDBSCAN_cluster']

# 训练浅决策树
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(X_rules, y_rules)

# 导出规则文本
tree_rules = export_text(dt, feature_names=list(X_rules.columns))
print(tree_rules)

示例输出规则:

|--- REBOUND_3 <= -2300.00
|   |--- COMP_2_Pass <= 1.00
|   |   |--- class: -1
|   |--- COMP_2_Pass >  1.00
|   |   |--- class: 0
|--- REBOUND_3 >  -2300.00
|   |--- class: 1

三、提取HDBSCAN内部参数辅助分析

HDBSCAN自带的聚类参数可帮助理解簇的可靠性和特征:

  • cluster_persistence_:簇的稳定性(值越高簇越可靠)
  • outlier_scores_:样本异常值分数(噪声样本分数更高)
  • exemplars_:簇的代表样本(可分析核心样本的特征)
# 查看各簇稳定性
print("各簇稳定性:", clusterer.cluster_persistence_)

# 添加异常值分数到数据集
df_clustered['outlier_score'] = clusterer.outlier_scores_

# 查看每个簇的代表样本特征
for cluster_id in unique_labels:
    if cluster_id == -1:
        continue
    exemplars = clusterer.exemplars_[cluster_id]
    print(f"\n簇{cluster_id}的代表样本特征:")
    print(X.iloc[exemplars].head())

四、簇命名建议

结合提取的规则和业务场景命名:

  • 若某簇满足REBOUND_3<-2300且COMP_2_Pass=1,可命名为**"低回弹未通过组"**
  • 噪声簇(label=-1)可命名为**"异常样本组"**
  • 其他簇根据核心特征差异,结合业务术语命名

内容的提问来源于stack exchange,提问作者Garrett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:07:14