You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:15:00