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

R语言中循环提取Samme.R算法混淆矩阵性能指标求助

解决Samme.R循环运行后保存多分类性能指标的问题

你的代码核心问题在于手动计算F1的逻辑有误,且没有结构化存储每次迭代的指标,导致结果混乱。以下是修正后的方案:

问题分析

  1. confusionMatrix返回的是列表对象,直接用ncol(cm)会获取列表长度而非混淆矩阵列数,逻辑错误。
  2. 手动计算F1的公式不准确,多分类下每个类别的F1值confusionMatrix已经在cm$byClass中给出,无需重复计算。
  3. 用扁平向量存储所有结果,无法区分迭代次数和对应类别,后续分析困难。

修正代码

提前创建结构化数据框存储结果,直接调用内置指标,清晰记录每次迭代的各项性能:

# 初始化结果数据框,预定义列结构
results <- data.frame(
  iteration = integer(),
  class = character(),
  f1_score = numeric(),
  sensitivity = numeric(),
  specificity = numeric(),
  precision = numeric(),
  stringsAsFactors = FALSE
)

# 循环运行模型,这里先测试10次,后续可改为100次
for (i in 1:10) {
  # 训练Samme.R模型
  Sr_model1 <- booster(
    x_train = train[, 1:3],
    y_train = train$P,
    classifier = "rpart",
    method = "real",
    x_test = test[, 1:3],
    y_test = test$P, # 确保测试集标签正确,若标签在第4列则改为test[,4]
    weighted_bootstrap = FALSE,
    max_iter = 30,
    lambda = 0.7
  )
  
  # 生成测试集预测结果
  Sr_p1 <- predict(object = Sr_model1, newdata = test, type = "pred")
  
  # 计算混淆矩阵及所有性能指标
  cm <- confusionMatrix(Sr_p1, test$P, mode = "everything")
  
  # 提取每个类别的详细指标(cm$byClass是每行对应一个类别的数据框)
  class_metrics <- cm$byClass
  # 添加当前迭代次数
  class_metrics$iteration <- i
  # 将类别名称从行名转为列
  class_metrics$class <- rownames(class_metrics)
  
  # 合并当前迭代的指标到总结果
  results <- rbind(results, class_metrics[, c("iteration", "class", "F1", "Sensitivity", "Specificity", "Precision")])
}

# 可选:将结果保存到CSV文件
write.csv(results, "samme_r_multiclass_metrics.csv", row.names = FALSE)

关键说明

  • cm$byClass包含了多分类场景下每个类别的F1、灵敏度、特异度、精确率等所有常用指标,直接调用即可避免手动计算错误。
  • 结果数据框results中,每行对应一次迭代+一个类别的性能数据,方便后续统计(比如计算100次迭代的均值、标准差,对比不同类别的稳定性)。
  • 若需要更多指标,可查看cm$byClass的列名,按需添加到结果数据框中。

内容的提问来源于stack exchange,提问作者deniz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:12:57