使用pd.get_dummies生成布尔型虚拟变量导致statsmodels无法拟合OLS模型的解决方法咨询
pd.get_dummies生成布尔型虚拟变量导致statsmodels无法拟合OLS模型的解决方法咨询
嘿,我明白你遇到的麻烦了——用pd.get_dummies生成的布尔型虚拟变量让statsmodels的OLS模型跑不起来,而且尝试转整数还报错,确实挺闹心的。先帮你捋清楚问题出在哪,再给你几个靠谱的解决办法:
问题根源
看你贴的代码,你是先把布尔型的虚拟变量合并到了原数据框data里,之后才对ocean_proximity_dummies做类型转换。但这时候data里的虚拟变量列还是布尔型的,你转换的那个变量并没有替换到data里,所以statsmodels还是读到了布尔值,自然会出问题。
解决方案
这里有几个简单有效的办法,你可以根据自己的情况选:
- 先转换类型再合并数据
调整代码顺序,先把虚拟变量转成整数,再合并到原数据里:
# 生成虚拟变量 ocean_proximity_dummies = pd.get_dummies(data['ocean_proximity'], prefix= 'ocean_proximity') # 先将布尔型转换为整数 ocean_proximity_dummies = ocean_proximity_dummies.astype(int) # 再合并到原数据集 data = pd.concat([data.drop("ocean_proximity", axis=1), ocean_proximity_dummies], axis=1)
- 直接在get_dummies里指定整数类型
其实pd.get_dummies自带dtype参数,你可以直接指定生成整数类型的虚拟变量,省得后续转换:
# 生成时直接指定dtype为int ocean_proximity_dummies = pd.get_dummies(data['ocean_proximity'], prefix= 'ocean_proximity', dtype=int) # 合并到原数据 data = pd.concat([data.drop("ocean_proximity", axis=1), ocean_proximity_dummies], axis=1)
- 对已合并的数据列直接转换
如果你已经把布尔型列合并到data里了,也可以直接针对这些列做类型转换:
# 筛选出所有虚拟变量列(以指定前缀开头) dummy_columns = [col for col in data.columns if col.startswith('ocean_proximity_')] # 转换为整数类型 data[dummy_columns] = data[dummy_columns].astype(int)
补充说明
statsmodels的OLS模型对输入数据类型有要求,布尔值虽然逻辑上是0/1,但它的数据类型不属于数值型范畴,所以会导致拟合失败。转换成整数类型后,0和1就会被模型正确识别为虚拟变量的取值,就能正常跑回归了。
备注:内容来源于stack exchange,提问作者Victor Olusegun
相关产品推荐
相关产品推荐

