R语言中循环提取Samme.R算法混淆矩阵性能指标求助
解决Samme.R循环运行后保存多分类性能指标的问题
你的代码核心问题在于手动计算F1的逻辑有误,且没有结构化存储每次迭代的指标,导致结果混乱。以下是修正后的方案:
问题分析
confusionMatrix返回的是列表对象,直接用ncol(cm)会获取列表长度而非混淆矩阵列数,逻辑错误。- 手动计算F1的公式不准确,多分类下每个类别的F1值
confusionMatrix已经在cm$byClass中给出,无需重复计算。 - 用扁平向量存储所有结果,无法区分迭代次数和对应类别,后续分析困难。
修正代码
提前创建结构化数据框存储结果,直接调用内置指标,清晰记录每次迭代的各项性能:
# 初始化结果数据框,预定义列结构 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
相关产品推荐
相关产品推荐

