为了优化某些机器学习的(甚至是流水线的)超参数,sklearn提出了详尽的"GridsearchCV“和随机的"RandomizedSearchCV”。后者对所提供的分布进行采样并进行测试,最终选择最佳模型(并提供每个暂定模型的结果)。
但假设我用这个随机方法训练了1000个模型。后来,我觉得这还不够精确,我想再多试1000款。我能继续训练吗?也就是,要求更多的样本,尝试更多的模型,而不会失去当前的进展。第二次调用fit()“重新启动”并丢弃以前的超参数组合。
我的情况如下:
pipeline_cv = RandomizedSearchCV(pipeline, distribution, n_iter=1000, n_jobs=-1)
pipeline_cv = pipeline_cv.fit(trainX, trainy)
predictions = pipeline_cv.predict(targetX)然后,后来,我决定1000次迭代不足以覆盖发行版的空间,因此我将执行以下操作
pipeline_cv = pipeline_cv.resume(trainX, trainy, n_iter=1000) # doesn't exist?然后我会让一个模型在2000种超参数组合中进行训练。
我的目标能实现吗?
发布于 2021-04-23 12:53:36
从2017年9月开始,这里有一个Github问题,但它仍然是开放的:
在实际应用中,对某些参数空间进行搜索,然后在相关空间上继续搜索是非常有用的。我们可以提供一个
warm_start参数,以便于将进一步的候选结果积累到cv_results_中(而不需要重新评估已经测试过的参数组合)。
交叉验证中的一个类似的问题也没有得到有效的回答。
因此,答案似乎是no (另外,scikit学习社区还没有感觉到有必要包含这样的可能性)。
但让我们停下来想想,如果这样的东西真的有价值的话.
RandomizedSearchCV本质上是由来自给定分布的随机抽样参数值工作的;例如,使用来自文档的示例
distributions = dict(C=uniform(loc=0, scale=4),
penalty=['l2', 'l1'])根据这种随机抽样和随机数生成(RNG)的基本原理,不能保证这样的随机抽样值不会被随机抽样一次以上,特别是当迭代次数很大时。考虑到RandomizedSearchCV本身也不做任何簿记,因此原则上,在任何一次运行中都可以多次尝试相同的参数组合(同样,只要迭代次数足够大)。
即使在连续分布的情况下(如上面使用的均匀分布),得到精确值的概率可能很小,但常规的情况是两个样本是0.678918和0.678919,不管它们多么接近,它们仍然是不同的,并算作不同的试验。
鉴于以上所述,我看不出一个“温暖的启动”RandomizedSearchCV将有什么实际的用处。RandomizedSearchCV的真正价值在于有可能采样一个通常很大的参数值--如此大,以至于我们认为它对释放简单随机抽样的力量是有用的,让我重复一遍,它本身并不“记住”返回的过去的样本,它很可能返回的样本与过去已经返回的样本(完全或近似)相等,因此任何“温暖的开始”实际上都是无关紧要的。
因此,简单地按顺序(并存储其结果)运行两个(或更多) RandomizedSearchCV进程就可以有效地完成任务,前提是我们为不同的运行使用相同的随机种子(即上面提到的交叉验证线程中的有效建议),而不是。
https://stackoverflow.com/questions/67229587
复制相似问题