使用caret+Ranger做回归时设置quantreg=True后预测分位数报错
问题解决:Caret结合Ranger分位数回归预测报错
报错原因
你遇到的type must be either "raw" or "prob"错误,核心原因是Caret的predict.train()函数不支持type="quantile"参数。虽然训练时通过quantreg = TRUE开启了Ranger的分位数回归功能,但Caret的预测接口仅封装了"raw"(回归预测值)和"prob"(分类概率)两种类型,没有适配Ranger的分位数预测逻辑。
解决方案
直接调用Ranger原生的predict()方法,绕过Caret的预测接口。具体操作是从Caret训练好的模型中提取底层的Ranger模型对象(rf_fit$finalModel),再用它执行分位数预测。
修改后的预测代码
# 提取Caret训练好的底层Ranger模型 ranger_model <- rf_fit$finalModel # 准备测试集特征(需与训练时的X_train列完全一致) X_test <- df_testing[, 2:4] # 用Ranger原生predict函数做分位数预测 qtile <- c(0.05, 0.50, 0.95) quantile_preds <- predict(ranger_model, data = X_test, type = "quantile", quantiles = qtile, na.rm = TRUE) # 查看分位数预测结果 quantile_preds$predictions
完整可运行代码
将修改后的预测部分替换原代码,完整代码如下:
library(tidyverse) library(ranger) library(caret) # 加载数据 data(iris) # 设置数据集拆分比例 split <- 0.8 # 划分训练集和测试集 set.seed(20) trainIndex <- createDataPartition(c(iris["Sepal.Length"], recursive=T), p=split, list = F) df_training <- iris[trainIndex,1:ncol(iris)] y_train = as.numeric(unlist(df_training['Sepal.Length'])) X_train = df_training[2:4] df_testing <- iris[-trainIndex,1:ncol(iris)] # 设置Caret训练控制参数和调优网格 ctrl<- trainControl(method="repeatedcv", repeats = 3, savePredictions = TRUE) tgrid <- expand.grid(mtry = length(X_train), splitrule = "extratrees", min.node.size = c(1,2,3)) # 训练带分位数回归的Ranger模型 rf_fit <- train(X_train, y_train, method="ranger", seed = 20, metric="RMSE", tuneGrid=tgrid, trControl = ctrl, num.trees=500, quantreg = TRUE, num.threads = 12, importance = "permutation") # --------------- 修改后的分位数预测部分 --------------- ranger_model <- rf_fit$finalModel X_test <- df_testing[, 2:4] qtile=c( 0.05, 0.50, 0.95) quantile_preds <- predict(ranger_model, data = X_test, type = "quantile", quantiles = qtile, na.rm=TRUE) # 输出预测结果 print(quantile_preds$predictions)
额外说明
- 测试集特征列必须和训练集
X_train的列完全匹配,否则会出现特征不匹配的错误。 - Ranger的分位数预测结果存储在返回对象的
predictions字段中,是一个每行对应一个测试样本、每列对应一个分位数的矩阵。
内容的提问来源于stack exchange,提问作者Grace
相关产品推荐
相关产品推荐

