我想做一个随机的参数搜索器,但我不知道如何在一个范围内生成一个随机但唯一的索引组合。例如,我有以下参数:
hyperparams = {
'size': [200, 300, 400],
'min_count': [1, 2, 3, 4, 5],
'iter': [50, 100],
'window': [4, 5, 7, 10],
'alpha': [0.025, 0.01],
'min_alpha': [0.025, 1e-4],
}
我想生成它们的唯一组合,并且每个索引都有一个n次的范围。 假设它将产生500种可能的组合。我只想随机抽取100个,但在这100个样本中,任何一个都是重复的。 i、 e
^{pr2}$哪个。。。在
Index 0 is the size.
Index 1 is min_count.
Index 2 is iter.
and so on...
所以以后我用
::
size = hyperparams['size'][1]
min_count = hyperparams['min_count'][3]
iter = hyperparams['iter'][2]
::
::
如果我理解正确的话,你需要一个在一定范围内的不重复的元组序列。在
编辑0:
我相信你最好的办法是先创造所有可能的组合,然后再洗牌:
编辑1:
如果生成所有组合的内存开销太大,您可能需要反复尝试并拒绝非唯一的组合。 一种方法是:
^{pr2}$(这也只能在添加
combination
之前使用列表和检查唯一性来实现,这也会呈现random.shuffle()
多余的内容,但从我的测试来看,这比使用set
s慢得多。)编辑2:
可能最不需要内存的方法是实际洗牌生成器,然后在它们上使用
itertools.product()
。在这显然会牺牲一些随机性。在
编辑3:
继@Divakar方法之后,我又编写了另一个版本,它似乎相对高效,但它很可能会受到
random.sample()
功能的限制。在测试
在请求的输入上,它们执行得相当快,}方法更快),而{}方法是最慢的,
0
方法是最快的(甚至比2
或{3
方法介于两者之间。sklearn.model_selection.ParameterSampler
方法的速度与1
方法相当。在作为补充说明,我将确保您}不能保证跨不同版本的Python排序。在
hyperparams
是一个collections.OrderedDict
,因为{对于稍微大一点的物体,我们开始看到极限:
更大的物体更是如此:
摘要:
方法}如果不遇到溢出问题,它的性能最好,而方法
0
可能不适合内存,方法1
最慢,但可能更健壮,方法{2
(pseudo
)是最快和内存消耗较少的方法,但它会产生一些“较少随机”的组合。在这里有一个基于哈希的方法来生成唯一的组合,而不是生成所有的组合,只生成所需的组合数量-
运行时测试
目前发布的三种方法解决了无法生成所有组合的问题,而且这些方法是真正随机的-@norok2-Edit1,@scnerd,还有一种方法在这篇文章中发布了三组输出长度-
^{pr2}$scikit-learn
需要准确地解决这个问题来实现RandomizedSearchCV,它们有一个独立的类ParameterSampler,您可以使用这个类:这不是索引,但是您可以通过用索引列表替换值列表来轻松解决这个小问题:
^{pr2}$而且according to the documentation,你不会得到任何重复:
快速浏览一下current source code可以看到,当所有参数都以列表形式给出时,它会生成所有可能的选项,并从中随机抽样。在大多数情况下这不是问题,但是如果你有大量的超参数选项,它可能会占用相当多的内存。在
相关问题 更多 >
编程相关推荐