如何在R的tidymodels或caret中实现有序回归/分类?
R语言中tidymodels、caret及其他框架对有序回归/分类的支持情况
一、Caret包的支持
Caret本身没有内置专门的有序回归/分类模型接口,但可以通过自定义适配的方式使用有序回归方法:
- 先将目标变量转换为R中的有序因子(用
ordered()函数指定类别顺序); - 直接调用
MASS::polr、rms::orm这类统计包中的有序回归函数,通过caret的train()函数完成模型训练与交叉验证。
示例代码:
# 转换目标变量为有序因子 data$target <- ordered(data$target, levels = c("极低", "低", "中", "高", "极高")) # 用caret训练polr有序回归模型 polr_caret <- train( target ~ ., data = data, method = "polr", trControl = trainControl(method = "cv"), tuneGrid = data.frame(method = "logistic"), metric = "Accuracy" # 也可选用更贴合有序分类的指标如MAE )
二、Tidymodels生态的支持
Tidymodels通过其组件原生支持有序回归/分类任务:
- 模型定义(parsnip):提供
ordinal_reg()专用接口,可对接polr、orm等引擎,直接针对有序因子目标建模; - 评估(yardstick):内置
ordered_accuracy()等专门适配有序分类的评估指标,避免普通多分类指标丢失顺序信息。
示例代码:
library(tidymodels) # 数据预处理与拆分 data$target <- ordered(data$target, levels = c("极低", "低", "中", "高", "极高")) set.seed(123) data_split <- initial_split(data, prop = 0.8) train_data <- training(data_split) test_data <- testing(data_split) # 定义有序回归模型 polr_spec <- ordinal_reg() %>% set_engine("polr") %>% set_mode("classification") # 构建工作流并训练 polr_wf <- workflow() %>% add_formula(target ~ .) %>% add_model(polr_spec) polr_fit <- fit(polr_wf, data = train_data) # 评估模型性能 predict(polr_fit, test_data) %>% bind_cols(test_data) %>% metrics(truth = target, estimate = .pred_class) %>% filter(.metric == "ordered_accuracy")
三、其他R机器学习框架的支持
- mlr3:内置
TaskOrdinal专门任务类型,支持多种有序回归模型(如polr、orm),并配套有序分类专属评估指标; - randomForestSRC:提供针对有序分类优化的随机森林实现,建模时保留类别顺序信息;
- xgboost:可通过将有序分类转换为排序任务(设置
objective = "rank:pairwise")间接处理,适合树型集成模型场景。
内容的提问来源于stack exchange,提问作者Tripartio
相关产品推荐
相关产品推荐

