【问题标题】:XGBRegressor loss functio customXGBRegressor 损失函数自定义
【发布时间】:2021-01-07 10:47:21
【问题描述】:

我想在 XGBRegressor 中自定义损失函数来分位数损失(弹球损失)

我用这个代码

def xgb_quantile_eval(preds, dmatrix, quantile=0.2):
    labels = dmatrix.get_label()
    return ('q{}_loss'.format(quantile),
            np.nanmean((preds >= labels) * (1 - quantile) * (preds - labels) +
                       (preds < labels) * quantile * (labels - preds)))


def xgb_quantile_obj(preds, dmatrix, quantile=0.2):
    try:
        assert 0 <= quantile <= 1
    except AssertionError:
        raise ValueError("Quantile value must be float between 0 and 1.")

    labels = dmatrix.get_label()
    errors = preds - labels

    left_mask = errors < 0
    right_mask = errors > 0

    grad = -quantile * left_mask + (1 - quantile) * right_mask
    hess = np.ones_like(preds)

    return grad, hess

我这样构建模型

def XGB(q, X_train, Y_train, X_valid, Y_valid, X_test):    
    # (a) Modeling  
    model = XGBRegressor(objective=xgb_quantile_obj, alpha=q,
                     n_estimators=10000, bagging_fraction=0.7, learning_rate=0.027, subsample=0.7)                 
                     
    model.fit(X_train, Y_train, eval_metric = xgb_quantile_eval, 
          eval_set=[(X_valid, Y_valid)], early_stopping_rounds=300, verbose=500)

    # (b) Predictions
    pred = pd.Series(model.predict(X_test).round(2))
    return model, pred

但我遇到了错误

models_2, results_2 = XGB(0.5, X_train_1, Y_train_1, X_valid_1, Y_valid_1, X_test)
results_2
  • AttributeError: 'numpy.ndarray' 对象没有属性 'get_label'

我不确定我是否做得很好。请帮帮我

【问题讨论】:

  • 检查dmatrixshapeget_label()返回一维数组。这可能是dmatrix 不是一维的情况。作为一种解决方法,您可以在get_label() 部分之前使用dmatrix.Flatten(),但是是的,这取决于您的数据集和要求。建议您提供经过处理并具体说明需求的示例数据集

标签: xgboost


【解决方案1】:

哦,我发现错误了,我必须更改 xgb_quantile_obj 中 preds 和 dmatrix 之间的序列并将 dmatrix 更改为标签

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 2017-04-04
    • 2017-12-18
    • 2020-03-27
    • 2020-11-16
    • 2019-05-27
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多