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

如何在scikit-learn中用RandomizedSearchCV替代GridSearchCV调优GradientBoostingRegressor

解决GradientBoostingRegressor从GridSearchCV转RandomizedSearchCV的问题

修正后的完整代码(推荐方案)

使用scipy.stats的随机分布定义参数空间,最大化RandomizedSearch的效率优势:

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint, uniform

print("Optimizing Hyperparameters..")

# 用随机分布替代固定列表,让RandomizedSearch实现真正的随机采样
param_dist = {
    "learning_rate": uniform(0.001, 0.01),  # 采样范围:0.001 ~ 0.011
    "n_estimators": randint(1000, 10001),   # 采样范围:1000 ~ 10000的整数
    "max_depth": randint(1, 11)             # 采样范围:1 ~ 10的整数
}

tuning = RandomizedSearchCV(
    estimator=GradientBoostingRegressor(),
    param_distributions=param_dist,
    n_iter=20,          # 仅搜索20组参数,远少于GridSearch的全组合
    cv=5,               # 5折交叉验证,可按需调整
    random_state=42,    # 固定随机状态,保证结果可复现
    verbose=1           # 输出搜索进度,方便监控
)

tuning.fit(X_train, y_train)

print("Best Parameters found: ", tuning.best_params_)

# 提取最佳参数,用get方法避免极端场景下的KeyError
n_parameter = tuning.best_params_["n_estimators"]
lr_parameter = tuning.best_params_.get("learning_rate", 0.001)
md_parameter = tuning.best_params_["max_depth"]

关键调整说明

  1. 参数空间定义优化
    RandomizedSearch的核心优势是从分布中随机采样,而非遍历所有组合。用scipy.stats的分布类型(randint、uniform)能覆盖更灵活的参数范围,同时避免GridSearch的全组合遍历开销。如果坚持使用固定参数列表,也可以保留你的原LR字典,但需确保n_iter小于总组合数(你的原列表总组合数为156=30,设置n_iter=10即可减少计算量)。

  2. 控制搜索迭代次数
    通过n_iter参数指定随机采样的参数组数,直接决定计算时间。通常设置20-50次即可在效率和效果间取得平衡,远少于GridSearch的全组合计算量。

  3. 保证结果可复现
    添加random_state固定随机种子,确保每次运行的参数采样结果一致,便于调试和对比不同实验。

  4. 鲁棒的参数提取
    使用dict.get()方法提取learning_rate,避免因极端采样情况导致的KeyError,同时保留默认值作为 fallback。

兼容原固定列表的简化方案

如果不想引入scipy,仅需在原代码基础上补充关键参数即可:

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import RandomizedSearchCV

print("Optimizing Hyperparameters..")

LR = {
    "learning_rate": [0.001],
    "n_estimators": [1000, 3000, 5000, 7000, 10000],
    "max_depth": [1, 2, 3, 5, 7, 10]
}

tuning = RandomizedSearchCV(
    estimator=GradientBoostingRegressor(),
    param_distributions=LR,
    n_iter=10,          # 随机选10组参数,替代全30组遍历
    cv=5,
    random_state=42,
    verbose=1
)

tuning.fit(X_train, y_train)

print("Best Parameters found: ", tuning.best_params_)

n_parameter = tuning.best_params_["n_estimators"]
lr_parameter = tuning.best_params_["learning_rate"]
md_parameter = tuning.best_params_["max_depth"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:45:37