Мне нужна помощь для объединения различных моделей XGBoost (с типами Booster). Идея состоит в том, чтобы сохранить одну модель, последнюю, в файле маринада.
Я начинаю с создания фиктивного фрейма данных:
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import KFold
import pickle
dummy_df = pd.DataFrame(np.random.randn(100, 3), columns=list('ABC'))
dummy_df['D'] = -15 * dummy_df['A'] + 32 * dummy_df['B']
X = dummy_df.drop('D', axis=1)
y = dummy_df['D']
Я устанавливаю некоторые параметры, которые я хотел бы проверить (например, из gridsearch):
params = {'eta': 0.06, # learning rate
'tree_method': "auto",#considering my dummy df, might be more interesting to use "gblinear" of course...
'max_depth': 3,
'subsample': 0.75,
'colsample_bytree': 0.75,
'colsample_bylevel': 0.75,
'min_child_weight': 5,
'alpha': 10,
'objective': 'reg:linear',
'eval_metric': 'rmse',
'random_state': 99,
'silent': True}
Наконец, я создаю свою схему перекрестной проверки:
accu = 0
n_splits = 5
folds = KFold(n_splits=n_splits, shuffle=True, random_state=1)
for n_fold, (train_idx, valid_idx) in enumerate(folds.split(X, y)):
train_x, train_y = X.iloc[train_idx], y.iloc[train_idx]
valid_x, valid_y = X.iloc[valid_idx], y.iloc[valid_idx]
dtrain = xgb.DMatrix(train_x, train_y)
dvalid = xgb.DMatrix(valid_x, valid_y)
watchlist = [(dtrain, 'train'), (dvalid, 'valid')]
model = xgb.train(params, dtrain, 2500, watchlist, maximize=False, early_stopping_rounds=40, verbose_eval=50)
if accu == 0:
model_to_save = model
accu += 1
else:
model_to_save += model
Он правильно тренируется для первой и второй итераций в цикле for, но когда мне нужно добавить 2 первые итерации (последняя строка), я получаю следующую ошибку:
TypeError: неподдерживаемые типы операндов для + =: 'Booster' и 'Booster'
Есть ли в Python способ добавить 2 бустера? А также разделить Booster на целое число, так как в конце мне придется делить model_to_save
на n_splits
?
PS: Хранение всех моделей XGBoost не вариант, учитывая другие ограничения, с которыми я могу столкнуться позже.