Регрессия LightGBM для цели с преобразованием ранга: «Нет дальнейших разделений с положительным выигрышем» и почти постоPython

Программы на Python
Ответить
Anonymous
 Регрессия LightGBM для цели с преобразованием ранга: «Нет дальнейших разделений с положительным выигрышем» и почти посто

Сообщение Anonymous »

Я тренирую модель LightGBM, где метрикой оценки является корреляция Спирмена (на основе ранга). Чтобы лучше согласовать обучение с метрикой, я преобразую непрерывную цель y в ранги, масштабированные до [0,1]:

Код: Выделить всё

y_rank = pd.Series(y).rank(method="average")

y_rank = (y_rank - 1) / (len(y_rank) - 1)

Затем я обучаю LGBMRegressor по y_rank (все функции являются числовыми, а не категориальными). Набор данных состоит из ~7500 строк и ~18 числовых функций.
Однако во время обучения я часто вижу:

Код: Выделить всё

\[LightGBM\] \[Warning\] No further splits with positive gain, best gain: -inf

и в конечном итоге модель дает почти постоянные прогнозы (почти без дисперсии), что делает оценку Спирмена плохой.
Вопросы:
  • Каковы наиболее распространенные причины наилучшего выигрыша: -inf / «нет положительного выигрыша» в этой настройке (целевой рейтинг в [0,1])?
  • Какие параметры мне следует настроить аккуратно, чтобы дерево можно было разделить без необходимости сильного переобучения?
  • Есть ли рекомендуемая цель/подход в LightGBM, когда окончательным показателем является Спирмен (например, регрессия по рангам по сравнению с целями ранжирования)?
Минимальный код модели:

Код: Выделить всё

from lightgbm import LGBMRegressor
import lightgbm as lgb

model = LGBMRegressor(
objective="regression",
n_estimators=4000,
learning_rate=0.03,
num_leaves=127,
min_child_samples=20,
min_split_gain=0.0,
subsample=0.9,
subsample_freq=1,
colsample_bytree=0.9,
reg_alpha=0.0,
reg_lambda=1.0,
random_state=42,
n_jobs=-1,
force_col_wise=True,
)

model.fit(
X_tr, y_tr,
eval_set=[(X_va, y_va)],
eval_metric="rmse",
callbacks=[lgb.early_stopping(stopping_rounds=300, verbose=False)]
)
Я проверил:
  • — это float32/

    Код: Выделить всё

    float64Только 
    (без меток времени и объектов)
  • Отсутствующие значения вычисляются по медиане
  • Код: Выделить всё

    y_rank.std()
    не равно нулю в целом и для каждого сгиба.
Тем не менее, иногда я получаю постоянные модели + предупреждение выше. Будем признательны за любые рекомендации по диагностике и принципиальному решению проблемы.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/798 ... h-positive
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»