独热编码时如何对分类值排序加权实现自定义编码结果
自定义类独热权重编码实现方案
sklearn.preprocessing.OneHotEncoder默认逐特征独立生成独热列,两个分类特征会生成2*5=10列纯0/1值结果,天然不支持跨同值域特征做加权合并,所以没法直接输出你要的效果,可以用以下两种方式实现需求:
方法1:Pandas 快速实现(适合离线小批量数据处理)
核心逻辑是先初始化全0的编码矩阵,再按规则给对应分类列赋值:
import pandas as pd # 加载原始数据 df = pd.DataFrame({ 'id': [1, 2, 3, 4, 5], 'feature_1': ['a', 'b', 'c', 'd', 'e'], 'feature_2': ['e', 'c', 'd', 'b', 'a'] }) # 固定分类值的列顺序,避免列错位 cat_cols = ['a', 'b', 'c', 'd', 'e'] # 初始化全0编码表 encode_res = pd.DataFrame(0, index=df.index, columns=cat_cols) # feature_1对应列赋值1 for cat in cat_cols: encode_res.loc[df['feature_1'] == cat, cat] = 1 # feature_2对应列赋值0.5 for cat in cat_cols: encode_res.loc[df['feature_2'] == cat, cat] = 0.5 # 拼接id得到最终结果 final_res = pd.concat([df[['id']], encode_res], axis=1)
运行后输出结果和预期完全一致:
| id | a | b | c | d | e |
|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 | 0 | 0.5 |
| 2 | 0 | 1 | 0.5 | 0 | 0 |
| 3 | 0 | 0 | 1 | 0.5 | 0 |
| 4 | 0 | 0.5 | 0 | 1 | 0 |
| 5 | 0.5 | 0 | 0 | 0 | 1 |
方法2:基于OneHotEncoder改造实现(兼容Sklearn Pipeline流程)
如果你需要把编码逻辑嵌入sklearn的建模流水线,可以先调用OneHotEncoder生成标准独热结果,再按特征拆分块做加权求和:
from sklearn.preprocessing import OneHotEncoder import pandas as pd import numpy as np # 初始化编码器,手动指定两个特征的分类顺序完全一致,避免错位 enc = OneHotEncoder( categories=[cat_cols, cat_cols], sparse_output=False ) # 输出shape为(样本数, 10),前5列对应feature_1的独热,后5列对应feature_2的独热 oh_matrix = enc.fit_transform(df[['feature_1', 'feature_2']]) # 按权重加和:feature_1权重1,feature_2权重0.5 custom_encode_matrix = oh_matrix[:, :len(cat_cols)] * 1 + oh_matrix[:, len(cat_cols):] * 0.5 # 拼接id得到结果 final_res_sk = pd.concat( [df[['id']], pd.DataFrame(custom_encode_matrix, columns=cat_cols)], axis=1 )
注意事项
- 必须手动指定
categories参数固定分类顺序,若依赖编码器自动推断分类,当某个特征存在缺失分类值时会出现列错位,导致权重赋值错误。 - 该逻辑可扩展到多个同值域分类特征的加权编码,只要按特征拆分独热块、乘对应权重后加和即可。
内容的提问来源于stack exchange,提问作者Sharp Thwey Thit
相关产品推荐
相关产品推荐

