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

处理Pandas中含高基数列表型列的分类编码问题

问题描述

我有一个包含列表型数据列的数据集,目标是完成分类任务。原本考虑用独热编码(One Hot Encoding)处理特征,但遇到了高基数问题:

执行代码:

dataC_df.apply(pd.Series.nunique)

得到输出:

Age                                             82
Gender                                           3
Smoking                                          3
Chewing Betel Quid                               3
Alcohol                                          3
Clinical diagnosis                             173
Clinical presentation of the lesion            376
History of presenting complaint                 63
Medical history                                 27
Image Category (OCA/ OPMD/ Benign/ Healthy)      4
dtype: int64

针对dataC_df['Clinical diagnosis']列,执行以下代码统计展开后的唯一值数量:

arr = []
for i in dataC_df['Clinical diagnosis']:
  arr+=i
len(set(arr))

得到输出:

56

可见该列列表数据展开后有56个唯一值,用独热编码会生成56个新列,想知道有没有更优的处理方式?


可行的优化处理方式
  • 计数编码(Count Encoding):统计每个诊断类别在数据集中的出现频次,用频次值替换原类别。这种方式把高基数特征压缩成单数值特征,保留类别出现频率的信息,适配分类任务。实现示例:

    from collections import Counter
    
    # 展开所有诊断类别并统计频次
    all_diagnoses = []
    for diag_list in dataC_df['Clinical diagnosis']:
        all_diagnoses.extend(diag_list)
    diag_counts = Counter(all_diagnoses)
    
    # 对每条数据的诊断列表计算频次均值(也可改用最大值等统计量)
    def count_encode(diag_list):
        counts = [diag_counts[diag] for diag in diag_list]
        return sum(counts) / len(counts)
    
    dataC_df['clinical_diagnosis_count_enc'] = dataC_df['Clinical diagnosis'].apply(count_encode)
    
  • 目标编码(Target Encoding):利用目标变量的统计信息(比如分类任务中每个类别对应的目标均值)编码特征,能捕捉特征与目标的关联,但需注意过拟合,通常要加交叉验证或平滑处理。实现示例:

    import category_encoders as ce
    
    # 将列表型数据转为字符串格式,适配目标编码器输入
    dataC_df['diagnosis_str'] = dataC_df['Clinical diagnosis'].apply(lambda x: ','.join(x))
    
    # 初始化目标编码器,设置平滑参数避免过拟合
    target_encoder = ce.TargetEncoder(cols=['diagnosis_str'], smoothing=10)
    # 替换target_column为你的实际目标列名
    dataC_df['clinical_diagnosis_target_enc'] = target_encoder.fit_transform(dataC_df['diagnosis_str'], dataC_df['target_column'])
    
  • 嵌入编码(Embedding Encoding):若使用深度学习模型,可将每个诊断类别映射为低维向量(如8-16维),通过模型训练学习最优向量表示。这种方式能高效处理高基数特征,还能捕捉类别间的语义关联,适合用TensorFlow/PyTorch等框架实现(比如添加Embedding层)。

  • 降维处理:先将列表型数据转为独热编码矩阵,再用PCA、t-SNE等降维方法把56维压缩到10-20维左右。注意这种方式会损失部分信息,仅适合对特征精度要求不高的场景。

  • 类别合并:借助业务领域知识,将相似的诊断类别合并为大类,直接降低唯一值数量后再编码。比如把同类型病症归为一类,既能大幅降低基数,又能保留关键业务信息,是最贴合场景的优化方式之一。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:30:49