如何对含多属性重复值的求职候选人数据进行One-hot编码?
解决方案:合并多字段后的统一独热编码
看起来你是把每个Knowledge*和Tag*字段单独做了独热编码,才会出现Jscript_Knowledge1、Jscript_Knowledge2这种冗余列——这确实会导致特征爆炸,直接拉低模型性能。你的核心需求其实是:把所有分散在这些字段里的技能/标签唯一值,统一映射成全局的特征列,不管这个值出现在哪个原始字段,只要候选人拥有就标记为1,没有则为0。
下面用Python pandas给出具体实现步骤,完全匹配你想要的输出格式:
步骤1:提取所有技能/标签的全局唯一值
先把目标字段合并成一个长序列,过滤空值后提取唯一值集合:
import pandas as pd # 假设你的候选人数据存储在DataFrame df中 target_columns = ['Knowledge1', 'Knowledge2', 'Knowledge3', 'Knowledge4', 'Tag1', 'Tag2'] # 合并所有技能/标签列,提取去重后的唯一值 all_unique_skills = df[target_columns].stack().dropna().unique()
步骤2:为每个唯一技能生成特征列
遍历每个唯一值,检查候选人的任意目标字段是否包含该值,生成0/1标记:
for skill in all_unique_skills: # 逐行检查:只要当前行的任意目标字段等于该技能,就标记为1 df[skill] = df[target_columns].apply( lambda row: 1 if skill in row.values else 0, axis=1 )
步骤3:(可选)清理原始字段
如果不需要保留原来的Knowledge*和Tag*字段,可以直接删除:
df = df.drop(target_columns, axis=1)
为什么这个方法能解决问题?
这个思路跳过了“按单个字段做独热编码”的误区,转而从全局视角处理所有技能/标签:
- 不管
Jscript出现在Knowledge1还是Tag2,都会映射到同一列Jscript - 特征数量严格等于所有技能/标签的唯一值总数,不会产生冗余后缀
- 完美匹配你想要的“一个技能对应一列”的输出格式
额外提示:处理空值
如果原始字段存在缺失值(比如某个候选人没有填写Knowledge4),dropna()已经在提取唯一值时排除了空值,apply逻辑也会自动忽略空值(因为空值不会匹配任何技能),无需额外处理。
内容的提问来源于stack exchange,提问作者nedzad
相关产品推荐
相关产品推荐

