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
相关产品推荐
相关产品推荐

