如何将one hot编码列还原为数据集原始分类特征形态
独热编码还原操作方案
固定规则独热列组(team2_offensive_derived_var_0 ~ team2_offensive_derived_var_10)还原
该组列是标准的全类别独热编码,每行仅一个位置取1,直接按列匹配逻辑还原即可,操作步骤如下:
- 新增
row_id列,直接取数据集的行索引作为行序号存储 - 逐行扫描该组11个列,定位取值为1的列名,从列名末尾拆分出对应的var编号
- 将提取到的编号存入
team2_offensive_derived列,完成后可删除原11个独热列减少冗余
对应pandas实现代码:
# 筛选该组所有独热列 offensive_oh_cols = [c for c in df.columns if c.startswith("team2_offensive_derived_var_")] # 生成行ID df["row_id"] = df.index # 匹配值为1的列,提取var编号 df["team2_offensive_derived"] = ( df[offensive_oh_cols] .idxmax(axis=1) .str.split("_").str[-1] .astype(int) ) # 可选:删除原始独热列 df = df.drop(columns=offensive_oh_cols)
浮点型ratio列组(team2_other_ratio_var_42 ~ team2_other_ratio_var_52)判断与还原
这组列是否为独热编码不能仅靠列名判断,先做两步校验即可明确属性:
- 校验单格取值:标准独热编码的单格取值只能是0或1,哪怕存储为浮点型,也只会出现0.0、1.0两个值
- 校验逐行求和结果:全量类别独热的每行在该组列的取值和固定为1;如果是丢弃了参考类的哑变量编码,行和为0(对应参考类)或1(对应其他类别)
对应校验代码:
ratio_cols = [c for c in df.columns if c.startswith("team2_other_ratio_var_")] # 统计非0/1的取值数量 non_binary_count = df[ratio_cols].apply(lambda x: ~x.isin([0.0, 1.0])).sum().sum() # 统计行和的分布 row_sum_stats = df[ratio_cols].sum(axis=1).value_counts()
根据校验结果分支处理:
- 如果
non_binary_count大于0,说明列中存在0、1以外的浮点值,这组列不是独热编码,本身就是连续型比率特征,直接按数值列做缺失值填充即可,不需要做编码还原 - 如果
non_binary_count等于0,且所有行和都在[0,1]区间内,说明这组列是用浮点型存储的独热编码,还原逻辑和第一组列完全一致,逐行取最大值对应列的编号作为原始分类值即可 - 如果校验发现行和存在大于1的情况,说明这组列是多热编码(对应单样本同时归属多个类别),不能转成单列分类值,需要按多标签特征规则处理
提示:做缺失值填充时,还原后的分类列优先用众数填充,数值型比率列可根据分布选择均值、中位数或模型预测填充,适配后续statsmodels的分析要求。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

