Оптимизировать случайный лесной регрессор из-за вычислительных ограничений - PullRequest
0 голосов
/ 22 ноября 2018

Подгонка модели с использованием регрессора Random Forest занимает всю оперативную память, что приводит к аварийному завершению работы ноутбука в Интернете (ядро Google colab или Kaggle).Не могли бы вы, ребята, помочь мне с оптимизацией модели?

Я уже пытался настроить параметры, такие как уменьшение количества оценок, но не работает.df.info() показывает 4446965 записей для данных о поездах, занимающих ~ 1 ГБ памяти.

Я не могу опубликовать здесь весь код ноутбука, поскольку он будет слишком длинным, но не могли бы вы проверить эту ссылку для справки.Ниже приведена некоторая информация, относящаяся к кадру данных для обучения.

clf = RandomForestRegressor(n_estimators=100,min_samples_leaf=2,min_samples_split=3, max_features=0.5 ,n_jobs=-1)
clf.fit(train_X, train_y)
pred = clf.predict(val_X)

train_x.info () показывает 3557572 записей, занимающих почти 542 МБ памяти

Я все еще начинаю с ML, и любая помощь будет оценена.Спасибо!

1 Ответ

0 голосов
/ 23 ноября 2018

Random Forest по природе ставит огромные нагрузки на CPU и RAM, и это один из его очень известных недостатков!Так что в вашем вопросе нет ничего необычного.

Кроме того, в частности, есть несколько факторов, которые способствуют этому вопросу, если назвать несколько:

  1. Количество атрибутов (функции) в наборе данных.
  2. Количество деревьев (n_estimators).
  3. Максимальная глубина дерева (max_depth).
  4. Требуемое минимальное количество образцовнаходиться на листовом узле (min_samples_leaf).

Более того, Scikit-learn четко указывает на эту проблему, и я цитирую здесь:

Значения по умолчанию для параметров, управляющих размером деревьев (например, max_depth, min_samples_leaf и т. д.), приводят к полностью выращенным и необрезанным деревьям, которые потенциально могут быть очень большими в некоторых наборах данных.Чтобы уменьшить потребление памяти, нужно управлять сложностью и размером деревьев, задавая значения этих параметров.


Что делать?

Не так уж много, что вы можетеdo особенно Scikit-learn не добавлял опцию для управления проблемой хранения на лету (насколько я знаю).

Скорее вам нужно изменить значение вышеупомянутогопараметры, например:

  1. Старайтесь сохранять наиболее важные функции, только если количество функций уже велико (см. Выбор функций в Scikit-learn и Значения признаков с лесами деревьев ).

  2. Попробуйте уменьшить количество оценок.

  3. max_depth равно None по умолчанию, что означает, что узлы расширяются до тех пор, пока все листья не станут чистыми или пока все листья не будут содержать менее min_samples_split выборок.

  4. min_samples_leaf по умолчанию 1: разделениеточка на любой глубине будет рассматриваться только если она уходит ввосточные min_samples_leaf тренировочные образцы в каждой из левой и правой ветвей.Это может привести к сглаживанию модели, особенно в регрессии.

Поэтому попробуйте изменить параметры, понимая их влияние на производительность. Справочная информация: .

Последний и последний вариант, который у вас есть, - это создать свой собственный настроенный Random Forest с нуля и загрузить метаданные на жесткий диск ... и т. Д. Или выполнить любую оптимизацию, это неудобно, но просто упомянуть такой вариант, здесь является примером базовой реализации!

Примечание:

Практически я испытывал на своем Core i7 ноутбуке, что настройкаПараметр от n_jobs до -1 перегружает машину, я всегда считаю более эффективным сохранение значения по умолчанию, равного n_jobs=None!Хотя теоретически это должно быть наоборот!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...