处理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

