You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:55:07