首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XGBRegressor损失功能定制

XGBRegressor损失功能定制
EN

Stack Overflow用户
提问于 2021-01-06 10:37:02
回答 1查看 310关注 0票数 0

我想在XGBRegressor中将损失函数定义为分位数损失(弹球损失)。

我使用这个代码

代码语言:javascript
复制
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

我建立了这样的模型

代码语言:javascript
复制
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

但我有个错误

代码语言:javascript
复制
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'

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-07 02:47:21

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65594196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档