生成无重复随机参数序列用于超参数调优的实现求助
解决超参数调优中避免重复参数序列的方案
核心思路
用集合存储已生成的参数序列(集合的成员查询时间复杂度为O(1),效率远高于列表),每次生成新序列后先校验是否已存在:
- 若不存在,就使用该序列并加入集合;
- 若存在,重新生成直到得到新序列;
- 额外添加保护逻辑,当所有可能的参数组合都已生成时,提前终止循环,避免死循环。
修改后的代码示例
import random num_evals = 2500 parameters = { 'n_parameter_1': range(2, 100), 'n_parameter_2': range(1, 20), 'n_parameter_3': range(2, 150), } # 计算所有可能的参数组合总数,避免死循环 total_possible = len(parameters['n_parameter_1']) * len(parameters['n_parameter_2']) * len(parameters['n_parameter_3']) if num_evals > total_possible: print(f"警告:请求的评估次数{num_evals}超过了所有可能的参数组合数{total_possible},将调整为{total_possible}次") num_evals = total_possible # 存储已使用的参数序列,用元组(不可变类型)作为集合元素 used_params = set() for i in range(num_evals): while True: # 生成一组参数 param_1 = random.choice(parameters['n_parameter_1']) param_2 = random.choice(parameters['n_parameter_2']) param_3 = random.choice(parameters['n_parameter_3']) # 把参数转成元组,因为列表不能存入集合 param_tuple = (param_1, param_2, param_3) if param_tuple not in used_params: used_params.add(param_tuple) # 这里替换为你的业务逻辑:调用目标函数、保存结果等 print(f"第{i+1}次评估使用参数:n_parameter_1={param_1}, n_parameter_2={param_2}, n_parameter_3={param_3}") break # 可选:持久化已用参数到文件,跨运行会话避免重复 # import pickle # with open('used_params.pkl', 'wb') as f: # pickle.dump(used_params, f) # 下次运行时加载: # with open('used_params.pkl', 'rb') as f: # used_params = pickle.load(f)
关键细节说明
- 使用元组作为集合元素:列表是可变类型无法被哈希,元组不可变,符合集合元素的要求。
- 提前计算总组合数:防止请求的评估次数超过所有可能的组合,导致程序无限循环。
- 跨会话去重:如果需要多次运行脚本都避免重复,可以用
pickle将已用参数集合保存到文件,下次启动时加载。
内容的提问来源于stack exchange,提问作者Edd
相关产品推荐
相关产品推荐

