如何遍历两个列表的所有组合执行机器学习建模分析
问题描述
我需要先按特定条件筛选数据(根据列值移除行),再用筛选后的数据训练模型。之后重新获取原始数据,用相同或不同条件测试模型,最后绘制ROC曲线和瀑布图。核心需求是遍历两个列表的所有组合完成上述分析,比如:
list1 = list(c('a','b','c'),c('A','B','C')) list2 = list(c('x','y','z'),c('X','Y','Z'))
要依次执行以下组合:
c('a','b','c')+c('x','y','z')c('a','b','c')+c('X','Y','Z')c('A','B','C')+c('x','y','z')c('A','B','C')+c('X','Y','Z')
下面是我当前的代码,现在use_train和use_test内容一致,但后续会调整,分开处理两个列表更方便。目前只用了单循环,所有模型和图表都存在预定义列表里,请问是不是需要用嵌套循环来实现所有组合的遍历?
use_train = list(c('CR','PR','SD'),c('CR','PR','SD','PD')) # 训练模型用的筛选条件 use_test = list(c('CR','PR','SD'), c('CR','PR','SD','PD')) # 测试模型用的筛选条件 xgb_models = auc_test = auc_test_plot = data_list = waterfall = list() for(i in 1:length(use_train)){ data_list[[i]] = create_data(mydata,metadata, recist.use = use_train[[i]], case = 'CR', use_batch = FALSE, seed=40) xgb_models[[i]] = train_ici(data_list[[i]]) #parallelStop() auc_test[[i]] = evaluate_model(xgb_models[[i]], mydata, metadata, recist.use = use_test[[i]], case = 'CR' , use_batch = FALSE, seed = 40) auc_test_plot[[i]] = evaluate_model_plot(xgb_models[[i]], data_list[[i]][[2]]) waterfall[[i]] = waterfall(xgb_models[[i]], metadata, data_list[[i]][[2]], case = 'CR', train.recist = use_train[[i]], test.recist = use_test[[i]]) }
最终需要完成4轮分析:
use_train取c('CR','PR','SD'),use_test取c('CR','PR','SD')use_train取c('CR','PR','SD'),use_test取c('CR','PR','SD','PD')use_train取c('CR','PR','SD','PD'),use_test取c('CR','PR','SD')use_train取c('CR','PR','SD','PD'),use_test取c('CR','PR','SD','PD')
补充数据
以下是create_data函数处理后的数据样本,可直接用于train_ici函数:
structure(list(`totaldata_new[, "RECIST"]` = c("PD", "SD", "PR", "PD", "PD", "PD", "PD", "PR", "SD", "PD", "SD", "PD", "PD", "PD", "PR", "CR", "PD", "PR", "SD", "SD", "SD", "PD", "SD", "PR", "PD" ), Gender = c("male", "female", "female", "female", "male", "female", "female", "male", "male", "male", "female", "male", "female", "female", "male", "female", "female", "male", "male", "male", "female", "male", "female", "male", "male"), treatment = c("anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1" ), Cancer_Type = c("Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma"), `CD4-T-cells` = c(-0.0741098696855045, -0.094401270881699, 0.0410284948786532, -0.163302950330185, -0.0942478217207681, -0.167314411991775, -0.118272811489486, -0.0366277340916379, -0.0349008907108641, -0.167823357941815, -0.0809646843667242, -0.140727850456348, -0.148668434567449, -0.0726825919321525, -0.062499826731091, -0.0861178015030313, -0.117687306656149, -0.141342090175904, -0.206661192280272, -0.15593285099477, -0.0897617831679252, -0.0627645386986058, -0.136416087222329, -0.100351419040291, -0.167041995646525)), row.names = c("Pt1", "Pt10", "Pt101", "Pt103", "Pt106", "Pt11", "Pt17", "Pt18", "Pt2", "Pt24", "Pt26", "Pt27", "Pt28", "Pt29", "Pt3", "Pt30", "Pt31", "Pt34", "Pt36", "Pt37", "Pt38", "Pt39", "Pt4", "Pt44", "Pt46"), class = "data.frame")
解决方案
是的,必须用嵌套循环才能覆盖use_train和use_test的所有组合。单循环只能对应两个列表索引相同的情况,没法实现交叉组合。
修改后的代码如下:
use_train = list(c('CR','PR','SD'),c('CR','PR','SD','PD')) use_test = list(c('CR','PR','SD'), c('CR','PR','SD','PD')) # 初始化存储列表,用命名索引更方便后续查找 xgb_models = list() auc_test = list() auc_test_plot = list() data_list = list() waterfall = list() # 嵌套循环遍历所有组合 for (i in 1:length(use_train)) { for (j in 1:length(use_test)) { # 生成唯一的组合名称,方便后续索引 combo_name = paste0("train_", paste(use_train[[i]], collapse = "_"), "_test_", paste(use_test[[j]], collapse = "_")) # 1. 创建训练数据 data_list[[combo_name]] = create_data(mydata, metadata, recist.use = use_train[[i]], case = 'CR', use_batch = FALSE, seed = 40) # 2. 训练模型 xgb_models[[combo_name]] = train_ici(data_list[[combo_name]]) # 3. 评估模型 auc_test[[combo_name]] = evaluate_model(xgb_models[[combo_name]], mydata, metadata, recist.use = use_test[[j]], case = 'CR', use_batch = FALSE, seed = 40) # 4. 绘制ROC曲线 auc_test_plot[[combo_name]] = evaluate_model_plot(xgb_models[[combo_name]], data_list[[combo_name]][[2]]) # 5. 绘制瀑布图 waterfall[[combo_name]] = waterfall(xgb_models[[combo_name]], metadata, data_list[[combo_name]][[2]], case = 'CR', train.recist = use_train[[i]], test.recist = use_test[[j]]) } }
代码说明
- 嵌套循环:外层循环遍历
use_train的每个条件,内层循环遍历use_test的每个条件,确保所有4种组合都被执行。 - 命名索引:用
combo_name生成每个组合的唯一标识(比如train_CR_PR_SD_test_CR_PR_SD),后续查看结果时能快速对应到具体的训练/测试条件,比数字索引更直观。 - 逻辑保留:完全保留了你原本的分析流程,只是把单循环改成嵌套循环,同时优化了结果存储的可读性。
这样运行后,就能自动完成你需要的4轮分析,每个组合的模型、评估结果、图表都会存在对应的列表中,方便后续查看和对比。
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

