Вопрос или проблема
У меня есть код предсказания, который запускает RandomForestRegressor
и RandomForestClassifier
.
Я вызываю функции по 9 раз каждая, и они оптимизируются с помощью GridSearchCV
.
В первый раз выполнение заняло около 2 часов 20 минут, и почти после каждого цикла выполнения продолжительность steadily увеличивалась, и сегодня это заняло 3 часа 45 минут. Я запустил код 20 раз, и каждый раз продолжительность немного увеличивается, хотя в данных для обучения и размере тестовых данных изменений нет.
Хотя я стараюсь очищать кэш каждый раз, когда запускаю код, я не уверен, почему выполнение одного и того же занимает больше времени.
Общий вопрос был бы “Как я могу оптимизировать код?” Но, я полагаю, это будет специфично для SkLearn? Остальные коды не показывают такого же поведения и специфичны для кода предсказания.
Для RandomForestRegressor
:
param_grid_rf = {
'max_features': ['auto', 'sqrt', 'log2'],
# 'criterion': ['mse', 'mae'] #mae занимает много времени, а mse — по умолчанию
}
rf = RandomForestRegressor()
rf = GridSearchCV(estimator=rf, param_grid=param_grid_rf, n_jobs=-2)
Для RandomForestClassifier
:
param_grid_rc = {
'max_features': ['auto', 'sqrt', 'log2'],
'criterion': ['gini', 'entropy']
}
rc = RandomForestClassifier()
rc = GridSearchCV(estimator=rc, param_grid=param_grid_rc, n_jobs=-2)
Я не могу опубликовать код полностью, поэтому этот вопрос открыт.
Я использую Windows 10
и Pycharm
в качестве своей среды.
Я могу угадать две возможные причины.
1.) Вы установили n_jobs = -2
, что не использует все ваши ядра. Установите значение -1, чтобы ускорить ваш поиск.
2.) У меня был подобный вопрос (ссылка ниже), где мой Дерево решений выполнялось слишком долго. Я использовал mae
в качестве метрики. Затем я наткнулся на множество статей, утверждающих, что mae
занимает больше времени на вычисление, чем mse
. Я сменил метрику на mse
, и выполнение заняло намного меньше времени, так что вы можете попробовать это. Ссылка на вопрос: Дерево решений выполняется слишком долго
GridSearchCV известен тем, что он исчерпывающий и медленный. Я бы предложил использовать Optuna, который значительно быстрее, чем GridSearchCV.
Чтобы правильно обнаруживать такие проблемы и увидеть, что тормозит ваш код, вам следует использовать инструменты профилирования памяти и процессора. Этот случай кажется проблемой с памятью, которая обычно возникает, когда существует цикл с некоторыми датафреймами без удаления неиспользуемых переменных и использования gc.collect()
для освобождения памяти для следующей итерации. Обратите внимание, что gc.collect
работает только с переменными с нулевым счетчиком ссылок. Кроме того, реализация Scikit Learn Random Forest
медленная. Попробуйте использовать Случайные леса в XGBoost вместо этого.
Ответ или решение
Оптимизация времени выполнения RandomForest в Python
Проблема увеличения времени выполнения алгоритмов RandomForestRegressor
и RandomForestClassifier
на каждом новом запуске является распространенной среди разработчиков и аналитиков данных, использующих окружение Python и библиотеку Scikit-Learn. В следующем изложении будут рассмотрены потенциальные причины и рекомендации по оптимизации производительности кода.
Обозначение проблемы
Ваша ситуация характеризуется увеличением времени выполнения после нескольких запусков одних и тех же моделей, даже при неизменном объеме обучающих и тестовых данных. Это явление может быть результатом нескольких факторов, связанных с управлением памятью, конфигурацией системы и особенностями самого алгоритма.
Возможные причины замедления исполнения:
-
Использование ресурсов системы:
- Вы указали параметр
n_jobs=-2
, что может приводить к неэффективному использованию доступных ядер процессора. В большинстве случаев, установкаn_jobs=-1
позволяет использовать все доступные ядра, что значительно ускоряет вычисления.
- Вы указали параметр
-
Сложность выбранной метрики:
- Как упомянуто, использование метрики
mae
(средняя абсолютная ошибка) может занимать больше времени по сравнению сmse
(средняя квадратичная ошибка). Подсчетmse
менее ресурсоемок, что может привести к улучшению времени, если это приемлемо с точки зрения ваших бизнес-целей.
- Как упомянуто, использование метрики
-
Управление памятью:
- Важно следить за тем, чтобы ненужные переменные были удалены после каждого цикла, особенно если вы работаете с большими датасетами. Используйте
del
, чтобы удалить переменные, которые больше не нужны, а также вызовитеgc.collect()
, чтобы принудительно освободить память. Имейте в виду, что этот метод работает только для объектов с нулевым счетчиком ссылок.
- Важно следить за тем, чтобы ненужные переменные были удалены после каждого цикла, особенно если вы работаете с большими датасетами. Используйте
Рекомендации по оптимизации:
-
Профилирование кода:
- Используйте инструменты профилирования, такие как
memory_profiler
иcProfile
, для анализа использования памяти и ЦП при выполнении кода. Это поможет определить узкие места и подсказать, где происходят задержки.
- Используйте инструменты профилирования, такие как
-
Оптимизация GridSearchCV:
- Рассмотрите возможность замены
GridSearchCV
на более гибкие и быстрые альтернативы, такие какRandomizedSearchCV
или библиотеки для оптимизации гиперпараметров, такие какOptuna
. Эти инструменты могут предоставить более эффективные маршруты поиска по пространству гиперпараметров.
- Рассмотрите возможность замены
-
Параллелизация:
- Проверьте, можете ли вы использовать параллелизацию для других частей вашего кода, чтобы улучшить общую производительность. Используйте библиотеку
joblib
, которая хорошо интегрируется со Scikit-Learn и предлагает удобные методы для параллельной обработки.
- Проверьте, можете ли вы использовать параллелизацию для других частей вашего кода, чтобы улучшить общую производительность. Используйте библиотеку
-
Переход на XGBoost:
- Как упоминалось, реализация
RandomForest
в XGBoost быстрее и эффективнее работает с большими объемами данных. Рассмотрите возможность миграции на эту библиотеку для повышения производительности.
- Как упоминалось, реализация
-
Очистка кеша:
- Хотя вы упомянули о регулярной очистке кеша, не забудьте также следить за загруженными библиотеками и модулями, особенно если вы много раз загружаете их повторно в одном и том же сеансе выполнения.
Заключение
Увеличение времени выполнения при использовании RandomForest
может быть следствием различных факторов, от настроек конфигурации до особенностей реализации алгоритма. Применяя предложенные методы оптимизации, вы сможете значительно улучшить производительность вашего кода и ускорить процессы предсказания. Разработка и тестирование являются итеративными процессами, и настоятельно рекомендуется комплексно подходить к оптимизации, изменяя один аспект за раз и оценивая его влияние на производительность.