LightGBM
Son yıllarda veri boyutu ve çeşitliliğin hızla artması ile algoritma optimizasyonlarına verilen önem giderek artmaktadır. Bu sebeple Gradient Boosting algoritmasına alternatif olarak XGBoost, LightGBM, Catboost gibi Gradient Boosting’in versiyonları kabul edilebilecek algoritmalar geliştirilmiştir. Bu algoritmalar ile daha hızlı eğitim ve daha yüksek doğruluk elde edilmesi amaçlanmıştır.
Yazıda öncelikle LightGBM algoritmasının alt yapısı incelenecek, sonrasında Python uygulaması yapılarak Gradient Boosting ve XGBoost ile performansları karşılaştırılaştırılacaktır. Yazıdan daha iyi verim alabilmek için karar ağaçları ve boosting algoritmalarının yapısı hakkında genel bilgi sahibi olunması kolaylık sağlayacaktır. Gradient Boosting ve XGBoost ile ilgili yazılarıma link‘ten ulaşabilirsiniz.
LightGBM, Microsoft DMTK (Distributed Machine Learning Toolkit) projesi kapsamında 2017 yılında geliştirilmiş bir boosting algoritmasıdır. Diğer boosting algoritmaları ile karşılaştırıldığında yüksek işlem hızı, büyük verileri işleyebilmesi, daha az kaynak(RAM) kullanımı, yüksek tahmin oranı, paralel öğrenme ve GPU öğrenimini desteklemesi gibi avantajları vardır. Modelin tanıtıldığı “LightGBM: A Highly Efficient Gradient Boosting Decision Tree” makalesine göre, yapılan çalışmalarda LightGBM’in diğer modellere göre 20 kat daha hızlı olduğu sonucuna ulaşılmıştır. Makeleye buradan erişebilirsiniz.
NASIL ÇALIŞIR?
LightGBM, histogram tabanlı çalışan bir algoritmadır. Sürekli değere sahip olan değişkenleri kesikli(discrete bin) hale getirerek hesaplama maliyetini azaltır. Karar ağaçlarının eğitim süresi yapılan hesaplama ve dolayısıyla bölünme sayısı ile doğru orantılıdır. Bu yöntem sayesinde hem eğitim süresi kısalmakta hem de kaynak kullanımı düşmektedir.
Karar ağaçlarında öğreniminde seviye odaklı (level-wise or depth-wise) veya yaprak odaklı(leaf-wise) olarak iki strateji kullanılabilir. Seviye odaklı stratejide ağaç büyürken ağacın dengesi korunur. Yaprak odaklı stratejide ise kaybı azaltan yapraklardan bölünme işlemi devam eder. LightGBM bu özelliği sayesinde diğer boosting algoritmalarından ayrılmaktadır. Model yaprak odaklı strateji ile daha az hata oranına sahip olur ve daha hızlı öğrenir. Ancak yaprak odaklı büyüme stratejisi veri sayısının az olduğu durumlarda modelin aşırı öğrenmeye yatkın olmasına sebebiyet verir. Bu nedenle algoritma büyük verilerde kullanılmak için daha uygundur. Ayrıca ağaç derinliği, yaprak sayısı gibi parametreler optimize edilip aşırı öğrenmenin önüne geçmeye çalışılabilir.
LightGBM ayrıca diğer algoritmalardan farklı iki teknik kullanmaktadır. Bunlar, veri örneklerinin ve değişkenlerin sayısı ile ilgilenen Gradyan Tabanlı Tek Yönlü Örnekleme ve Özel Değişken Paketi’dir.
Gradyan Tabanlı Tek Yönlü Örnekleme (Gradient-based One-Side Sampling – GOSS): GOSS, karar ağaçlarının doğruluk oranını korurken veri sayısını azaltmayı amaçlamaktadır. Geleneksel Gradient Boosting her bir değişken(feature) için bilgi kazancını (information gain) hesaplamak adına tüm veri örneklerini tarar, ancak GOSS yalnızca önemli verileri kullanır. Böylece, verinin dağılımını fazla etkilemeden veri sayısını azaltılır.
Özel Değişken Paketi (Exclusive Feature Bundling – EFB): EFB, doğruluk oranına zarar vermeden değişken sayısını azaltmayı ve buna bağlı olarak model eğitiminin verimliliğini arttırmayı amaçlamaktadır. EFB’nin iki işlem adımı vardır. Bunlar, paket oluşturmak ve değişkenleri aynı pakette birleştirmektir. EFB ile seyrek özellikleri birleştirilip daha yoğun özellikler oluşturulur. Buna bağlı olarak karmaşıklığın azalmasına ve daha düşük bellek tüketimi ile birlikte daha hızlı eğitim sürecine yol açar.
Özetle, GOSS daha az önemli sayılabilecek verileri ihmal ederek bilgi kazanımını hesaplamak için veri boyutunu azaltırken, EFB boyutsallığı azaltmak için değişkenleri bir araya getirir. Bu iki işlev ile LightGBM eğitim sürecinin verimliliğini arttırır.
PARAMETRE OPTİMİZASYONU
LightGBM’de aşırı öğrenmeyi engellemek için learning_rate, max_dept, num_leaves, min_data_in_leaf parametreleri, öğrenim süresini hızlandırmak için feature_fraction, bagging_fraction ve num_iteration parametreleri optimize edilebilir.
Num_leaves, ağaçta bulunacak yaprak sayısıdır. Ağacın karmaşıklığını kontrol etmede kullanılan en önemli parametredir. Aşırı öğrenmeden kaçınmak için 2^(max_dept)’den küçük olması gerekmektedir. Örneğin, max_depth = 7 olduğunda, num_leaves değerini 127 olarak ayarlamak aşırı öğrenmeye neden olabilir. 70 veya 80 olarak ayarlamak daha iyi doğruluk elde edebilir.
Max_dept, kurulacak ağacın derinliğini limitlemek için kullanılır. Aşırı öğrenmeden kaçınmak için optimum seviyeye getirilmelidir. Çok dallanma aşırı öğrenmeye, az dallanma eksik öğrenmeye sebep olacaktır.
Min_data_in_leaf, aşırı öğrenmeyi engellemek için kullanılacak önemli parametrelerden biridir. Optimum değeri veri büyüklüğüne ve num_leaves’e bağlıdır. Büyük bir değer olarak ayarlamak ağacın büyümesini engelleyebilir ve eksik öğrenmeye neden olabilir.
Learning_rate, kurulan ağaçları ölçeklendirmek için 0-1 arasında verilen bir değerdir. Bu değerin küçük olması daha iyi tahmin gücüne yardımcı olacaktır. Ancak öğrenim süresini arttıracak ve aşırı öğrenme ihtimalini arttıracaktır.
Feature_fraction, her bir iterasyonda kullanılacak değişken; bagging_fraction, her iterasyonda kullanılacak veri sayısının ayarlanabileceği parametrelerdir. Num_iteration, öğrenme sürecinde yapılacak iterasyon sayısıdır. feature_fraction, bagging_fraction ve num_iteration sayıları öğrenim süresi ile doğrudan ilgilidir. Bu sayılar ne kadar az olursa öğrenim süresi o kadar az olacaktır. Ancak eksik öğrenmeye dikkat edilmesi çok önemlidir. Birçok deneme yapılarak optimum sayı bulunabilir.
UYGULAMA
Uygulamada XGBoost’un incelendiği “XGBoost Nasıl Çalışır? Neden İyi Performans Gösterir?” yazısında da kullanılan, Kaggle web sitesinden erişilebilen “Human Activity Recognition” veri seti kullanılmıştır. 30 gönüllü denek ile oluşturulan bu veri setinde, gönüllülere akıllı telefonlar üzerlerindeyken yürüme, merdiven çıkma, merdiven inme, oturma, kalkma ve uzanma hareketleri yaptırılmıştır. Veri setinin amacı elde edilen verilerle insan davranışlarının tahminlenmesidir. Veri setine link‘ten ulaşabilirsiniz.
Uygulama Windows 10 işletim sisteminde, Python ile Jupyter Notebook kullanılarak yapılmıştır.
#Uygulamada kullanılacak kütüphaneler tanımlanmıştır. import os import pandas as pd import numpy as np from warnings import filterwarnings filterwarnings('ignore')
df = pd.read_csv('Simplified_Human_Activity_Recognition.csv') df = df.drop(labels=['rn'], axis=1)
df.head()
df.shape
(3609, 562)
Datada 3.609 satır ve 562 sütun bulunmaktadır.
#bağımlı ve bağımsız değişkenler belirlenmiştir. y = df[['activity']] X = df.iloc[:,1:]
Uygulamada tahmini biraz daha zorlaştırmak için bağımlı değişken sayısı 561’den 20’ye düşürülmüştür.
X=X.sample(n=20, axis=1, random_state=1)
X.shape
(3609, 20)
#Veri seti %70 train, %30 test olarak bölünmüştür. from sklearn.model_selection import train_test_split, GridSearchCV X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state = 42)
Algoritmaların çalışma sürelerini ölçmek için “time” kütüphanesinden yaralanılmıştır.
#Gradient Boosting Uygulaması from sklearn.ensemble import GradientBoostingClassifier from time import time t0 = time() gbm_model = GradientBoostingClassifier() gbm_model.fit(X_train, y_train) gbm_time = time() - t0 gbm_acc = accuracy_score(y_test, gbm_model.predict(X_test))
#XGBoost Uygulaması from xgboost import XGBClassifier t0 = time() xgb_model = XGBClassifier() xgb_model.fit(X_train, y_train) XGBoost_time = time() - t0 XGBoost_acc = accuracy_score(y_test, xgb_model.predict(X_test))
#LightGBM Uygulaması import lightgbm as lgb t0 = time() lgb_model = lgb.LGBMClassifier() lgb_model.fit(X_train, y_train) lgb_time = time() - t0 lgb_acc = accuracy_score(y_test, lgb_model.predict(X_test))
#Doğru Tahmin Oranları ve Eğitim Süreleri Görselleştirilmiştir. import matplotlib.pyplot as plt fig, ax1 = plt.subplots() objects = ['GBM', 'XGBoost', 'LightGBM'] y_pos = np.arange(len(objects)) performance_time = [gbm_time, xgboost_time, lgb_time] performance_acc = [gbm_acc, xgboost_acc, lgb_acc] ax1.set_ylabel('Saniye') ax1.bar(y_pos, performance_time, color='forestgreen') ax1.tick_params(axis='y') ax2 = ax1.twinx() ax2.set_ylabel('Doğru Tahmin Oranı') ax2.plot(y_pos, performance_acc, color='red') plt.xticks(y_pos, objects) fig.tight_layout() plt.title('Model Performansları') plt.show()
SONUÇ
Yazıda LightGBM algoritmasını arkasındakitemeller ve diğer boosting algoritmalarından farkları üzerinde durulmuştur. Yapılan geliştirmeler ile benzeri algoritmalardan hem tahmin gücü hem de öğrenim süresi olarak daha iyi olduğu iddia edilmiştir. Yazı kapsamında yapılan analiz sonucuna göre de bu doğrulanmıştır. Karşılaştırmayı yukarıdaki grafikten inceleyebilirsiniz.
LightGBM tahmin başarısı olarak hem GBM’in hem de XGboost’un üzerindedir. Ayrıca öğrenim süresi en düşük olan algoritmadır. Yapılan analizde hazır bir veri seti kullanılmış olup veri seti fazla büyük değildir. Bu sebeple öğrenim süresinde XGBoost ile ciddi bir fark gözlemlenmemiştir. Ancak büyük verilerle çalışıldığında bu farkın çok daha bariz olacağı tecrübe ile sabittir 🙂
Bir sonraki yazıda Catboost algoritması incelenecektir. Soru ve yorumlarınızı yazının altında paylaşabilirsiniz.
KAYNAKLAR
LightGBM: A Highly Efficient Gradient Boosting Decision Tree – Guolin Ke, Qi Meng, Thomas Finley, Taifeng Wang, Wei Chen, Weidong Ma, Qiwei Ye, Tie-Yan Liu
https://github.com/microsoft/LightGBM
Simplifying Balance Sheet Adjustment Process In Commercial Loan Applications Using Machine Learning Methods – İbrahim Tozlu
An Ensemble Learning Model For Wide-Area Measurement Based Transient Stability Assessment In Power Systems – Can Berk Saner
Human Activity Prediction Using Lifelogging Data – Gizem Sarıarslan
Crop Classification With Polarimetric Synthetic Aperture Radar Images: Comparative Analysis – Mustafa Üstüner