我有一个旧的线性模型,我希望使用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中弹出)。但是,当我需要指定权重和基本边际时,我如何进行交叉验证或样本外分析?
就我所见,我可以使用sklearn
和GridSearchCV
,但然后我需要在XGBRegressor()
中指定权重和基本边距(而不是上面的fit()
)。XGBRegressor()
中与base_margin
等价的参数是base_score
,但没有weight参数。
此外,我可能会忘记做交叉验证,只使用训练和测试数据集,然后我将在XGBRegressor()
中使用eval_set
参数,但如果我这样做,就没有办法指定不同集合中的权重和基本边距。
任何正确方向的指导都是非常感激的!
您可以使用cross_val_predict
与fit_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
在交叉验证分裂后获得索引的地方。