Snakemake规则中如何为shell命令传入不同整数参数实现BDT超参数调优
报错原因
你当前写法报错的核心是nestimators[i] for i in range(2)是Python生成器表达式,直接传入str.format()时不会自动展开为参数值,只会打印生成器对象的内存地址,也就是你看到的报错内容。如果要实现多超参数并行训练,需要配合Snakemake的通配符、任务展开功能修改流程。
可运行的修改方案
1. 修改后的Snakefile完整代码
user = '/home/.../BDT/' # 可在此处随意添加更多要测试的nestimators取值 nestimators = [1, 2, 10, 50, 100] rule all: input: user + 'AUC_score.pdf' # 单组超参数的训练规则,通过通配符匹配不同参数值 rule train_single: output: temp(user + 'auc_result_{n_est}.csv') shell: 'python bdt.py --nestimators {wildcards.n_est} --output {output}' # 合并所有单组训练结果的规则 rule merge_results: input: expand(user + 'auc_result_{n_est}.csv', n_est=nestimators) output: user + 'AUC_score.csv' shell: 'python merge_csv.py --inputs {input} --output {output}' # 结果可视化规则 rule plotting: input: user + 'AUC_score.csv' output: user + 'AUC_score.pdf' shell: 'python opti.py'
2. 补充配套脚本
- 新增
merge_csv.py,用于合并多组训练结果为总表:
import pandas as pd import argparse parser = argparse.ArgumentParser() parser.add_argument('--inputs', nargs='+') parser.add_argument('--output') args = parser.parse_args() all_result = [] for single_file in args.inputs: df = pd.read_csv(single_file) all_result.append(df) pd.concat(all_result).to_csv(args.output, index=False)
- 修改你的
bdt.py,新增参数解析逻辑,支持接收整数类型的nestimators和结果输出路径:
import argparse import pandas as pd parser = argparse.ArgumentParser() parser.add_argument('--nestimators', type=int) parser.add_argument('--output', type=str) args = parser.parse_args() # 此处保留你原有BDT训练、计算AUC得分的逻辑 # auc = 模型计算得到的AUC值 pd.DataFrame({ 'nestimators': [args.nestimators], 'auc_score': [auc] }).to_csv(args.output, index=False)
3. 并行运行方法
执行命令snake make --cores 4即可,--cores后的数字为同时运行的训练任务数,Snakemake会自动并行调度所有超参数的训练任务,全部完成后自动合并结果、生成可视化pdf。
内容的提问来源于stack exchange,提问作者jmai
相关产品推荐
相关产品推荐

