Как сохранить большую модель 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 или другому решения, которые вы упомянули, чтобы сохранить/загрузить вашу модель.