Рубрики
Без рубрики

Понимание параметров LightGBM (и как их настроить)

Эта статья была первоначально написана MJ Bahmani и опубликована в блоге Neptune. Я использовал … Помечено машинным обучением, наукой данных, Python.

Эта статья была первоначально написана MJ Bahmani и опубликовано в Блог Нептуна.

Я использовал Lightgbm Какое -то время. Это был мой алгоритм для большинства проблем с таблицами. Список удивительных функций длинный, и я предлагаю вам посмотреть, если вы еще этого не сделали. Но я всегда был заинтересован в понимании того, какие параметры оказывают наибольшее влияние на производительность и как я должен настроить параметры LightGBM, чтобы получить максимальную отдачу от этого. Я подумал, что мне следует провести некоторое исследование, узнать больше о параметрах LightGBM … и поделиться своим путешествием. В частности, я:

Когда я это делал, я получил гораздо больше знаний о параметрах LightGBM. Я надеюсь, что после прочтения этой статьи вы сможете ответить на следующие вопросы:

  • Какие методы повышения градиента реализованы в LightGBM и каковы его различия?
  • Какие параметры важны в целом?
  • Какие параметры регуляризации необходимо настроить?
  • Как настроить параметры LightGBM в Python?

С LightGBM вы можете запускать различные типы методов повышения градиента. У вас есть: GBDT, DART и GOSS, которые могут быть указаны с помощью параметра «повышения». В следующих разделах я объясню и сравню эти методы друг с другом.

LGBM GBDT (градиент увеличил деревья решений)

Этот метод является традиционным деревом решений по повышению градиента, которое было впервые предложено в этой статье и является алгоритмом некоторых великих библиотек, таких как XGBOOST и PGBRT. В наши дни GBDT широко используется из -за его точности, эффективности и стабильности. Вы, наверное, знаете, что GBDT является ансамблевой моделью деревьев решений, но что это значит? Позвольте мне дать вам суть. Он основан на трех важных принципах:

  • Слабые ученики (деревья решений)
  • Градиентная оптимизация
  • Техника повышения

Таким образом, в методе GBDT у нас есть много деревьев решений (слабые ученики). Эти деревья построены последовательно:

  • Первое дерево узнает, как соответствовать целевой переменной
  • Второе дерево узнает, как соответствовать остаточному (разницу) между прогнозами первого дерева и Наземная правда
  • Третье дерево узнает, как установить остатки второго дерева и так далее.

Все эти деревья обучаются путем распространения градиентов ошибок по всей системе. Основным недостатком GBDT является то, что поиск лучших точек разделения в каждом узле дерева является трудоемкой, а операция по отнимущению памяти Другие методы усиления пытаются решить эту проблему.

DART Gradient повышение

В этой выдающейся статье вы можете узнать все о повышении градиента DART, которое является методом, который использует отсечение, стандарт в нейронных сетях, для улучшения регуляризации модели и решения некоторых других менее заметных проблем. А именно, GBDT страдает от чрезмерной специфики, что означает, что деревья, добавленные при более поздних итерациях, имеют тенденцию влиять на прогноз всего несколько случаев и вносить незначительный вклад в оставшиеся случаи. Добавление отсева затрудняет для деревьев на более поздних итерациях специализироваться на этих нескольких образцах и, следовательно, улучшает производительность.

LGBM Goss (односторонняя выборка на основе градиента)

На самом деле, наиболее важной причиной именования этого метода LightGBM использует Госс Метод на основе этой статьи. Goss – более новая и более легкая реализация GBDT (отсюда и «свет» GBM). Стандартный GBDT является надежным, но он недостаточно быстр на больших наборах данных. Следовательно, Госс предлагает метод отбора проб, основанный на градиенте, чтобы избежать поиска всего пространства поиска. Мы знаем, что для каждого экземпляра данных, когда градиент невелик, это означает, что данные не заботятся об хорошо обучении, и когда градиент большой, который должен быть снова переподготовлен. Итак, у нас есть две стороны Здесь экземпляры данных с большими и маленькими градиентами. Таким образом, Госс хранит все данные с большим градиентом и выполняет случайную выборку (Вот почему это называется односторонней выборкой) на данных с небольшим градиентом. Это делает пространство поиска меньше, и Goss может сходиться быстрее. Наконец, для получения большего понимания Госса, вы можете проверить это Пост в блоге Анкет

Давайте поместим эти различия в таблице: Примечание : Если вы устанавливаете повышение как RF, то алгоритм LightGBM ведет себя как случайный лес, а не повышенные деревья! Согласно документации, для использования RF вы должны использовать Bagging_fraction и feature_fraction меньше 1.

В этом разделе я расскажу о некоторых важных параметрах регуляризации LightGBM. Очевидно, что это параметры, которые вам нужно настроить, чтобы сражаться с переосмыслением. Вы должны знать, что для небольших наборов данных (<10000 записей) LightGBM может быть не лучшим выбором. Настройка параметров LightGBM может вам не помочь. Кроме того, Lightgbm использует Листья Алгоритм роста деревьев WhosGboost использует глубинный рост деревьев. Листовый метод позволяет деревьям сходиться быстрее, но вероятность чрезмерного прихода увеличивается. Возможно, этот разговор на одной из конференций Pydata дает вам больше понимания о XGBOOST и LightGBM. Стоит посмотреть! Примечание : Если кто -то спрашивает вас, в чем основное различие между LightGBM и XGBOOST? Вы можете легко сказать, что их отличие заключается в том, как они реализованы.

Согласно Lightgbm документация , при переоснащении вы можете сделать следующую настройку параметров:

  • Используйте маленький max_bin
  • Используйте небольшие num_leaves
  • Используйте min_data_in_leaf и min_sum_hessian_in_leaf
  • Используйте пакетин, установленная пакетом и пакетом и пакетом
  • Используйте подбору функций по установке feature_fraction
  • Используйте большие данные обучения
  • Попробуйте lambda_l1, lambda_l2 и min_gain_to_split для регуляризации
  • Попробуйте max_depth, чтобы избежать выращивания глубокого дерева

В следующих разделах я объясню каждый из этих параметров более подробно.

Lambda_l1

LAMBDA_L1 (и LAMBDA_L2) Управление до L1/L2 и вместе с min_gain_to_split используются для борьбы с чрезмерной подключением. Я настоятельно рекомендую вам использовать настройку параметров (исследованную в более позднем разделе), чтобы выяснить наилучшие значения для этих параметров.

num_leaves

Конечно num_leaves является одним из наиболее важных параметров, который управляет Сложность модели. С ним вы устанавливаете максимальное количество листьев, которые есть каждый слабый ученик. Большая num_leaves повышает точность на тренировочном наборе, а также вероятность пострадавшего от переживания. Согласно документации, один простой способ – это num_leaves^(max_depth) Однако, учитывая, что в LightgBM дерево листового поля глубже, чем дерево по уровню, вы должны быть осторожны с переосмыслением! В результате необходимо настраивать num_leaves вместе с MAX_DEPTH.

Фото на Lightgbm документация

подвыборка

С Подвыбор (или Bagging_fraction) Вы можете указать процент строк, используемых на итерацию здания дерева. Это означает, что некоторые строки будут выбраны случайным образом для подгонки каждого учащегося (дерево). Это улучшило обобщение, а также скорость тренировок.

Я предлагаю использовать меньшие значения подвыборки для базовых моделей, а затем увеличить это значение, когда вы закончите с другими экспериментами (разные выборы функций, различная архитектура деревьев).

feature_fraction

Функция фракции или sub_feature, посвященная отбору о столбцах, LightGBM случайным образом выберет подмножество функций на каждой итерации (дерево). Например, если вы установите его на 0,6, LightGBM выберет 60% функций перед тренировкой каждого дерева. Для этой функции есть два использования:

  • Можно использовать для ускорения тренировок
  • Может быть использован для борьбы с переосмыслением

Максимальная глубина

Эта глубина управления параметрами максимальной глубины каждого обученного дерева и окажет влияние на:

  • Лучшее значение для параметра num_leaves
  • Производительность модели
  • Тренировочное время

Обратите внимание, если вы используете большое значение max_depth, ваша модель, вероятно, будет над подходящим в набор поезда.

max_bin

Binning – это метод представления данных в дискретном представлении (гистограмма). LightGBM использует алгоритм на основе гистограммы, чтобы найти оптимальную точку разделения, создавая слабый ученик. Следовательно, каждая непрерывная числовая функция (например, количество представлений для видео) должна быть разделена на отдельные контейнеры.

Фотография на Lightgbm и Xgboost объяснили

Также в этом GitHub Repo Вы можете найти некоторые комплексные эксперименты, которые полностью объясняют влияние изменения MAX_BIN на процессор и графический процессор.

Время часов после 500 итераций- GitHub Repo

Если вы определите MAX_BIN 255, это означает, что мы можем иметь максимум 255 уникальных значений на функцию. Затем небольшой MAX_BIN вызывает более высокую скорость, а большое значение повышает точность.

Тренировочное время! Если вы хотите обучить свою модель с LightGBM, некоторые типичные проблемы, которые могут возникнуть, когда вы тренируете модели LightGBM:

  • Обучение-это трудоемкий процесс
  • Работа с вычислительной сложностью (ограничения ОЗУ процессора/графического процессора)
  • Работа с категориальными функциями
  • Имея несбалансированный набор данных
  • Потребность в пользовательских показателях
  • Корректировки, которые необходимо внести для задач классификации или регрессии

В этом разделе мы постараемся объяснить эти точки в подробности.

num_iterations

Num_iterations указывает количество итераций повышения (деревья для строительства). Чем больше деревьев вы строите, тем точнее ваша модель может быть за счет:

  • Более длительное время обучения
  • Более высокий шанс переосмысления

Начните с более низкого количества деревьев, чтобы построить базовую линию и увеличить его позже, когда вы хотите выжать последний % из своей модели. Рекомендуется использовать меньший Learning_Rate с большим num_iterations Анкет Кроме того, вам следует использовать Ranach_stopping_rounds, если вы идете на более высокие num_iterations, чтобы остановить обучение, когда он не изучает ничего полезного.

ranner_stopping_rounds

Этот параметр прекратит обучение, если показатель проверки не улучшится после последнего раннего раунда остановки. Это должно быть определена в паре с номером итераций Анкет Если вы установите его слишком большим, вы увеличиваете изменение переосмысление (Но ваша модель может быть лучше). Правило эмпирического правила состоит в том, чтобы иметь его на уровне 10% от ваших num_iterations.

Lightgbm Categorical_feature

Одним из преимуществ использования LightGBM является то, что он может очень хорошо обрабатывать категориальные функции. Да, этот алгоритм очень мощный Но вы должны быть осторожны с тем, как использовать его параметры. Lightgbm использует специальное Кодированный целое число Метод (предложенный Fisher ) для обработки категориальных функций Эксперименты показывают, что этот метод приносит лучшую производительность, чем, часто используется, ОДНА-HOT CODING . Значение по умолчанию для этого – «Авто», что означает: пусть Lightgbm решает, что означает, что LightGBM выведет, какие функции являются категориальными. Это не всегда работает хорошо (некоторые эксперименты показывают, почему здесь и Здесь ) И я настоятельно рекомендую вам установить категориальную функцию вручную просто с этим кодом

cat_col.select_dtypes (‘object’). columns.tolist ()

Но что происходит за кулисами и как LightGBM имеет дело с категориальными функциями? Согласно Документация Из Lightgbm мы знаем, что учащиеся деревьев не могут хорошо работать с одним горячим методом кодирования, потому что они глубоко растут через дерево. В предлагаемом альтернативном методе учащиеся деревьев оптимально построены. Например, для одной функции с k разные категории есть 2^(k-1)-1 возможный раздел и метод Фишера, который может улучшить до k * log (k) Найдя лучший способ сортированной гистограммы значений в категориальной особенности.

Lightgbm is_unbalance vs scale_pos_weight

Одна из проблем, с которыми вы можете столкнуться в бинарных проблемах классификации, заключается в том, как справиться с несбалансированными наборами данных. Очевидно, вам нужно сбалансировать положительные/отрицательные образцы, но как именно вы можете сделать это в LightGBM? В LightgBM есть два параметра, которые позволяют вам решать эту проблему is_unbalance и scale_pos_weight , но в чем разница между ними и как их использовать?

  • Когда вы устанавливаете is_unbalace: Правда, алгоритм попытается автоматически сбалансировать вес доминирующей этикетки (с фракцией POS/NEG в наборе поезда)
  • Если вы хотите изменить scale_pos_weight (Это по умолчанию 1, что означает, что предполагайте, что как положительная, так и отрицательная метка равны) В случае набора данных о дисбалансе вы можете использовать следующую формулу (на основе этой проблемы на репозитории LightGBM), чтобы правильно его установить

Sample_pos_weight от отрицательных выборок/количество положительных образцов

LGBM Feval

Иногда вы хотите определить пользовательскую функцию оценки для измерения производительности вашей модели, необходимой для создания функции «feval». Функция Feval должен принять два параметра:

  • предс
  • train_data

и возврат

  • eval_name
  • eval_result
  • is_higher_better

Давайте создадим пользовательскую функцию метрик шаг за шагом. Определите отдельную функцию Python

def feval_func(preds, train_data):
   # Define a formula that evaluates the results
    return ('feval_func_name', eval_result, False)

Используйте эту функцию в качестве параметра:

print('Start training...')
lgb_train = lgb.train(..., 
                      metric=None, 
                      feval=feval_func)

Примечание : Чтобы использовать функцию FEVAL вместо метрики, вы должны установить метрический параметр «Нет».

Парамы классификации против регрессионных параметров

Большинство вещей, которые я упоминал ранее, являются верными как для классификации, так и для регрессии, но есть вещи, которые необходимо скорректировать. В частности, вы должны:

Мы рассмотрели и узнали немного о параметрах LightGBM в предыдущих разделах, но ни одна статья о повышенных деревьях не будет полной, не упомянув невероятные тесты от Laurae 🙂 Вы можете узнать о лучших параметрах по умолчанию для многих проблем как для LightGBM, так и для XGBOOST. Вы можете проверить это здесь, но некоторые самые важные выводы:

Примечание : Вы никогда не должны принимать какое -либо значение параметров для самообеспечения и настраивать его на основе вашей проблемы. Тем не менее, эти параметры являются отличной отправной точкой для ваших алгоритмов настройки гиперпараметров

Наконец, после объяснения всех важных параметров пришло время провести некоторые эксперименты!

Я буду использовать один из популярных соревнований Kaggle: Прогноз транзакции клиентов Santander Анкет

Я буду использовать эту статью, которая объясняет Как запустить настройку гиперпараметра в Python на любом сценарии.

Стоит прочитать!

Прежде чем мы начнем, один важный вопрос! Какие параметры мы должны настроить?

  • Обратите внимание на проблему, которую вы хотите решить, например, набор данных Santander – это Высоко несбалансированно и должен учитывать это в вашей настройке! Laurae2 Один из участников Lightgbm, объяснил это здесь.
  • Некоторые параметры взаимозависимы и должны быть скорректированы вместе или настроены один за другим. Например, min_data_in_leaf зависит от количества обучающих образцов и num_leaves.

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

SEARCH_PARAMS = {'learning_rate': 0.4,
                 'max_depth': 15,
                 'num_leaves': 20,
                 'feature_fraction': 0.8,
                 'subsample': 0.2}

FIXED_PARAMS={'objective': 'binary',
              'metric': 'auc',
              'is_unbalance':True,
              'boosting':'gbdt',
              'num_boost_round':300,
              'early_stopping_rounds':30}

Делая это, вы держите свои базовые значения отделенными от пространства поиска! Теперь, вот что мы сделаем.

  • Сначала мы генерируем код в Ноутбук Анкет Это публично, и вы можете скачать его.
  • Во -вторых, мы отслеживаем результат каждого эксперимента на Neptune.ai Анкет

Анализ результатов

Если вы проверили предыдущий раздел, вы заметили, что я прошел более 14 различных экспериментов в наборе данных. Здесь я объясняю, как настроить ценность гиперпараметров шаг за шагом. Создайте базовый код обучения:

from sklearn.metrics import roc_auc_score, roc_curve
from sklearn.model_selection import train_test_split
import neptunecontrib.monitoring.skopt as sk_utils
import lightgbm as lgb
import pandas as pd
import neptune
import skopt
import sys
import os

SEARCH_PARAMS = {'learning_rate': 0.4,
                'max_depth': 15,
                'num_leaves': 32,
                'feature_fraction': 0.8,
                'subsample': 0.2}

FIXED_PARAMS={'objective': 'binary',
             'metric': 'auc',
             'is_unbalance':True,
             'bagging_freq':5,
             'boosting':'dart',
             'num_boost_round':300,
             'early_stopping_rounds':30}

def train_evaluate(search_params):
   # you can download the dataset from this link(https://www.kaggle.com/c/santander-customer-transaction-prediction/data)
   # import Dataset to play with it
   data= pd.read_csv("sample_train.csv")
   X = data.drop(['ID_code', 'target'], axis=1)
   y = data['target']
   X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=1234)
   train_data = lgb.Dataset(X_train, label=y_train)
   valid_data = lgb.Dataset(X_valid, label=y_valid, reference=train_data)

   params = {'metric':FIXED_PARAMS['metric'],
             'objective':FIXED_PARAMS['objective'],
             **search_params}

   model = lgb.train(params, train_data,                     
                     valid_sets=[valid_data],
                     num_boost_round=FIXED_PARAMS['num_boost_round'],
                     early_stopping_rounds=FIXED_PARAMS['early_stopping_rounds'],
                     valid_names=['valid'])
   score = model.best_score['valid']['auc']
   return score

Используйте библиотеку оптимизации гиперпараметров по вашему выбору (например, Scikit-Optimize)

neptune.init('mjbahmani/LightGBM-hyperparameters')
neptune.create_experiment('lgb-tuning_final', upload_source_files=['*.*'],
                              tags=['lgb-tuning', 'dart'],params=SEARCH_PARAMS)

SPACE = [
   skopt.space.Real(0.01, 0.5, name='learning_rate', prior='log-uniform'),
   skopt.space.Integer(1, 30, name='max_depth'),
   skopt.space.Integer(10, 200, name='num_leaves'),
   skopt.space.Real(0.1, 1.0, name='feature_fraction', prior='uniform'),
   skopt.space.Real(0.1, 1.0, name='subsample', prior='uniform')
]
@skopt.utils.use_named_args(SPACE)
def objective(**params):
   return -1.0 * train_evaluate(params)

monitor = sk_utils.NeptuneMonitor()
results = skopt.forest_minimize(objective, SPACE, 
                                n_calls=100, n_random_starts=10, 
                                callback=[monitor])
sk_utils.log_results(results)

neptune.stop()

Попробуйте разные типы конфигурации и отслеживайте свои результаты в Нептун

Наконец, в следующей таблице вы можете увидеть, какие изменения произошли в параметрах.

Короче говоря, вы узнали:

  • Какие основные параметры LightgBM,
  • Как создать пользовательские метрики с функцией Feval,
  • Каковы хорошие значения по умолчанию основных параметров,
  • Смола и пример того, как настроить параметры LightGBM, чтобы улучшить производительность модели.

И некоторые другие вещи 🙂 Для получения более подробной информации, пожалуйста, обратитесь к ресурсам.

Эта статья была первоначально написана MJ Bahmani и опубликовано в Блог Нептуна . Вы можете найти более подробные статьи для практикующих машинного обучения.

Оригинал: “https://dev.to/kamil_k7k/understanding-lightgbm-parameters-and-how-to-tune-them-14n0”