tidymodels多分类ROC AUC结果受因子首层级影响的技术咨询
多分类KNN调参中ROC-AUC的计算与调参逻辑问题
在使用鸢尾花(iris)数据集、以ROC-AUC为指标对KNN分类器进行多分类调参时,发现候选模型的AUC结果不稳定,受以下因素影响:
- 初始数据集中
Species列的因子层级顺序(例如"setosa", "virginica", "versicolor") roc_auc函数中预测列的传入顺序(例如roc_auc(truth = Species, .pred_setosa, .pred_virginica,.pred_versicolor))
针对该现象,提出以下技术问题及解答:
问题1:多分类场景下AUC计算是否默认将首个因子层级设为阳性?更适合用one-vs-all的单一AUC值吗?
是的,tidymodels中的roc_auc函数在多分类场景下的默认行为是将因子的第一个层级当作阳性类别,按二分类逻辑计算AUC,这就是结果随因子顺序或预测列顺序波动的原因。
多分类场景下更合理的方案是采用**one-vs-all(一对其余)**策略:对每个类别单独视为阳性,其余所有类别视为阴性,分别计算AUC。这种方式既可以得到每个类别的性能指标,也能汇总成单一指标(比如平均值),结果不受因子顺序影响,还能全面反映模型在所有类别上的表现。
问题2:能否基于one-vs-all的AUC平均值选择候选模型?
完全可以。基于one-vs-all得到的AUC平均值(如macro-average,宏观平均)是多分类模型调参的常用指标,它平等对待每个类别的性能,不会偏向样本量更大的类别。对于鸢尾花这类类别分布均衡的数据集,macro-average AUC是非常合适的选择;如果遇到类别不平衡的数据集,也可以考虑weighted-average(按类别样本量加权)的AUC。
问题3:该逻辑能否在迭代搜索的metric_set中实现?
可以直接在metric_set中配置实现,无需后续手动计算。tidymodels的roc_auc函数支持通过multi_class参数指定多分类计算策略,配合average参数指定汇总方式:
multi_class = "ovr":启用one-vs-rest(即one-vs-all)模式average = "macro":计算宏观平均AUC(默认值),也可指定"weighted"做加权平均
修改后的代码示例
library(tidyverse) library(tidymodels) tidymodels_prefer() df <- iris %>% mutate(Species = factor(Species,levels = c("virginica", "versicolor", "setosa"))) set.seed(2023) splits <- initial_split(df, strata = Species, prop = 4/5) df_train <- training(splits) df_test <- testing(splits) df_rec <- recipe(Species ~ ., data = df_train) knn_model <- nearest_neighbor(neighbors = tune()) %>% set_engine("kknn") %>% set_mode("classification") df_wflow <- workflow() %>% add_model(knn_model) %>% add_recipe(df_rec) set.seed(2023) knn_cv <- df_wflow %>% tune_bayes( # 配置多分类ROC-AUC的计算逻辑 metrics = metric_set(roc_auc(multi_class = "ovr", average = "macro")), resamples = vfold_cv(df_train, strata = "Species", v = 2), control = control_bayes(verbose = TRUE, save_pred = TRUE) ) # 直接收集调参过程中的指标,无需手动分组计算 cv_train_metrics <- knn_cv %>% collect_metrics()
内容的提问来源于stack exchange,提问作者bioblackgeorge
相关产品推荐
相关产品推荐

