如何高效测试R语言lm()模型的指数范围以优化住房价格预测精度
R语言房价预测参数寻优效率优化方案
核心优化思路
你当前的三重循环暴力遍历方案重复计算量过高,可通过以下4个方向优化,在不删减变量的前提下把运行效率提升至少100倍:
- 缩小参数搜索粒度:你当前的指数步长是0.001,完全可以先以0.1的步长粗筛最优区间,再针对最优区间做细粒度搜索,搜索次数直接降低两个数量级
- 替换单变量遍历为内置优化函数:你本身用的是坐标下降的寻优逻辑(固定其他参数优化单个参数),直接用R内置的
optimize()函数替代手动循环遍历,函数会自动基于黄金分割法找单变量最小值,单参数寻优仅需几十次拟合就能得到比遍历1万次更精准的结果 - 封装重复逻辑为函数:把模型拟合、评估指标计算的逻辑封装成独立函数,减少冗余代码,同时避免重复生成冗余数据集列
- 去掉无效计算:你当前每次拟合都给全量数据集新增4个全局统计列,完全没必要,直接计算统计量赋值即可,能节省大量内存开销
优化后示例代码
library(dplyr) library(modelr) # 封装评估函数:输入指数参数向量,返回中位数误差 eval_exponents <- function(exp_params, data) { # exp_params长度为8,对应原来的8个指数参数 mod <- lm( log(SALE_PRC) ~ I(TOT_LVG_AREA^exp_params[1]) + I(LND_SQFOOT^exp_params[2]) + I(RAIL_DIST^exp_params[3]) + I(OCEAN_DIST^exp_params[4]) + I(CNTR_DIST^exp_params[5]) + I(HWY_DIST^exp_params[6]) + I(structure_quality^exp_params[7]) + SUBCNTR_DI + SPEC_FEAT_VAL + I(exp(exp_params[8] * SPECIAL_RATIO)) + age, data = data ) pred <- exp(predict(mod, data)) abs_diff_pct <- abs(pred - data$SALE_PRC) / data$SALE_PRC # 返回要优化的目标:中位数误差 return(median(abs_diff_pct)) } # 初始参数:所有指数为1,对应原来的coef_1初始值6000 best_exps <- rep(1, 8) # 指数搜索范围,对应原来的-4到5,可根据需求调整 exp_range <- c(-4, 5) # 迭代轮次,对应原来的外层循环10次 n_iter <- 10 for (iter in 1:n_iter) { for (param_idx in 1:8) { # 固定其他7个参数,仅优化当前param_idx对应的指数 opt_result <- optimize( f = function(x) { current_exps <- best_exps current_exps[param_idx] <- x eval_exponents(current_exps, kaggle_transform_final) }, interval = exp_range, maximum = FALSE # 找最小值 ) # 更新最优参数 best_exps[param_idx] <- opt_result$minimum cat("迭代轮次", iter, ",优化第", param_idx, "个参数,当前最优指数:", best_exps[param_idx], "\n") } cat("第", iter, "轮迭代完成,当前最优参数:", best_exps, "\n") }
可选补充优化
如果运行速度还是不符合预期,可以再做两个调整:
- 如果数据集过大,每次拟合可以抽10%-30%的样本做参数搜索,最终用全量数据和最优参数拟合最终模型,误差不会有明显差异
- 可以用
speedglm包的speedlm()函数替代基础的lm()函数,大数据集下拟合速度能提升3-5倍
内容的提问来源于stack exchange,提问作者Joshua Staley
相关产品推荐
相关产品推荐

