继续随机搜索CV拟合

2024-06-14 15:34:18 发布

您现在位置:Python中文网/ 问答频道 /正文

为了调整一些机器学习(甚至管道)的超参数,sklearn提出了穷举的“GridsearchCV”和随机化的“RandomizedSearchCV”。后者对提供的分布进行采样并进行测试,最终选择最佳模型(并提供每个试验的结果)

但假设我用这种随机方法训练了1000个模型。后来,我觉得这不够精确,想再试试1000多种型号。我可以恢复培训吗?Aka,要求在不损失当前进度的情况下进行更多的采样和尝试更多的模型。第二次调用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个超参数组合中训练

我的目标可以实现吗


Tags: 模型机器参数管道pipelinetrainy情况sklearn
1条回答
网友
1楼 · 发布于 2024-06-14 15:34:18

从2017年9月起,该网站上有一个Github issue,但它仍然开放:

In practice it is useful to search over some parameter space and then continue the search over some related space. We could provide a warm_start parameter to make it easy to accumulate results for further candidates into cv_results_ (without reevaluating parameter combinations that have already tested).

Cross Validated中的一个类似问题实际上也没有得到回答

因此,答案似乎是不(另外,scikit学习社区还没有感觉到有必要包括这种可能性)

但是让我们停下来想一想这样的东西是否真的有价值


RandomizedSearchCV基本上通过从给定分布中随机采样参数值来工作;e、 例如,使用docs中的示例:

distributions = dict(C=uniform(loc=0, scale=4),
                     penalty=['l2', 'l1'])

根据此类随机抽样和随机数生成(RNG)的基本原理,通常不存在任何保证此类随机抽样值将被随机抽样一次以上,尤其是在迭代次数较大的情况下。考虑到RandomizedSearchCV本身也不做任何簿记,因此原则上,在任何一次运行中,相同的参数组合可能会尝试多次(同样,前提是迭代次数足够大)

即使在连续分布的情况下(如上面使用的均匀分布),获得已采样的准确值的概率可能非常小,也有两个样本类似0.6789180.678919的常规情况,无论多么接近,它们仍然不同,并算作不同的试验

鉴于上述情况,我看不出随机搜索CV的“热启动”有什么实际用途。随机化SRACCHCV的实际价值在于对参数值通常较大的面积进行抽样的可能性如此之大以至于我们认为有助于释放简单随机抽样的能力,让我重复一下,它本身并不“记得”过去的样本返回,并且它可以很好地返回(确切或近似)的样本。等于过去已经归还的,因此任何“温暖的开始”实际上都无关紧要

因此,简单地按顺序运行两个(或更多)随机搜索CV进程(并存储其结果)就可以有效地完成这项工作,前提是我们不为不同的运行使用相同的随机种子(即上面提到的Cross Validated线程中有效地建议的)

相关问题 更多 >