XGBoost слишком велик для маринада / JobLib - PullRequest
0 голосов
/ 07 марта 2019

У меня проблемы с загрузкой регрессии XGBoost с помощью pickle и joblib.

Одной из трудностей может быть тот факт, что я пишу pickle / joblib на рабочем столе Windows, но пытаюсь загрузить его на Macbook Pro

Я пытался использовать это решение, ранее опубликованное: Python 3 - может обрабатывать байтовые объекты размером более 4 ГБ?

, однако, он все равно не работает.Я получу множество ошибок, но обычно что-то вроде:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

также пытался использовать protocol = 4 в дампе pickle и joblib, и в каждом случае файл все еще не мог загрузиться.

Файлы, которые пытались загрузить, были размером от 2 ГБ до 11 ГБ на основе joblib / pickle или с использованием ранее опубликованного решения bytes_in / os.path

Кто-нибудь знает решение для оптимальных способов написания большихРегрессии XGBoost и / или как их затем загрузить?

Вот код, использованный для записи XGBoost

dmatrix_train = xgb.DMatrix(
    X_train.values, y_train, feature_names=X_train.columns.values
)
dmatrix_validate = xgb.DMatrix(
    X_test.values, y_test, feature_names=X_train.columns.values
)
eval_set = [(dmatrix_train,"Train")]
eval_set.append((dmatrix_validate,"Validate"))

print("XGBoost #1")

params = {
    'silent': 1,

    'tree_method': 'auto',
    'max_depth': 10,
    'learning_rate': 0.001,
    'subsample': 0.1,
    'colsample_bytree': 0.3,
    # 'min_split_loss': 10,
    'min_child_weight': 10,
#     'lambda': 10,
#     'max_delta_step': 3
}

num_round = 500000

xgb_model = xgb.train(params=params, dtrain=dmatrix_train,evals=eval_set,
    num_boost_round=num_round, verbose_eval=100)

joblib.dump(xgb_model, 'file.sav', protocol=4)

Последняя строка также была опробована со стандартным дамплингом,с 'wb' и без.

1 Ответ

0 голосов
/ 07 марта 2019

Похоже, вы используете низкоуровневый API XGBoost (в отличие от высокоуровневого API-оболочки Scikit-Learn). На этом уровне вы можете сохранять / загружать модели XGBoost с использованием функций Booster.save_model(fname) и Booster.load_model(fname).

Например, см. Эту ветку SO: Как сохранить и загрузить модель xgboost?

Пиклинг имеет смысл, если в него включен значительный «объект-обертка Python». Здесь его нет.

...