Вопрос или проблема
У меня есть скрипт для обучения Lgbm с использованием CPU, который работает хорошо с этими гиперпараметрами:
'objective': 'binary',
'metric': 'auc',
'boosting_type': 'gbdt',
'verbosity': -1,
'max_depth': trial.suggest_int('max_depth', 10, 20),
'num_leaves': trial.suggest_int('num_leaves', 150, 250),
'learning_rate': trial.suggest_float('learning_rate', 0.03, 0.1, log=True),
'feature_fraction': trial.suggest_float('feature_fraction', 0.2, 0.8),
'bagging_fraction': trial.suggest_float('bagging_fraction', 0.2, 1.0),
'min_child_weight': trial.suggest_float('min_child_weight', 1e-3, 10.0, log=True),
'min_data_in_leaf': trial.suggest_int('min_data_in_leaf', 20, 100),
'reg_alpha': trial.suggest_float('reg_alpha', 1e-2, 10.0, log=True),
'reg_lambda': trial.suggest_float('reg_lambda', 1e-2, 10.0, log=True),
'scale_pos_weight': class_weights[0] / class_weights[1] * 1.5,
'max_bin': trial.suggest_int('max_bin', 150, 255),
'bagging_freq': trial.suggest_int('bagging_freq', 3, 10)
Однако после установки LightGBM с поддержкой GPU (версии 4.5.0) я начал сталкиваться со следующей ошибкой во время некоторых испытаний:
lightgbm.basic.LightGBMError: Проверьте, что: (best_split_info.left_count) > (0) в /__w/1/s/lightgbm-python/src/treelearner/serial_tree_learner.cpp, строка 846 в некоторых испытаниях.
Код точно такой же. Единственное отличие — модель Lgbm и устройство изменилось с CPU на GPU.
Почему это происходит?
Версия LGBM — 4.5.0.
Ответ или решение
Ошибка, с которой вы столкнулись, связана с библиотекой LightGBM, и возникает она при использовании GPU для обучения модели. Проблема, озвученная в сообщении об ошибке lightgbm.basic.LightGBMError: Check failed: (best_split_info.left_count) > (0)
, указывает на то, что во время процесса разбиения данных на узлы дерева не было найдено значимого разбиения, где количество элементов в левой части данных (left_count) оказалось равным нулю. Это значит, что при подготовке данных для разбиения алгоритм не смог найти ни одного образца, чтобы сформировать левое поддерево.
Возможные причины возникновения проблемы
-
Различия в данных: Убедитесь, что данные, которые вы используете для тренировок, являются корректными и не содержат аномалий. Часто, при использовании GPU, данные могут по-разному интерпретироваться. Проверьте, что ваше обучающее множество присутствует в нужном формате и не содержит пропусков или некорректных значений.
-
Различия в параметрах настройки: Когда вы переключаетесь с CPU на GPU, некоторые параметры могут вести себя иначе. Это связано с тем, что на GPU выполняется более оптимизированная обработка, которая может изменить динамику обработки данных. Ваша модель может требовать иной настройки гиперпараметров при использовании GPU.
-
Параметр
num_leaves
: Изменяйте значение гиперпараметраnum_leaves
. Высокие значения могут привести к перетренировке модели, в результате чего статистическая значимость разбиений может уменьшиться. Попробуйте использовать менее высокие значения для этого параметра. -
Выбор значения
min_data_in_leaf
: Этот параметр управляет минимальным количеством данных, необходимым для создания листа. Если он слишком высок, это может привести к отсутствию данных в левом узле. Убедитесь, что это значение адекватно размеру вашего датасета. -
Прочие гиперпараметры: Проверьте такие параметры, как
feature_fraction
,bagging_fraction
,scale_pos_weight
и их влияние на структуру данных. В некоторые моменты они могут приводить к созданию пустых узлов.
Рекомендации по решению проблемы
-
Проверьте и обработайте данные: Убедитесь, что ваш датасет очищен от пропусков и аномалий. Примените дополнительные преобразования данных, если требуется.
-
Измените гиперпараметры: Попробуйте выполнить несколько пробных запусков с уменьшением значений
max_depth
,num_leaves
иmin_data_in_leaf
. Это поможет оптимизировать модель и избежать ошибочных разбиений. -
Обновление LightGBM: Рассмотрите возможность обновления до более новой версии библиотеки, если таковая имеется. Иногда разработчики устраняют ошибки и улучшают совместимость.
-
Работа с документацией: Изучите документацию LightGBM по работе с GPU. Она может содержать полезные советы и рекомендации по оптимизации использования библиотеки.
Заключение
Использование LightGBM с поддержкой GPU предоставляет сторонним разработчикам значительные преимущества в производительности, однако может вызывать специфические проблемы, с которыми не сталкиваются пользователи с CPU. Обратите внимание на обработку данных и параметры модели, чтобы избежать возникновения ошибки best_split_info.left_count
. Тщательная настройка и анализ помогут вам оптимизировать работу вашей модели и избежать подобных проблем в будущем.