繁体   English   中英

从保存在 dplyr 列表列中的混淆矩阵中提取内容

[英]extract contents from confusionMatrix saved in a list column in dplyr

如下面的代码所示,在交叉验证后,我试图为每个折叠提取模型指标。 我保存了重采样中的所有预测,按折叠对数据进行分组,计算每组的混淆矩阵,并将混淆矩阵对象保存为列表列cm 现在我需要从列中保存的对象中提取指标信息,如精度等。 我的示例代码如下所示。

library(caret)
iris2 = iris %>% 
    filter(Species != 'setosa') %>%
    mutate(Species = factor(Species))

train.control <- trainControl(method="cv", 
                           number=5,
                           summaryFunction = twoClassSummary,
                           classProbs = TRUE,
                           savePredictions='all')
rf = train(Species~., data=iris2,  method = 'rf',
           metric = 'ROC', trControl=train.control)
rf$pred %>% group_by(Resample) %>%
    do(cm = confusionMatrix(.$pred, .$obs),
       Accuracy = map(cm, ~.x$byClass['Precision'])) 

我收到错误消息:

Error in .x$byClass : $ operator is invalid for atomic vectors

我不明白为什么它不起作用。 我的问题是如何修改最后一行以使其工作? 谢谢

您可以使用ungroup() ,然后通过访问您使用unlist()提取元素本身的每个折叠的list的特定部分来简单地mutate Accuracy

rf$pred %>% 
  group_by(Resample) %>%
  do(cm = confusionMatrix(.$pred, .$obs)) %>% 
  ungroup() %>% 
  mutate(neg_pred_value = map(cm, ~ .x[["byClass"]][["Neg Pred Value"]]) %>% unlist(),
         accuracy = map(cm, ~ .x[["byClass"]][["Precision"]]) %>% unlist())

使用上面的代码,我们得到以下输出作为tibble

# A tibble: 5 x 4
  Resample                    cm neg_pred_value  accuracy
     <chr>                <list>          <dbl>     <dbl>
1    Fold1 <S3: confusionMatrix>      0.9090909 1.0000000
2    Fold2 <S3: confusionMatrix>      1.0000000 1.0000000
3    Fold3 <S3: confusionMatrix>      1.0000000 1.0000000
4    Fold4 <S3: confusionMatrix>      0.8181818 0.8888889
5    Fold5 <S3: confusionMatrix>      1.0000000 0.9090909

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM