Как сохранить большую модель sklearn RandomForestRegressor для вывода

Я обучил модель Sklearn RandomForestRegressor на 19 ГБ обучающих данных. Я хотел бы сохранить его на диск, чтобы использовать его позже для вывода. Как было рекомендовано в других вопросах stackoverflow, я попробовал следующее:

  • Соленый огурец
       pickle.dump(model, open(filename, 'wb'))

Модель успешно сохранена. Его размер на диске составлял 1,9 ГБ.

       loaded_model = pickle.load(open(filename, 'rb'))

Загрузка модели привела к ошибке MemorError (несмотря на 16 ГБ ОЗУ)

  • cPickle — тот же результат, что и у Pickle
  • Джоблиб

joblib.dump(оценка, 'random_forest.joblib' сжатие=3)

Это также заканчивается MemoryError при загрузке файла.

  • клепто
       d = klepto.archives.dir_archive('sklearn_models', cached=True, serialized=True)
d['sklearn_random_forest'] = est
d.dump()

Архив создан, но когда я хочу загрузить его, используя следующий код, я получаю KeyError: 'sklearn_random_forest'

       d = klepto.archives.dir_archive('sklearn_models', cached=True, serialized=True)
d.load(model_params)
est = d[model_params]

Я попытался сохранить объект словаря, используя тот же код, и это сработало, так что код правильный. Очевидно, Klepto не может сохранять модели sklearn. Я играл с кэшированными и сериализованными параметрами, и это не помогло.

Любые подсказки о том, как справиться с этим, будут очень признательны. Можно ли сохранить модель в JSON, XML, может HDFS, а может и в других форматах?

2 ответа

Попробуйте использовать joblib.dump()

В этом методе вы можете использовать параметр «сжать». Этот параметр принимает целочисленные значения от 0 до 9, чем выше значение, тем сильнее сжимается ваш файл. В идеале достаточно значения сжатия 3.

Единственным недостатком является то, что чем выше значение сжатия, тем медленнее скорость записи/чтения!

Размер модели случайного леса не зависит строго от размера набора данных, на котором вы ее обучали. Вместо этого есть другие параметры, которые вы можете увидеть в документации классификатора Random Forest , которые определяют, насколько большой может стать модель. Такие параметры, как:

  • n_estimators- количество деревьев
  • max_depth- насколько "высоким" может стать каждое дерево
  • min_samples_splitа также min_samples_leaf- количество выборок, позволяющих узлам в дереве разделиться/продолжить разделение

Если вы обучили свою модель с большим количеством оценщиков, большой максимальной глубиной и очень малым числом листовых/разделенных выборок, то ваша результирующая модель может быть огромной — и именно здесь вы столкнетесь с проблемами памяти.

В этих случаях я часто обнаруживал, что обучение меньших моделей (путем управления этими параметрами) — если это не убивает показатели производительности — решает эту проблему, и затем вы можете вернуться к joblib или другому решения, которые вы упомянули, чтобы сохранить/загрузить вашу модель.

Другие вопросы по тегам