含NaN值的Latitude列致回归预测报错,如何修复?
解决线性回归模型因NaN值报错的方案
报错核心是Latitude列存在NaN值,而sklearn的LinearRegression无法处理含缺失值的输入数据,以下是两种可行解决方法:
方法一:填充缺失值(推荐,避免丢失样本)
用训练集的统计特征(如均值、中位数)填充NaN值,注意必须用训练集的统计量填充验证集,防止数据泄露:
# 计算训练集Latitude的均值 train_lat_mean = X_train['Latitude'].mean() # 填充训练集和验证集的NaN值 X_train['Latitude'] = X_train['Latitude'].fillna(train_lat_mean) X_vali['Latitude'] = X_vali['Latitude'].fillna(train_lat_mean) # 提取特征 feature3 = ['Panel_Capacity', 'Solar_age', 'Panel_Capacity * Solar_age', 'Financed_Yes', 'Panel_Capacity*Financed_Yes','Latitude'] x3_train = X_train[feature3].to_numpy() y3_train = y_train from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error as mse # 训练模型 model3 = LinearRegression() model3.fit(x3_train, y3_train) # 计算残差(修正原代码笔误:fitted2改为fitted3) fitted3 = model3.predict(x3_train) res3 = y3_train - fitted3 # 验证集预测与MSE计算 x3_vali = X_vali[feature3].to_numpy() m3_generation_pred = model3.predict(x3_vali) m3_vali_mse = mse(y_vali, m3_generation_pred) print(m3_vali_mse)
如果Latitude是偏态分布,可改用中位数X_train['Latitude'].median()填充。
方法二:删除含缺失值的样本
若Latitude列的NaN样本占比极低、数据量充足,可直接删除这些样本:
# 删除训练集中Latitude含NaN的行 X_train_clean = X_train.dropna(subset=['Latitude']) y_train_clean = y_train.loc[X_train_clean.index] # 删除验证集中Latitude含NaN的行 X_vali_clean = X_vali.dropna(subset=['Latitude']) y_vali_clean = y_vali.loc[X_vali_clean.index] # 提取特征 feature3 = ['Panel_Capacity', 'Solar_age', 'Panel_Capacity * Solar_age', 'Financed_Yes', 'Panel_Capacity*Financed_Yes','Latitude'] x3_train = X_train_clean[feature3].to_numpy() y3_train = y_train_clean # 训练模型 model3 = LinearRegression() model3.fit(x3_train, y3_train) # 计算残差 fitted3 = model3.predict(x3_train) res3 = y3_train - fitted3 # 验证集预测与MSE计算(使用清理后的验证集) x3_vali = X_vali_clean[feature3].to_numpy() m3_generation_pred = model3.predict(x3_vali) m3_vali_mse = mse(y_vali_clean, m3_generation_pred) print(m3_vali_mse)
额外注意
原代码存在笔误:res3 = y3_train - fitted2中的fitted2应为fitted3,否则会出现变量未定义报错,上述修正代码已同步修复。
内容的提问来源于stack exchange,提问作者ECHO LV
相关产品推荐
相关产品推荐

