在R tidymodels中设置yardstick默认事件水平无效,是Bug还是操作有误?
问题翻译与解答
用户问题(中文翻译)
我想让yardstick默认使用第二分类作为逻辑回归模型的评估水平。我知道可以在单个统计函数里指定event_level = "second",但更希望通过全局选项来设置这个参数,不过尝试后发现没生效。
library(tidymodels) data("two_class_example") sens(two_class_example, truth, predicted, event_level = "second") #> # A tibble: 1 × 3 #> .metric .estimator .estimate #> <chr> <chr> <dbl> #> 1 sens binary 0.793 options(yardstick.event_level = "second") sens(two_class_example, truth, predicted) #> # A tibble: 1 × 3 #> .metric .estimator .estimate #> <chr> <chr> <dbl> #> 1 sens binary 0.880
创建于2023-07-17,使用reprex v2.0.2
请问这是Bug还是我操作有误?
问题解答
这不是Bug,是对yardstick的全局选项支持理解有误——yardstick并没有实现通过全局选项yardstick.event_level来设置默认event_level的功能。
你在单个函数调用里指定event_level = "second"能生效,是因为该参数是sens()等评估函数的显式参数;但yardstick的核心代码并没有读取options(yardstick.event_level = ...)这个全局设置的逻辑,所以全局选项不会对函数默认行为产生影响。
替代解决方案
如果你不想每次调用都手动指定参数,可以用以下两种方式实现类似全局默认的效果:
1. 使用purrr::partial包装函数
library(purrr) # 创建默认event_level为"second"的sens函数 sens_second <- partial(sens, event_level = "second") # 直接调用新函数即可 sens_second(two_class_example, truth, predicted) #> # A tibble: 1 × 3 #> .metric .estimator .estimate #> <chr> <chr> <dbl> #> 1 sens binary 0.793
2. 自定义通用包装函数
如果需要多个评估函数都应用这个默认值,可以写一个通用包装器:
set_event_level_default <- function(fn) { function(...) { fn(..., event_level = "second") } } # 给多个函数设置默认 sens_second <- set_event_level_default(sens) spec_second <- set_event_level_default(spec)
后续调用sens_second()或spec_second()时,就会自动使用event_level = "second"作为默认参数。
内容的提问来源于stack exchange,提问作者itsMeInMiami
相关产品推荐
相关产品推荐

