Операции над бустером (XGBoost) - PullRequest
0 голосов
/ 29 октября 2018

Мне нужна помощь для объединения различных моделей 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 не вариант, учитывая другие ограничения, с которыми я могу столкнуться позже.

...