使用scikit-learn LinearRegression填充空值触发IndexError如何解决
报错原因
- 直接触发原因:
Rupeepersqft_predicted变量未提前初始化定义,你直接对不存在的对象执行['Rupeepersqft']索引赋值操作,不符合Python对象索引规则,触发本次IndexError。 - 代码逻辑错误1:你定义
data_with_null时就调用了.dropna()方法,直接删除了所有带空值的行,后续填充空值的操作没有可生效的目标,完全失去了用模型补全空值的意义。 - 代码逻辑错误2:你后续
fillna方法传入的是DataFrame对象,而目标是Rupeepersqft这个Series列,参数类型不匹配,即使解决当前报错后续也会触发新的错误。
修复方案
修改后可正常运行的完整代码如下:
from sklearn.linear_model import LinearRegression linreg = LinearRegression() # 先复制全量目标字段数据,不提前删除空值 all_data = data2[['Price (Lakhs)','Area','Area Type','Rupeepersqft','Condition','Purchase Type','Real Estate Regulation Act']].copy() # 提取Rupeepersqft无缺失值的部分作为训练集 train_data = all_data.dropna(subset=['Rupeepersqft']) train_x = train_data.iloc[:,:3] train_y = train_data.iloc[:,3] # 训练模型 linreg.fit(train_x, train_y) # 提取需要预测的样本:仅Rupeepersqft为空的样本的前3列特征 test_data = all_data[all_data['Rupeepersqft'].isna()].iloc[:,:3] # 生成预测值 predicted_values = linreg.predict(test_data) # 直接把预测值回填到原数据集的空值位置 all_data.loc[all_data['Rupeepersqft'].isna(), 'Rupeepersqft'] = predicted_values
修改说明:
- 取消了错误的提前删空操作,先保留全量数据,单独提取无空值子集作为训练集
- 无需提前定义
Rupeepersqft_predicted变量,直接生成预测值后用loc索引回填到原数据空值位置,规避索引错误 - 仅对
Rupeepersqft为空的样本做预测,既减少不必要计算,也避免覆盖原有有效值
内容的提问来源于stack exchange,提问作者Akhil Sahukaru
相关产品推荐
相关产品推荐

