如何将经LabelEncoder编码的多列数据解码回原始字符串类型?
解决LabelEncoder逆变换失效的问题
嘿,我看你遇到的问题根源在于编码时的LabelEncoder使用方式——你循环里共用了同一个编码器实例,导致每个列的编码映射被后续的列覆盖了,自然逆变换的时候没法还原出原始值。咱们一步步来解决:
第一步:修正编码逻辑,保存每个列对应的编码器
你需要给每个要编码的列单独创建LabelEncoder实例,并且把这些实例存起来,这样后续逆变换的时候才能用对应的编码器还原。
修改后的编码代码:
from sklearn.preprocessing import LabelEncoder def dummyEncode(df, columns_to_encode): # 用字典保存每个列对应的LabelEncoder实例 label_encoders = {} for feature in columns_to_encode: try: le = LabelEncoder() # 对当前列进行编码,并把编码器存到字典里 df[feature] = le.fit_transform(df[feature]).astype(float) label_encoders[feature] = le except Exception as e: print(f'编码{feature}时出错: {str(e)}') # 返回编码后的数据集和编码器字典 return df, label_encoders
使用的时候这么调用:
# 指定你要编码的列:date、tablename、attributename target_cols = ['date', 'tablename', 'attributename'] encoded_df, encoders = dummyEncode(你的原始数据集, target_cols)
第二步:用对应的编码器逆变换还原原始值
现在你有了每个列专属的编码器,就可以正确逆变换了。注意一个关键细节:你之前把编码后的结果转成了float类型,但LabelEncoder的逆变换需要整数输入,所以逆变换前要先把列转成int。
逆变换代码:
# 要还原的列 cols_to_revert = ['date', 'tablename', 'attributename'] for col in cols_to_revert: # 先把float转成int,满足逆变换的输入要求 encoded_df[col] = encoded_df[col].astype(int) # 使用对应列的编码器进行逆变换 encoded_df[col] = encoders[col].inverse_transform(encoded_df[col])
为什么之前的方法不行?
- 共用编码器实例:同一个
le每次执行fit_transform都会覆盖之前的映射关系,循环结束后le只保留了最后一个列的编码规则,用它去逆变换其他列肯定不对。 - 数据类型不匹配:你把编码结果转成了
float,但逆变换需要整数输入,这会导致错误或者不符合预期的输出。
这样处理之后,就能把这三列正确还原成原始类型啦。
内容的提问来源于stack exchange,提问作者wdwilhelmina
相关产品推荐
相关产品推荐

