如何在tidymodels框架中利用Youden index获取ML性能指标?
在tidymodels框架中利用Youden Index获取机器学习性能指标
Youden Index(尤登指数)的计算逻辑是灵敏度(Sensitivity) + 特异度(Specificity) - 1,它用于定位二分类模型中平衡两类误差的最优阈值,同时也是评估模型性能的有效指标。tidymodels生态的yardstick包没有内置该指标,但可通过ROC曲线数据推导计算,也能自定义指标集成到标准评估流程中。
一、基于ROC曲线计算最大Youden Index
假设你已完成模型训练,得到测试集的预测概率(二分类场景),操作步骤如下:
- 加载必要工具包
library(tidymodels) library(yardstick)
- 准备预测结果数据
模拟一组测试集的真实标签与正类预测概率:
test_pred <- tibble( # 真实标签,将正类设为因子的第一个水平 truth = factor(c("positive", "negative", "positive", "positive", "negative", "negative"), levels = c("positive", "negative")), # 正类的预测概率列 .pred_positive = c(0.82, 0.31, 0.65, 0.90, 0.24, 0.43) )
- 生成ROC数据并计算最优尤登指数
通过roc_curve()生成不同阈值下的灵敏度、特异度,推导尤登指数后筛选最大值对应的记录:
# 生成全量阈值的ROC数据 roc_results <- roc_curve(test_pred, truth, .pred_positive) # 计算尤登指数并提取最优结果 best_youden <- roc_results %>% mutate(youden_index = sensitivity + specificity - 1) %>% arrange(desc(youden_index)) %>% slice(1) # 输出结果:包含最优阈值、尤登指数、灵敏度、特异度 print(best_youden)
二、自定义Youden Index指标集成到tidymodels评估流程
若要将尤登指数作为常规指标加入metrics()评估,可定义兼容yardstick的指标函数:
# 定义向量版计算函数(适配yardstick接口) youden_index_vec <- function(truth, estimate, ...) { roc_curve_vec(truth, estimate, ...) %>% mutate(youden = sensitivity + specificity - 1) %>% pull(youden) %>% max() } # 注册为正式的yardstick指标 youden_index <- new_metric( name = "youden", direction = "maximize", # 尤登指数越大性能越好 type = "prob", # 属于概率型指标 vec_fn = youden_index_vec ) # 使用自定义指标评估模型 test_pred %>% metrics(truth, .pred_positive, youden = youden_index(truth, .pred_positive))
注意事项
- 仅适用于二分类任务,多分类场景需拆分为一对一的二分类子任务分别计算
- 确保真实标签
truth为因子类型,正类位置需与roc_curve()的event_level参数匹配(默认正类为第一个水平) - 自定义指标需遵循
yardstick接口规范,保证与tidymodels的训练、评估流程兼容
内容的提问来源于stack exchange,提问作者inprogress123
相关产品推荐
相关产品推荐

