将分位数回归适配到caret包时报错,求问题排查与解决
错误原因
- 未正确提取参数:
caret将网格搜索的参数传入quantregFit函数的param参数中,代码中直接使用tau=tau会导致R无法找到tau变量,触发未定义错误。 - 逻辑判断错误:
if (param$tau)将数值型的分位数参数作为逻辑条件使用,完全不符合业务逻辑,会导致拟合分支错误。
修复后的完整代码
library(quantreg) quantregression <- list(type='Regression', library='quantreg', loop=NULL) # 定义参数信息 param <- data.frame(parameter = c("tau"), class = c("numeric"), label = c("tau")) quantregression$parameters <- param # 定义网格搜索参数范围 quantGrid <- function(x, y, len=NULL, search="grid"){ if(search == "grid"){ out <- expand.grid(tau=c(.05, .25, .5, .75, .95)) } out } quantregression$grid <- quantGrid # 修复拟合函数 quantregFit <- function(x, y, wts, param, lev, last, classProbs, ...){ dat <- if(is.data.frame(x)) x else as.data.frame(x) dat$.outcome <- y # 从param中提取tau参数,移除错误的逻辑判断 if(!is.null(wts)){ out <- quantreg::rq(.outcome ~ ., data = dat, weights = wts, tau = param$tau, ...) } else { out <- quantreg::rq(.outcome ~ ., data = dat, tau = param$tau, ...) } out } quantregression$fit <- quantregFit # 预测函数保持不变 quantPred <- function(modelFit, newdata, preProc=NULL, submodels=NULL){ if(!is.data.frame(newdata)) newdata <- as.data.frame(newdata) quantreg::predict.rq(modelFit, newdata) } quantregression$predict <- quantPred # 分位数回归不需要概率预测,返回NULL quantProb <- function(){ return(NULL) } quantregression$prob <- quantProb
验证示例
使用mtcars数据集测试交叉验证:
library(caret) set.seed(123) # 固定随机种子保证可复现 # 定义5折交叉验证控制 train_ctrl <- trainControl(method = "cv", number = 5) # 训练分位数回归模型 qr_cv_result <- train(mpg ~ ., data = mtcars, method = quantregression, trControl = train_ctrl) # 查看交叉验证结果 print(qr_cv_result)
内容的提问来源于stack exchange,提问作者mesist
相关产品推荐
相关产品推荐

