使用pd.from_dummies还原OHE目标变量时触发ValueError问题求助
问题:独热编码还原触发ValueError,替代方案是否可行?
我正在参与Kaggle Playground系列竞赛,用简单神经网络解决二分类问题。通过独热编码(OHE)将目标变量Personality转换为1和0:
train2 = pd.get_dummies(train, columns=['Personality'], drop_first=True, dtype=int)
随后用tensorflow-keras训练模型,输出为概率值,因此用以下代码取整:
pred = np.round(pred)
接着将结果转换为int64类型并转为DataFrame:
df = pd.DataFrame(pred) pred_df = df.astype('int64') pred_df.head()
但尝试将预测值还原为Introvert和Extrovert时,执行:
final = pd.from_dummies(pred_df)
触发错误,完整错误信息如下:
This is the full error message -> --------------------------------------------------------------------------- ValueError Traceback (most recent call last) /tmp/ipykernel_635/341381991.py in <cell line: 0>() 1 #Revert ----> 2 final = pd.from_dummies(pred_df) /usr/local/lib/python3.11/dist-packages/pandas/core/reshape/encoding.py in from_dummies(data, sep, default_category) 550 cats.append(default_category[prefix]) 551 else: --> 552 raise ValueError( 553 "Dummy DataFrame contains unassigned value(s); " 554 f"First instance in row: {assigned.idxmin()}" ValueError: Dummy DataFrame contains unassigned value(s); First instance in row: 0
不确定问题所在及解决方法,附上全部代码。如果无法还原,使用map函数(如1对应Introvert)是否可行?
问题原因
pd.from_dummies()需要带有原类别前缀的列名才能识别类别映射关系,而你的pred_df列名是默认数字(如0),没有关联原Personality的类别信息;另外,你用drop_first=True编码时已丢弃一个类别,from_dummies无法自动识别被丢弃的类别,因此触发错误。
解决方法
方法1:直接用map函数(最简便)
二分类场景下,直接通过字典映射即可完成还原,无需依赖from_dummies:
# 确认原编码规则:比如train2中Personality_Introvert=1对应Introvert,0对应Extrovert pred_df['Personality'] = pred_df[0].map({1: 'Introvert', 0: 'Extrovert'})
方法2:修正列名后用from_dummies
如果一定要用from_dummies,需先给pred_df设置原独热编码的列名,并指定被丢弃的默认类别:
# 重命名列,匹配原独热编码后的列名 pred_df.columns = ['Personality_Introvert'] # 还原时指定被丢弃的类别 final = pd.from_dummies(pred_df, default_category={'Personality': 'Extrovert'})
总结
二分类场景下,map函数是最直接高效的方案,既避免了from_dummies的列名依赖问题,也能快速完成类别还原。
内容的提问来源于stack exchange,提问作者Karis C. Anoruo
相关产品推荐
相关产品推荐

