Тази публикация в блога трябва да ви представи въведение в това какво представлява LightGBM, как се различава от другите алгоритми на дървото на решенията, какви нови функции носи и примерен код за неговото изпълнение. Това ще бъде придружено от няколко красиви картини на Emil Carlsen, който много обичаше да рисува дървета, вместо да ги засажда в Python.

Какво е градиентно усилване?

Gradient Boosting е метод, по време на който слабите учащи и непрекъснато се подобряват в силни учащи. За разлика от Random Forest, в която всички дървета са изградени независимо, Boosted Trees вероятно ще достигнат по-висока точност поради непрекъснатото обучение.

Един от най-популярните е XGBoost. Той е известен със своята популярност в Kaggle, скорост и надеждна производителност за многокласови класификационни проекти. XGBoost е само един тип от няколко дървета за вземане на решения с градиентно усилване (GBDT).

Проблемът с дърветата на решенията с градиентно усилване

Дърветата в GBDT се обучават последователно чрез оценка на остатъчните грешки на всяка итерация и подобряване на следващата. GBDTs трябва да изчислят печалбата от информация във всички случаи и да вземат предвид всички възможни точки на разделяне, докато правят това. Това отнема много време! В резултат на това с появата на големи данни те са изправени пред предизвикателства, особено поради недостатъчната скорост.

Срещнах този проблем, когато изпълнявах търсене в мрежа за модел XGBoost. Обучението на модела отне векове! И така, когато разбрах за LightGBM, бях заинтригуван.

Какво представлява усилване на градиента на светлината?

LightGBM е един от най-новите видове GBDT. Разработен е от екип от изследователи в Microsoft през 2016 г. Казано по-просто, Light GBM въвежда две нови функциикоито не присъстват в XGBoost. Целта им е да помогнат на алгоритъма с голям брой променливи и екземпляри на данни.

Какви са тези нови функции?

1. Базирано на градиент едностранно вземане на проби

Това е метод за вземане на проби, който намалява количеството данни, които дървото на решенията използва за обучение.

Този метод на вземане на проби отчита размера на градиента (=грешка при обучение). Той запазва случаите, в които грешката все още е голяма. Екземплярите с малка грешка се избират на случаен принцип, преди да бъдат въведени в дървото. В резултат на това всяко дърво трябва да обработва по-малко данни!

2. Изключително групиране на функции

Както можете да познаете от името, този метод намалява броя на характеристиките или променливите. Много често голям брой характеристики на вашия набор от данни са оскъдни (предимно нули), особено ако работите с много категорични променливи. Много от тях са взаимно изключващи се в същото време. Този метод обединява тези много сходни функции заедно в една функция.

И двете характеристики водят до това, което е общото предимство на LightGMB пред XGBoost и други GBDT — той е по-малко изчерпателен от изчислителна гледна точка и следователно е по-бърз! Можете да намерите по-конкретна информация за неговата структура в този документ и в официалната документация.

Ползите могат да бъдат:

  • По-висока скорост на тренировка
  • По-ниско използване на паметта
  • По-висока точност
  • GPU и паралелно обучение
  • По-лесно използване на мащабни данни

Някои параметри за настройка

Ако сте използвали GBDT преди, ще сте запознати с повечето от тях. Ето списък с параметри, които можете да настроите или да въведете в мрежата за търсене, за да намерите оптималната си комбинация.

  • Максимална_дълбочина — за ограничаване на сложността и предотвратяване на пренастройване
  • Брой_листа — за ограничаване на сложността и предотвратяване на пренастройване, трябва да бъде по-малък от 2^(max_depth)
  • Bagging_fraction — указва частта от данните, която да се използва за всяка итерация, ще увеличи скоростта
  • Learning_rate— увеличава точността, ако е зададена на малка стойност
  • Num_iterations— брой на стимулиращи взаимодействия, по подразбиране е 100, увеличете за по-голяма точност
  • Устройство — опции: „gpu“ или „cpu“, изберете „gpu“ (графичен процесор) за по-бързо изчисление

Използване на LightGBM

Инсталирайте пакета

#install and import the package
!pip install lightgbm
import lightgbm as lgb

Това е пример за тръбопровод, използващ MinMax скалер, PCA компресия, търсене в решетка и, разбира се, Light GMB!

#instantiate the classifier
LGBM_pipeline = lgb.LGBMClassifier()

#Build the pipeline
lgb_baseline_grid = Pipeline([(‘scl’, MinMaxScaler()),
(‘pca’, PCA(n_components=45)),
(‘clf’, LGBM_pipeline)])

#Set grid search parameters
param_grid_lgb = {
‘learning_rate’: [0.1,0.2], #=eta, smaller number makes model more robust by shrinking weights on each step
‘max_depth’: [20,40,80], #max depth of a three, controls overfitting
‘min_child_weight’: [40], #minimum sum of weights of all observations required in a child, higher values reduce over-fitting
‘subsample’: [0.6], #the fraction of observations to be randomly samples for each tree.
‘n_estimators’: [50,100],
}
grid_lgb = GridSearchCV(LGBM_pipeline, param_grid_lgb, scoring=’accuracy’, cv=None, n_jobs=1)

#train the model
grid_lgb.fit(X_train, y_train)
best_parameters = grid_lgb.best_params_
print(‘Grid Search found the following optimal parameters: ‘)
for param_name in sorted(best_parameters.keys()):
print(‘%s: %r’ % (param_name, best_parameters[param_name]))
training_preds = grid_lgb.predict(X_train)
test_preds = grid_lgb.predict(X_test)
training_accuracy = accuracy_score(y_train, training_preds)
test_accuracy = accuracy_score(y_test, test_preds)

#Print the training and validation accuracy of the optimal grid search result
print(‘’)
print(‘Training Accuracy: {:.4}%’.format(training_accuracy * 100))
print(‘Validation accuracy: {:.4}%’.format(test_accuracy * 100))

Какви бяха моите резултати?

В моя случай забелязах голямо увеличение на скоростта при обучение на моя модел в сравнение с XGBoost. Повиших точността на моя модел с 1%. Това не е голяма промяна, но увеличаването на скоростта на обучението може да има голяма разлика, ако обучавате своя модел върху голям набор от данни с много параметри във вашето търсене в мрежа!