如何将嵌套重采样模型应用于置换数据集?
问题
我已经通过以下代码生成了嵌套重采样对象:
data<-read.csv("Data.csv", row.names=1) data$factor<-as.factor(data$factor) set.seed(123, "L'Ecuyer") task = as_task_classif(data, target = "factor") learner = lrn("classif.ranger", importance = "impurity", num.trees=10000) measure = msr("classif.fbeta", beta=1) terminator = trm("none") resampling_inner = rsmp("repeated_cv", folds = 10, repeats = 10) at = AutoFSelector$new( learner = learner, resampling = resampling_inner, measure = measure, terminator = terminator, fselect = fs("rfe", n_features = 1, feature_fraction = 0.5, recursive = FALSE), store_models = TRUE) resampling_outer = rsmp("repeated_cv", folds = 10, repeats = 10) rr = resample(task, at, resampling_outer)
我有一个factor变量被置换/随机化的.csv文件,希望利用上述嵌套重采样范式下的模型对该数据集进行预测,以此对比真实数据集与置换后数据集的模型性能差异。在生物研究场景中样本量通常较小,仅凭随机概率的预测准确率可能达到70%甚至更高,我想通过这种方式验证模型的实际预测性能。
请问如何利用已有的重采样对象rr实现这一操作?
解决方案
要利用已有的嵌套重采样对象rr评估置换后数据集的性能,可按以下步骤操作:
1. 加载并预处理置换后的数据集
首先读取置换后的数据集,转换为与原任务一致的分类任务对象:
# 加载置换后的数据集 permuted_data <- read.csv("Permuted_Data.csv", row.names=1) permuted_data$factor <- as.factor(permuted_data$factor) # 创建对应的分类任务,确保目标变量与原任务一致 permuted_task <- as_task_classif(permuted_data, target = "factor")
2. 提取嵌套重采样中的最优模型
由于你在AutoFSelector中设置了store_models = TRUE,可以从rr中提取每个外层折训练得到的带特征选择结果的最优模型:
# 提取所有外层折的AutoFSelector结果 fselect_results <- rr$learners # 定义预测函数:用单个外层折的最优模型预测新数据集 predict_with_fold_model <- function(fselect_obj, new_task) { # 获取该折的最优训练模型 best_learner <- fselect_obj$model$learner # 生成预测结果 return(best_learner$predict(new_task)) }
3. 批量预测并计算置换后数据集的性能
遍历所有外层折的模型,对置换后数据集进行预测,再统计整体性能:
# 用每个外层折的模型预测置换后数据集 permuted_predictions <- lapply(fselect_results, predict_with_fold_model, new_task = permuted_task) # 计算每个预测结果的F1值,再统计均值和标准差 permuted_performance <- sapply(permuted_predictions, function(pred) { pred$score(measure) }) cat("置换后数据集的平均F1值:", mean(permuted_performance), "\n") cat("置换后数据集的F1值标准差:", sd(permuted_performance), "\n")
4. 对比真实与置换数据集的性能
提取原嵌套重采样的性能结果,与置换后的结果进行对比:
# 获取原数据集的外层重采样性能 original_performance <- rr$score(measure)$classif.fbeta # 输出原数据集的性能统计 cat("原数据集的平均F1值:", mean(original_performance), "\n") cat("原数据集的F1值标准差:", sd(original_performance), "\n") # 可视化对比(可选) boxplot( list(原数据集=original_performance, 置换后数据集=permuted_performance), main="真实与置换数据集的模型性能对比", ylab="F1值" )
注意事项
- 每个外层折都训练了独立的特征选择和模型,因此需要用所有外层折的模型分别预测置换后数据,再取平均性能,结果更具统计可靠性。
- 确保置换后的数据集特征列与原数据集完全一致,否则会导致预测失败。
内容的提问来源于stack exchange,提问作者abadgerw123
相关产品推荐
相关产品推荐

