【问题标题】:XGBoostError : value for parameter exceed boundXGBoostError : 参数值超出界限
【发布时间】:2021-12-11 03:14:59
【问题描述】:

我正在训练 XGBoost 模型并使用 randomSearchCV 进行超参数调整。我将参数分布指定为:

from xgboost import XGBRegressor

# Define a xgboost regression model
model = XGBRegressor()

params = {
      "colsample_bytree": uniform(0.1, 0.2), # fraction of cols to sample
      "gamma": uniform(0, 0.3), # min loss reduction required for next split
      "learning_rate": uniform(0.02, 0.3), # default 0.1 
      "n_estimators": randint(100, 150), # default 100
      "subsample": uniform(0.8, 0.75) # % of rows to use in training sample
}

r = RandomizedSearchCV(model, param_distributions=params, n_iter=100, 
scoring="neg_mean_absolute_error", cv=3, n_jobs=1)

即使我为 subsample 指定的范围低于界限 [0,1],我也会收到以下错误。

raise XGBoostError(py_str(_LIB.XGBGetLastError()))
   xgboost.core.XGBoostError: value 1.10671 for Parameter subsample exceed bound [0,1]

  warnings.warn("Estimator fit failed. The score on this train-test"

任何想法为什么会发生这种情况?

【问题讨论】:

    标签: machine-learning xgboost


    【解决方案1】:

    我认为问题出在:

    uniform(0.8, 0.75)
    

    对于 numpy 和 random,函数的第一个值定义下限,第二个值定义上限。因此,对于你想要的 numpy 和 random:

    uniform(0.75, 0.8)
    

    这适用于 numpy.random.uniform 和 random.uniform:

    但是,对于 scipy.stats.uniform,定义略有不同。这是“使用参数 loc 和 scale,获得 [loc, loc + scale] 上的均匀分布。”所以对于你想要的 scipy:

    uniform(0.75, 0.05)
    

    【讨论】:

    • 我修复了参数,"colsample_bytree": uniform(0.5, 1),但是,我仍然遇到错误。 raise XGBoostError(py_str(_LIB.XGBGetLastError())) xgboost.core.XGBoostError: value 1.0913 for Parameter colsample_bytree exceed bound [0,1]
    • 从哪里导入uniform函数?我刚刚看到还有一个 scipy 函数。然后定义不同。
    • 从 scipy.stats 导入制服
    • 我认为对于 scipy.stats 你应该使用 uniform(0.5, 0.5)。
    • 所以对于 scipy 制服。 colsample_bytree 的参数 a + 参数 b 不应大于 1。请参阅上面调整后的答案。
    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多