Вопрос или проблема
Для написания тестового примера я пытаюсь полностью понять LightGBM.
Я бы предположил, что следующий пример построит дерево, способное полностью переобучиться на данных. Какие параметры мне нужно изменить, чтобы вырастить одно полное дерево?
import lightgbm as lgb
import pandas as pd
df = pd.DataFrame(
{
'y': [1,2,3,4,4],
'x': [0,1,3,4,3],
'z': [1,4,0,4,3]
},
)
model = lgb.LGBMRegressor(
n_estimators=1,
min_child_samples=1,
).fit(
X=df[["x", "z" ]],
y=df["y"],
)
model.predict(X=df[["x", "z" ]])
# -> array([2.62, 2.82, 2.82, 2.92, 2.82])
Ответ или решение
Для полного понимания работы с LightGBM и создания тестового случая, который демонстрирует способность модели полностью адаптироваться к предоставленным данным, необходимо понять, как LightGBM строит деревья решений и каким образом можно настроить параметры модели для построения и обучения одного полного дерева. В вашем примере, вы столкнулись с ситуацией, где ожидания по поводу надмера обучения (overfitting) не оправдались. Рассмотрим более подробно теоретический аспект работы LightGBM, приведем пример и проанализируем, как можно применить полученные знания для решения поставленной задачи.
Теория
LightGBM (Light Gradient Boosting Machine) — это фреймворк для обучения моделей градиентного бустинга, который использует деревья решений в качестве базовых моделей. Основное преимущество LightGBM заключается в его высокой скорости обучения и предсказания при сохранении высоких показателей точности результатов. Ключевые параметры, которые влияют на структуру деревьев и, соответственно, на итоговую модель, включают:
-
n_estimators: количество деревьев в модели. В вашем случае он установлен в 1, что говорит о том, что модель будет использовать одно дерево.
-
min_child_samples: минимальное количество выборок, которое должно содержаться в каждом узле после разбиения. Значение 1 снижает ограничения на минимальное количество данных, что позволяет деревьям различные разбиения с минимальными требованиями.
-
max_depth: максимальная глубина дерева. По умолчанию LightGBM не задан жесткий предел, что позволяет деревьям расти до тех пор, пока они эффективно уменьшают ошибку.
-
num_leaves: максимальное количество листьев в одном дереве. Увеличение этого значения дает деревьям возможность обрабатывать более сложные данные, но это может также привести к избыточному обучению, если не контролировать данный параметр.
Пример
В представленной ситуации вы создали модель LightGBM с параметрами n_estimators=1
и min_child_samples=1
, что соответствует настройке на одно дерево и минимальные ограничения по объему данных в узлах. Однако выходные данные модели (предсказания) показывают, что дерево не обучилось идеально на данных, скорее оно испытывает некоторое упрощение в видавании результатов. Это может быть связано с недостаточной глубиной дерева или недостаточной настройкой других параметров, например num_leaves
.
Чтобы дерево смогло обучиться идеально (или близко к этому), стоит обратить внимание на следующие параметры:
-
max_depth: Установка этого параметра на достаточно высокое значение или прямо на None позволит дереву максимально глубоко влезать в данные. Однако и слишком высокое значение может привести к избыточному обучению и сделает модель более чувствительной к шуму в данных.
-
num_leaves: Увеличение этого параметра позволит деревьям иметь больше точек разбиения, что увеличит их компленотность и потенциально позволит им обрабатывать определенные узоры в данных эффективнее. Для полного соответствия данных, вам потребуется оптимально большое значение num_leaves для обхвата всех уникальных разбиений.
Применение
Для достижения полного соответствия данных в вашей модели LightGBM (overfitting), вы можете попробовать следующие шаги:
-
Установите max_depth в None и num_leaves на значение больше, чем количество уникальных комбинаций признаков в вашей выборке. Это предоставит вашему дереву достаточные ресурсы, чтобы вмещать в себя все потенциальные комбинации.
-
Используйте fine-tuning других параметров, таких как min_gain_to_split (минимальное уменьшение потерь для разбиения узла) и learning_rate (что в случае одного дерева менее критично, но может влиять в случае добавления других деревьев в future iterations).
-
Проверьте обучение на более сложной структуре данных, моделируя данные с различными уровннями дисперсии и значений для сравнения.
Пример новых настроек может выглядеть следующим образом:
model = lgb.LGBMRegressor(
n_estimators=1,
min_child_samples=1,
max_depth=None,
num_leaves=16 # по необходимости больше для сложных данных
).fit(
X=df[["x", "z"]],
y=df["y"],
)
После выполнения данных шагов, ваша модель должна осуществить более точное соответствие обучающим данным для случаев, где полного согласования весьма необходимо, и может помочь в более точном тестировании функций вашей системы или гипотезы.
Тем не менее следует учитывать, что избыточное обучение может привести к потере способности модели к генерализации на новых данных, и этот подход стоит применять только для исследовательских задач или задач, где идеальное подгонка по обучающей выборке является критичной.