Подгонка модели с использованием регрессора 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, и любая помощь будет оценена. Спасибо!

0
specbug 22 Ноя 2018 в 23:02

1 ответ

Лучший ответ

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

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

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

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

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


Что делать?

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

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

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

  2. Постарайтесь сократить количество оценщиков.

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

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

Поэтому попробуйте изменить параметры, понимая их влияние на производительность, вам нужна ссылка это.

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

Боковое примечание:

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

0
Yahya 23 Ноя 2018 в 20:25