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(),但如果我这样做,就无法指定什么是权重以及什么是基本边距不同的集合。
非常感谢任何正确方向的指导!
您可以使用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)
您可以在代码源中看到发生了什么:here、here和here。最后一个链接是fit_params在交叉验证拆分后获取索引的位置。
| 归档时间: |
|
| 查看次数: |
2987 次 |
| 最近记录: |