Light GBM from Microsoft

Olduqca populyar və tez-tez beynəlxalq yarışlarda istifadə olunan və Microsoft tərəfindən təklif olunan Light GBM alqoritmi, hesablamanı çox sadələşdirir, sürətləndirir və dəqiqləşdirir. Bu postda daha çox hiperparametrlərlə işləmə qaydası, data preprocessing və modelin yaradılması oxuyuculara çatdırılacaqdır.

Turqut Abdullayev (QSS)https://qss.az , Gulab Yusifli
06-01-2019

        Light GBM, Microsoft tərəfindən C++ da yazılan Machine Learning alqoritmidir. Bu alqoritm normal bildiyimiz ağac alqoritmlərinə bənzəyir, sadəcə alqoritm budaqlanan zaman depth-wise metodunun əvəzinə, leaf-wise metodundan istifadə edir. Əslində metodlardan istifadə edilən zaman eyni nəticəni almaq mümkündür, sadəcə burada əsas prinsip budaqlanmanın necə artmasıdır.

Most decision tree learning algorithms

Light Gradient Boosting Machine

        Doğrudur, data olduqca kiçik olduqda model overfitting-ə meylli olduğuna baxmayaraq, prosesi *max_depth* paratmetri ilə optimallaşdırmaq olar.

        Alqoritmlə işləmə zamanı tövsiyyə olunur ki, kateqorik sütunları one-hot encoding metodu ilə açmaq əvəzinə həmin sütunu(ları) indeksləşdirərək, bölünmə prosesinə Light GBM-ə ötürək. Həqiqətən belə olduğuna əmin olmaq üçün az altqruplardan ibarə olan kateqorik sütunları dummy variable-lara çevirərək test edə bilərik. Amma altqupların sayı çox olduqda bu demək olar ki, mümkün olamayacaq, səbəb — yaddaşın çox olmaması olacaqdır.

What One-Hot Encoding means

Nümunə


library(mltools)
library(dplyr)
library(data.table)
df=data.table(tehsil = as.factor(c('bakalavr','magistr')),age = c(20:21))
result = one_hot(df)

df # initial data

     tehsil age
1: bakalavr  20
2:  magistr  21

result # after one-hot encoding

   tehsil_bakalavr tehsil_magistr age
1:               1              0  20
2:               0              1  21

        Light GBM-in tərkibində həddindən artıq çox parametr mövcuddur. Biz onların arasında olan və training mərhələsində daha çox effektiv olanları nəzərdən keçirəcəyik.

Məsələn: bagging_fraction=0.2, bagging_freq=3. Bu o deməkdir ki, training dataset-dən hər dəfə 0.2 istifadə olunaraq 3 dəfə hesablanacaq. 3 iterations bitdikdən sonra data-dan yeni sample-lar əldə olunacaq.

Üstünlüklər:

  1. Training sürətləndirilir
  2. Overfitting qarşısı alınır
  1. gbdt, traditional Gradient Boosting Decision Tree
  2. rf, Random Forest
  3. dart, Dropouts meet Multiple Additive Regression Trees
  4. goss, Gradient-based One-Side Sampling
  1. serial, single machine tree learner
  2. feature, feature parallel tree learner
  3. data, data parallel tree learner
  4. voting, voting parallel tree learner

        Daha çox parametrlər haqqında məlumat əldə etmək üçün, bu linkə keçid etməlisiniz:

https://lightgbm.readthedocs.io/en/latest/Parameters.html

Nümunə üzərində modelləşdirmə

        İndi isə biraz real case-də nümunəyə nəzər yetirək. Nümunədən əvvəl qeyd edim ki, kitabxananı install etmək üçün github səhifəsinə keçid edin.

İzah edəcəyimiz nümunə bank datasını əks etdirir, datada 17 sütun mövcuddur:


Observations: 22,068                                                                                 
Variables: 17
chr [10]: job, marital, education, default, housing, loan, contact, month, poutcome, y
dbl [ 7]: age, balance, day, duration, campaign, pdays, previous

        Datanı github səhifəsindən lokala endirək, faktorları da indekslərə çevirək və son addım olaraq output-da olan sütunu 0 və 1-ə kodlayaq.


library(data.table)
library(lightgbm)
library(dplyr)

df = fread(
  'https://github.com/jubins/Bank-Marketing-Multivariate-Analysis/raw/master/bank.csv') %>% 
  mutate_if(is.character,as.factor) %>% mutate_if(is.factor,as.numeric)

df$y = as.integer(car::recode(df$y, "2=1;1=0"))

        Data haqqında qısa məlumat:

The data is related with direct marketing campaigns of a Portuguese banking institution. The marketing campaigns were based on phone calls. Often, more than one contact to the same client was required, in order to access if the product (bank term deposit) would be (‘yes’) or not (‘no’) subscribed.

        Preprocess mərhələsi çox sadədir. Bunun üçün ən qısa yol sütunlardakı faktorları indeksləşdirərək hesablamanı başlada bilərik. Əlbəttə ki, biz Light GBM-dən istifadə qaydasını göstərmək üçün edirik, performans olaraq data üzərində minlərlə metoddan istifadə edərək transformasiyalar həyata keçirmək olar.


train = sample_n(df, nrow(df) * 0.8)
test = anti_join(df, train)

Parametrləri də müəyyən etdikdən sonra, prosesi başlatmaq olar.


# Parametrlər
p2 <- list(objective = "binary", 
           boost="gbdt",
           metric="auc",
           boost_from_average="false",
           learning_rate = 0.01,
           num_leaves = 6,
           max_depth=6,
           tree_learner = "serial",
           feature_fraction = 0.2,
           bagging_freq = 5,
           bagging_fraction = 0.4,
           min_data_in_leaf = 85,
           verbosity = 1,
           seed=123
)

        Modeli run etmək üçün lgb.train funksiyasından istifadə etmək lazımdır. Amma nəzərə almaq lazımdır ki, alternativ metod cv booster daha da yaxşı nəticə əldə etməyə kömək edə bilər.


model<- lgb.train(data = dtrain,
                  params= p2, 
                  nrounds=10000, 
                  valids = list(val1=dtrain , val2 = dtest), 
                  metric="auc",
                  obj = "binary",
                  eval_freq = 500, 
                  early_stopping_rounds=50
)

Nəticə


[LightGBM] [Warning] verbosity is set=1, verbose=1 will be ignored. Current value: verbosity=1
[LightGBM] [Warning] metric is set=auc, metric=auc will be ignored. Current value: metric=auc
[LightGBM] [Warning] verbosity is set=1, verbose=1 will be ignored. Current value: verbosity=1
[LightGBM] [Warning] Starting from the 2.1.2 version, default value for the 
"boost_from_average" parameter in "binary" objective is true.
This may cause significantly different results comparing to the previous versions of LightGBM.
Try to set boost_from_average=false, if your old models produce bad results
[LightGBM] [Info] Number of positive: 4241, number of negative: 31927
[LightGBM] [Info] Total Bins 998
[LightGBM] [Info] Number of data: 36168, number of used features: 16
[LightGBM] [Warning] verbosity is set=1, verbose=1 will be ignored. Current value: verbosity=1
[1]:    val1's auc:0.641237 val2's auc:0.642355 
[501]:  val1's auc:0.913739 val2's auc:0.917957 
[1001]: val1's auc:0.919842 val2's auc:0.922175 
[1501]: val1's auc:0.922546 val2's auc:0.922958 

        Yuxarıda görünən odur ki, bin sayı 998-ə bərabərdir. Bu parametri də dəyişib modeli yenidən run edə bilərik, çünki hiperparametrlərlə oynamaq həmişə performansı az da olsa dəqiqləşdirə bilər.

İndi isə test seti yenidən proqnoz edib ehtimalları əldə edə bilərik.


pred = predict(model,test %>% select(-y)%>% as.matrix())

Metrics::auc(test$y %>% as.numeric(),pred)

 0.9230309

Baxmayaraq ki, hiperparametrlərlə işləməmişik, AUC ~ 0.93-ə bərabərdir. Bu olduqca güclü nəticədir.

        Əgər postla bağlı hər hansı bir sual və ya çətinlik yaranarsa, aşağı hissədə suallarınızı yerləşdirə bilərsiniz.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

Citation

For attribution, please cite this work as

Abdullayev & Yusifli (2019, June 1). Data Experts: Light GBM from Microsoft. Retrieved from http://dataexperts.tech/posts/2020-01-21-lightgbm/

BibTeX citation

@misc{abdullayev2019light,
  author = {Abdullayev, Turqut and Yusifli, Gulab},
  title = {Data Experts: Light GBM from Microsoft},
  url = {http://dataexperts.tech/posts/2020-01-21-lightgbm/},
  year = {2019}
}