Scikit-Learn LabelEncoder二维数据集逆转换结果异常问题
问题原因
你的代码核心错误是全局仅初始化了一个LabelEncoder实例。
编码阶段循环处理每个分类列时,每次执行le.fit_transform()都会用当前列的类别集合覆盖编码器内部存储的映射关系,等所有列编码完成后,这个全局le里只保留了最后一个被处理的分类列的编码规则。逆转换时你拿这最后一列的规则去还原所有分类列,输出结果自然完全不符合预期。
修复方法
每个分类列必须使用独立的LabelEncoder实例,编码完成后要按列保存对应的训练好的编码器,逆转换时按列匹配对应编码器操作即可,参考代码如下:
编码逻辑
from sklearn.preprocessing import LabelEncoder import pandas as pd # 字典结构:key为分类列列名,value为该列训练好的LabelEncoder实例 col_encoders = {} def transformCategorical(data): cat_cols = data.select_dtypes(include=['object']).columns.tolist() for col in cat_cols: # 为当前列单独创建编码器 le = LabelEncoder() data[col] = le.fit_transform(data[col].astype(str)) # 保存当前列的编码器,供后续逆转换调用 col_encoders[col] = le return data
逆转换逻辑
def inverse_transform(original_raw_data, encoded_data): # 从原始未编码数据中提取分类列列表 cat_cols = original_raw_data.select_dtypes(include=['object']).columns.tolist() for col in cat_cols: # 取出当前列对应的专属编码器做逆转换 le = col_encoders[col] encoded_data[col] = le.inverse_transform(encoded_data[col]) return encoded_data
额外提示
- 禁止跨分类列复用同一个
LabelEncoder实例,不同分类特征的类别集合完全独立,映射规则不能通用 - 如果需要持久化存储编码后的数据,对应的
col_encoders字典也要同步序列化保存(可使用pickle、joblib等工具),否则后续加载数据后无法完成正确的逆转换 - 如果数据中存在空值、混合类型值,
astype(str)的转换逻辑要和逆转换后的预期格式对齐,避免出现非预期的字符串映射。
内容的提问来源于stack exchange,提问作者brockwill1
相关产品推荐
相关产品推荐

