You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pd.get_dummies生成布尔型虚拟变量导致statsmodels无法拟合OLS模型的解决方法咨询

pd.get_dummies生成布尔型虚拟变量导致statsmodels无法拟合OLS模型的解决方法咨询

嘿,我明白你遇到的麻烦了——用pd.get_dummies生成的布尔型虚拟变量让statsmodels的OLS模型跑不起来,而且尝试转整数还报错,确实挺闹心的。先帮你捋清楚问题出在哪,再给你几个靠谱的解决办法:

问题根源

看你贴的代码,你是先把布尔型的虚拟变量合并到了原数据框data里,之后才对ocean_proximity_dummies做类型转换。但这时候data里的虚拟变量列还是布尔型的,你转换的那个变量并没有替换到data里,所以statsmodels还是读到了布尔值,自然会出问题。

解决方案

这里有几个简单有效的办法,你可以根据自己的情况选:

  1. 先转换类型再合并数据
    调整代码顺序,先把虚拟变量转成整数,再合并到原数据里:
# 生成虚拟变量
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)
  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)
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:09:30