如何解决XGBRegressor 损失函数自定义
我想在 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,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,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'
我不确定我是否做得很好。请帮帮我
解决方法
哦,我发现错误,我必须在 xgb_quantile_obj 中更改 preds 和 dmatrix 之间的序列并将 dmatrix 更改为标签
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。