r - 如何根据排名标准从数据框中执行多数投票

标签 r dataframe voting

我有以下数据框:

dat <- structure(list(model_name = c("Random Forest", "XGBoost", "XGBoost-reg", 
"Null model", "Plain LM", "Elastic LM", "LM-pep.charge", "LM-rf.10vip"
), RMSE = c(0.853, 0.886, 0.719, 2.41, 16.6, 0.731, 1.16, 1.03
), MAE = c(0.545, 0.708, 0.589, 1.98, 8.6, 0.588, 0.874, 0.729
), `R^2` = c(0.806, 0.865, 0.915, NA, 0.0645, 0.927, 0.8, 0.822
), ccc = c(0.89, 0.928, 0.951, 0, 0.0685, 0.945, 0.847, 0.901
)), row.names = c(NA, -8L), class = c("tbl_df", "tbl", "data.frame"
))


看起来像这样:

  model_name      RMSE   MAE   `R^2`    ccc
  <chr>          <dbl> <dbl>   <dbl>  <dbl>
1 Random Forest  0.853 0.545  0.806  0.89  
2 XGBoost        0.886 0.708  0.865  0.928 
3 XGBoost-reg    0.719 0.589  0.915  0.951 
4 Null model     2.41  1.98  NA      0     
5 Plain LM      16.6   8.6    0.0645 0.0685
6 Elastic LM     0.731 0.588  0.927  0.945 
7 LM-pep.charge  1.16  0.874  0.8    0.847 
8 LM-rf.10vip    1.03  0.729  0.822  0.901 

它存储8个预测模型的评估指标。 我的目标是选择在大多数评估中始终表现出色的最佳模型。

通过手动评估指标,我通过这种方式确定了表现最佳的模型:

Metrics -> Top 1
-----------------
RMSE -> XGBoost-reg 
MAE -> RF
R^2 -> Elastic LM 
CCC -> XGBoost-reg 

# Therefore, the winner is XGBoost-reg

值得注意的是,RMSE 和 MAE 是误差度量,值越低表示性能越好,而 R^2 和 CCC 是相关性度量,值越高表示性能越好。

我如何使用 R 来做到这一点?

最佳答案

我们可以将数据转换为“long”格式,按“name”进行分组并获取具有最低值“value1”的行(在修改 R^2 的大小写之后) ccc - 乘以-1),然后获取频率count并选择第一行

library(dplyr)
library(tidyr)
dat %>% 
  pivot_longer(cols = -model_name, values_drop_na = TRUE) %>% 
  mutate(value1 = case_when(name %in% c("R^2", "ccc")~ value * -1, 
     TRUE ~ value)) %>% 
  group_by(name) %>% 
  slice_min(n = 1, value1) %>%
  ungroup %>%
  count(model_name, sort = TRUE) %>%
  slice_head(n = 1)

-输出

# A tibble: 1 × 2
  model_name      n
  <chr>       <int>
1 XGBoost-reg     2

或者进行汇总,根据最小/最大索引从数字列中选择 model_name,然后在转换为“长”格式后获取计数

dat %>% 
  summarise(across(where(is.numeric), 
  ~ if(cur_column() %in% c("R^2", "ccc")) 
   model_name[which.max(.x)] else model_name[which.min(.x)])) %>% 
  pivot_longer(cols = everything(), names_to = NULL) %>% 
  count(value, sort = TRUE) %>%
  slice_head(n = 1)

-输出

# A tibble: 1 × 2
  value           n
  <chr>       <int>
1 XGBoost-reg     2

或者使用基础R

names(which.max(table(dat$model_name[max.col(t(replace(dat[-1], 
   is.na(dat[-1]), -Inf) * list(-1, -1, 1, 1)), 'first')])))
[1] "XGBoost-reg"

关于r - 如何根据排名标准从数据框中执行多数投票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75205804/

相关文章:

javascript - 喜欢和不喜欢只有一次 php JS mySQL

keras - 如何在 VotingRegressor 中添加具有 ML 模型的神经网络模型?

r - 在 R 中使用 stringr 查找最后一个子字符串之后的剩余字符串

sql - 如何解决错误 "no applicable method for ' show_query'应用于类 "data.frame"的对象“

r - 分类变量的多重共线性

r - 生成包含数据的单元格周围不带撇号的文本文件

database - 如何构建支持多种对象投票的投票系统?

r - 我在哪里可以找到 SEC XBRL 财务数据的确切链接以便将它们下载到 R 中?

r - 按列值将数据框拆分为两个

python - 最小化python函数中的if语句