我有一个旧的线性模型,我希望改进使用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()中)。base_margin在XGBRegressor()中的等价形式是参数base_score,但是没有关于权重的论证。
此外,我可能会忘记进行交叉验证,只需使用训练和测试数据集,然后在XGBRegressor()中使用XGBRegressor()参数,但如果这样做,就无法指定不同集合中的权重和基数。
任何正确方向的指导都是非常感谢的!
发布于 2022-06-15 23:45:35
您可以在fit_params参数中使用fit_params,也可以在**fit_params中使用GridSearchCV.fit。
这是一个概念的有效证明。
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在交叉验证分裂之后获得索引的位置。
https://stackoverflow.com/questions/72522003
复制相似问题