如何基于单特征列使用KMeans/KModes实现OU维度分组聚类
你当前代码直接将逐行账户明细数据输入聚类模型,模型默认以单条账户记录为聚类样本,自然不会输出OU维度的聚类结果。要实现17个OU的分组聚类,核心是先把数据聚合到OU粒度,再以OU为样本做聚类,最后将结果映射回原明细即可,具体操作如下:
实现步骤
第一步:按OU维度聚合生成OU级训练样本
聚类的输入样本必须和聚类目标对齐:要给OU聚类,就要先把单条账户的特征汇总成每个OU的整体特征,聚合后最终训练集共17行,每行对应1个OU的特征画像。
聚合时根据字段类型选择统计逻辑:数值型字段可计算每个OU下的均值、中位数、标准差、分位数;分类型字段可计算每个OU下各类别的占比、众数。
参考聚合代码:import pandas as pd # 替换为你数据集里的实际字段名 num_cols = ["注册天数", "近30天登录次数", "账户余额"] # 数值型特征列 cat_cols = ["账户等级", "认证状态", "所属行业"] # 分类型特征列 # 数值字段聚合 num_agg = df.groupby("OU")[num_cols].agg(["mean", "median", "std"]) num_agg.columns = [f"{col}_{stat}" for col, stat in num_agg.columns] # 分类型字段转onehot后计算各类别在OU下的占比 cat_dum = pd.get_dummies(df[["OU"] + cat_cols], columns=cat_cols) cat_agg = cat_dum.groupby("OU").mean() # 合并为OU级别的训练数据集 ou_level_df = pd.concat([num_agg, cat_agg], axis=1).reset_index()第二步:基于OU级数据集训练聚类模型
训练时注意剔除OU名称这类标识列,只输入特征字段,得到每个OU对应的聚类分组:from kmodes.kmodes import KModes # 剔除非特征的OU标识列 train_features = ou_level_df.drop(columns=["OU"]) kmode = KModes(n_clusters=3, init="random", n_init=5, verbose=1) ou_cluster_res = kmode.fit_predict(train_features) # 构造OU和聚类簇的映射关系 ou_cluster_map = dict(zip(ou_level_df["OU"], ou_cluster_res))小提示:如果你聚合后的OU特征以数值型为主,将上述KModes替换为KMeans即可,整体流程完全一致。
第三步:将聚类结果映射回原始明细数据集
不需要直接在模型输出结果上插列,通过OU映射关系给原表每条账户匹配所属OU的聚类结果即可:df["Cluster"] = df["OU"].map(ou_cluster_map) df.head(10)
注意:如果你的数据集除了OU、账户ID之外没有其他任何特征字段,将不具备OU聚类的特征基础,需要补充OU维度的属性特征(比如OU所属大区、人员规模、业务线属性等)后再开展聚类。
内容的提问来源于stack exchange,提问作者node1
相关产品推荐
相关产品推荐

