XGBRegressor与权重和base_margin:样本验证可能吗?



我有一个旧的线性模型,我希望使用XGBoost来改进。我有旧模型的预测,我希望用它作为基本边际。此外,由于我要建模的对象的性质,我需要使用权重。我的旧glm是公式number_of_defaults/exposure ~ param_1 + param_2的泊松回归,权重设置为exposure(与响应变量的分母相同)。在数据上训练新的XGBoost模型时,我这样做:

xgb_model = xgb.XGBRegressor(n_estimators=25,
max_depth=100,
max_leaves=100,
learning_rate=0.01,
n_jobs=4,
eval_metric="poisson-nloglik",
nrounds=50)
model = xgb_model.fit(X=X_train, y=y_train, sample_weight=_WEIGHT, base_margin=_BASE_MARGIN)

,其中_WEIGHT_BASE_MARGIN是权重和预测(从X_train中弹出)。但是,当我需要指定权重和基本边际时,我如何进行交叉验证或样本外分析?

就我所见,我可以使用sklearnGridSearchCV,但然后我需要在XGBRegressor()中指定权重和基本边距(而不是上面的fit())。XGBRegressor()中与base_margin等价的参数是base_score,但没有weight参数。

此外,我可能会忘记做交叉验证,只使用训练和测试数据集,然后我将在XGBRegressor()中使用eval_set参数,但如果我这样做,就没有办法指定不同集合中的权重和基本边距。

任何正确方向的指导都是非常感激的!

您可以使用cross_val_predictfit_params参数,或GridSearchCV.fit**fit_params参数。

这是一个可行的概念证明

import xgboost as xgb
from sklearn import datasets
from sklearn.model_selection import cross_val_predict, GridSearchCV
import numpy as np
# Sample dataset
diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]
xgb_model = xgb.XGBRegressor(n_estimators=5)
fit_params = dict(sample_weight=np.abs(X[:, 0]), base_margin=np.abs(X[:, 1]))
# Simple fit
xgb_model.fit(X, y, **fit_params)
# cross_val_predict
y_pred = cross_val_predict(xgb_model, X, y, cv=3, fit_params=fit_params)
print(y_pred.shape, y.shape)
# grid search
grid = GridSearchCV(xgb_model, param_grid={"n_estimators": [5, 10, 15]})
grid.fit(X, y, **fit_params)

你可以在源代码中看到发生了什么:这里,这里和这里。最后一个链接是fit_params在交叉验证分裂后获得索引的地方。

最新更新