You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在sklearn的RandomizedSearchCV中定义对数均匀分布learning_rate参数

在RandomizedSearchCV中实现对数均匀分布参数采样

刚好我平时做超参数调优时也经常在scikit-optimize和sklearn的搜索工具之间切换,这个问题我很熟悉。要实现和你在scikit-optimize里Real(10**-5, 10**0, "log-uniform", name='learning_rate')完全一致的对数均匀采样,有几种简洁可靠的方式:

方法一:使用scipy的loguniform分布(推荐)

sklearn的RandomizedSearchCV原生支持scipy的统计分布作为参数采样源,而scipy.stats.loguniform正好对应你需要的对数均匀分布。

首先导入依赖:

from scipy.stats import loguniform

然后直接在参数字典中定义:

params_randomSearch = {
    "learning_rate": loguniform(1e-5, 1.0),  # 对应10^-5到10^0的对数均匀分布
    "max_depth": range(1, 21),  # 匹配你之前的Integer(1,20)配置
    "min_samples_leaf": ...,  # 你的其他参数配置
    # 其他参数...
}

方法二:兼容旧版scipy的reciprocal分布

如果你的scipy版本比较旧(比如低于1.7.0),loguniform可能还没被引入,这时候可以用reciprocal分布替代——它和loguniform在功能上完全等价,只是命名不同:

from scipy.stats import reciprocal

params_randomSearch = {
    "learning_rate": reciprocal(1e-5, 1.0),
    # 其他参数...
}

手动实现(不依赖scipy的备选方案)

要是你不想引入scipy依赖,也可以手动构造一个对数均匀采样函数,RandomizedSearchCV同样接受可调用对象作为参数来源:

import numpy as np

def log_uniform(low, high):
    def sampler(size=None):
        return np.exp(np.random.uniform(np.log(low), np.log(high), size=size))
    return sampler

params_randomSearch = {
    "learning_rate": log_uniform(1e-5, 1.0),
    # 其他参数...
}

补充说明

不管用哪种方式,采样出来的learning_rate都会在1e-5到1.0之间遵循对数均匀分布——也就是说,在对数空间里是均匀分布的,小数值的采样概率和大数值在对数尺度上是相等的,这完全匹配你在scikit-optimize中的配置效果。

内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:20:48