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

如何基于单特征列使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:57:13