具有权重和 base_margin 的 XGBRegressor:可以进行样本外验证吗?

Ber*_*ros 6 python weighted cross-validation xgboost

我有一个旧的线性模型,我希望使用 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)
Run Code Online (Sandbox Code Playgroud)

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

据我所知,我可以使用sklearnand GridSearchCV,但随后我需要指定权重和基本边距XGBRegressor()(而不是fit()上面的 in)。base_marginin的等价物XGBRegressor()是参数base_score,但没有重量参数。

另外,我可能会忘记进行交叉验证,而只使用训练和测试数据集,然后我会eval_set在 中使用参数XGBRegressor(),但如果我这样做,就无法指定什么是权重以及什么是基本边距不同的集合。

非常感谢任何正确方向的指导!

phi*_*phi 3

您可以使用cross_val_predictwithfit_params参数,或GridSearchCV.fitwith **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)
Run Code Online (Sandbox Code Playgroud)

您可以在代码源中看到发生了什么:hereherehere。最后一个链接是fit_params在交叉验证拆分后获取索引的位置。