如何在tidymodels的yardstick中构建多变量多分类自定义评估指标
yardstick自定义多变量多分类评估指标实现方案
首先明确结论:yardstick完全支持传入除真实值、预测值之外的额外变量构造自定义评估指标,不需要退回caret框架。
核心实现逻辑
yardstick的自定义指标构造函数支持显式或隐式接收truth、estimate之外的任意参数,调用时直接从传入的数据集中提取对应列即可,适配普通评估、模型调优等全流程场景。
具体实现步骤
- 第一步:用
new_class_metric()(面向分类预测指标)或new_prob_metric()(面向概率预测指标)构造自定义指标函数,在函数逻辑中加入赔率等额外变量的计算规则,同时指定指标优化方向:
library(yardstick) library(dplyr) # 示例:3分类足球赛事博彩单场平均收益指标 bet_profit <- new_class_metric( function(truth, estimate, odds_home, odds_draw, odds_away, case_weights = NULL) { # 可选处理案例权重 if (!is.null(case_weights)) warn("本指标暂不支持案例权重") res <- tibble( truth = truth, pred = estimate, odds_h = odds_home, odds_d = odds_draw, odds_a = odds_away ) |> mutate( # 取预测分类对应的赔率 bet_odds = case_when( pred == "home" ~ odds_h, pred == "draw" ~ odds_d, pred == "away" ~ odds_a ), # 单场收益:预测正确赚(赔率-1),错误亏1单位本金 profit = if_else(truth == pred, bet_odds - 1, -1) ) # 返回平均收益作为指标结果 mean(res$profit) }, # 收益类指标需要最大化 direction = "maximize" )
- 第二步:离线评估时直接传入包含所有变量的数据集调用即可:
# 测试集test_df需包含真实结果列`result`、预测分类列`.pred`、三个赔率列 test_df |> bet_profit( truth = result, estimate = .pred, odds_home = h_odds, odds_draw = d_odds, odds_away = a_odds )
- 第三步:模型调参时使用该指标,仅需将其加入
metric_set(),同时在调优函数中设置allow_par = FALSE避免并行传参异常即可:
# 构造指标集 custom_metrics <- metric_set(bet_profit, accuracy) # 调参时传入指标集,关闭并行 tune_res <- tune_grid( object = my_workflow, resamples = my_folds, metrics = custom_metrics, control = control_grid(allow_par = FALSE) )
注意事项
- 多分类场景下仅需保证
truth列为因子类型,分类水平和赔率、预测值的分类对应即可,无需额外适配。 - 如需并行调优,可以将额外变量作为案例权重列的附属属性传入,避免跨进程参数丢失。
内容的提问来源于stack exchange,提问作者nealec
相关产品推荐
相关产品推荐

