Miuul 101

Herkes Ona Bağlanır, Ondan Enerji Alır, Büyük Ağaç: LightGBM

Microsoft tarafından geliştirilen, Gradyan güçlendirmesi tabanlı karar ağacı algoritması olan LightGBM tahmin modelleri için karar noktalarını en optimum şekilde ayırarak ürettiği ağaçlar ile başarılı tahminler üretmemize yardımcı olur.


Artist: huleeb


GBM ile artık optimizasyonu nasıl çalışır? 

Gradyan güçlendirmeli karar ağaçları günümüzde makine öğrenmesi alanında gerçekleştirilen projelerde en çok tercih edilen gözetimli öğrenme algoritmalarındandır. Boosting’in temelinde yatan birkaç zayıf öğrenciyi bir araya getirerek daha güçlü öğreniciler oluşturmaktır.  http://uc-r.github.io/public/images/analytics/gbm/boosted_stumps.gif
Source

Artıklar üzerine tek bir tahminsel model formunda olan modeller serisi kurulur. Önce bir model kurulur, F modeli, ve bu modelin hataları vardır. Hatalar bağımlı değişken olur. Modellendikten sonra bir daha artık elde edilir, artıklarla modellendirilir. Artıklar modellenerek zayıf sınıflandırıcılardan güçlü sınıflandırıcılar elde edilir. 'Boosting' algoritmalarında ana amaç karar noktalarını “Gradient Descent” kullanarak hassaslaştırma çabasıdır. Burada öngörücüleri sırayla deneyerek sonraki her model bir önceki modelin hatalarını düzelterek birbirine bağımlı ağaçları her denemede optimize etme hedeflenir. 

 

Kaynak: Quantdare 

  

LightGBM’in Diğer Boosting Algoritmalarından farkı nedir? 

Level-wise büyüme stratejisi yerine leaf-wise büyüme stratejisi, 

 

  • Level-wise büyüme ağaçları dengede tutarken, LightGBM leaf-wise stratejisini kullanarak dengesiz bir ağacın büyümesine izin vererek, en fazla kaybı olan yaprağı bölmeyi hedefleyerek kaybı minimalize eder. Level-wise büyüyen bir ağacı leaf-wise yönteme çevirebilirken bunun tersi için geçerli değildir. Leaf-wise düzey olarak büyümediği, ancak yaprak açısından büyüdüğü için, veriler küçük olduğunda aşırı öğrenme(overfit) olabilir. Bu durumlarda ağaç derinliğini kontrol etmek önemlidir.  
  • Breadth-first arama yerine depth first aramayı kullanır. 
    https://skilled.dev/images/tree-dfs-vs-bfs.gif
    Source 

    Breadth-first karar ağaçları, depth-first karar ağaçlarına benzer şekilde brute-force tarzında oluşturulur. Bir depth-first ağacında ilk olarak, kök düğüme yerleştirilecek bir öznitelik seçilir ve bu öznitelik için bazı kriterlere göre bazı dallar yapılır. Ardından, eğitim örneklerini kök düğümden uzanan her dal için bir tane olacak şekilde alt kümelere ayrılır. Ardından, seçilen bir dal için, yalnızca ona gerçekten ulaşan örnekler kullanılarak tekrarlanır. Her adımda, genişletmeler için mevcut olan tüm alt kümeler arasından "en iyi" alt küme seçilir. Bu oluşturma işlemi, tüm düğümler saf olana veya belirli bir genişleme sayısına ulaşılana kadar devam eder. Breadth-first ağaç yapısında yaprakların sırası her zaman aynıyken, depth-first ağacı için diğer sıralamaların duruma göre yeniden seçilebilecektir.  


LightGBM’i “Light” yapan özellik nedir? 


Karar ağaçlarında öğrenme sürecindeki eforun büyük çoğunluğu, ayrımın en iyi nereden yapılacağının bulunması kısmında harcanır. GBDT’nin önceki uygulamalarında, en iyi bölmeyi bulmak için “pre-sorted” (önceden sıralanmış) algoritma kullanılırken LightGBM’de “histogram based” (histogram tabanlı) algoritmalar kullanıldı.  

  • Pre-sorted: Önceden sıralanmış değerlerin tüm olası bölünme noktaları numaralandırılarak değerlendirme yapılır. 

  • Histogram Based: Eğitim sırasında özellik histogramları oluşturmak için sürekli özellikleri ayrı kutulara yerleştirilir. 

Histogram tabanlı algoritma, önceden sıralanmış algoritmadan daha verimli çalışır ancak hem gözlemler hem de özellikler açısından veri kümesinin boyutu arttıkça ikisi de yavaşlar.  

LightGBM, kullanımı daha efektif olan ve bellek kullanımı azaltarak şartlar sağlandığında hızlı bir eğitim sunan histogram tabanlı algoritma ile başladı ancak burada karşılaşılan temel sorun veri seti büyüdüğünde bilgi kazancı açısından en iyi bölünmeyi seçmek için bütün gözlemleri taraması bize zaman kaybı olarak geri dönmesi oluyordu. Bu tarama her özellik için yapıldığından histogram tabanlı algoritmanın başarısı veri boyutu ve değişken sayısına bağlıydı.  
 

Buna çözüm olarak, 

  • Gradient-Based One-Side Sampling (GOSS)
  • Exclusive Feature Bundling (EFB)  

uygulandı. 




Eğitim sırasında modelin veri dağılımını etkileyip doğruluğu etkilememesi için ne sadece küçük eğimli veri örneklerine ne de sadece büyük gradyanlı olanlara odaklanmasını isteriz. GOSS, elimizdeki verinin, veri dağılımını göz önünde bulundurarak bir ağaç çıkartır. En büyük gradyanlara sahip veri örnekleri seçilir. Daha küçükleri içerisinden rastgele olarak popülasyonun sadece rastgele olarak belli bir kısmı alınır. Küçük gradyana sahip gözlemler belli bir ağırlıkla çarpılarak dağılım korunmaya çalışılır. GOSS, temel olarak verinin tümünde karar noktaları oluşturmak yerine bunları kümeleyerek temas edilecek noktaları azaltıp odağı yoğunlaştırmaktır. 

 

EFB ise çok sütunlu veri setindeki özellik bakımından kıt olanları, çok sayıda sıfır değer içeren özellikler, içeriklerini bozmayacak şekilde birleştirerek seyrek özelliklerinin birbirini dışlamasının önüne geçilmiştir. Gereksiz boyutluluğu engelleyen bu yöntem karmaşıklığı azaltarak eğitime hız kazanmıştır.  

GBM = Desicion Tree + Boosting + Gradient Descent 
LightGBM = GBM + GOSS + EFB 

Bu iki ana faktör LightGBM’i “Light” yapan ana bileşenler olup kategorik olup kardinalitesi yüksek olan verilere karşı neden dayanıklı olup diğer algoritmalara göre başarılı olduğunu açıklar niteliktedir.  


Ne Zaman LightGBM? 
Küçük boyutlu veri setleri için uygun bir algoritma değildir. Karar noktalarını hassaslaştırma özelliğinden dolayı aşırı öğrenme(overfit) durumu gözlemlenebilir. Genel kullanım tavsiyesi 10K üstü satırlı veriler için uygun olduğu önerilse de kesin bir karar da yoktur konu ile ilgili. Büyük boyutlu veri setlerinde yüksek doğruluk sağlayacaktır. 
 

Parametre Seçimi ve Özellikleri 
LightGBM modelini Scikit-learn API içerisinden değil de, 

pip install lightgbm 
import lightgbm as lgb 

şeklinde kullanarak Training API içerisinden çağırdığımız vakit parametre seçenekleri kısmında birçok seçeneğimiz olacaktır. Bunların başlıca kullanılanları şu şekildedir:

 

Temel Parametreler

  • task: Çalıştırmak istediğiniz görevi belirtir. Ya eldeki veriler ile “train” ederek model kurulur ya da “predict” argümanı ile kurulan modelden tahminler üretilir. Varsayılan olarak “train” gelmektedir.
     
  • objective: Kurmak istediğiniz algoritmanın hangi probleme yönelik olduğunun belirtildiği parametredir. Varsayılan olarak “regression” gelmekle birlikte regression, binary, multiclass gibi problemler verilebilmektedir.
     
  • boosting: Boosting etme türünü belirtir. “gbdt”(traditional gradient boosting decision tree), “rf” (random forest), “dart”(dropouts meet multiple additive regression tree),”goss”(gradient-based one-side sampling) seçilebilir. Varsayılan olarak “gbdt” gelmektedir.

    a. GBDT: Çok sağlam temelli bir yöntemdir. Öğrenicileri makul bir hızda birleştirir.

    b. RF: Random forest temelli yöntemdir. Değer olarak”rf” ayarlandığı takdirde artık bagging methodu çalışacaktır.

    c. Dart: GBDT’deki aşırı öğrenme sorununu çözmeye çalışır. Sinir ağları, desen düzenlemeyi iyileştirmek ve yakalaması güç noktaları yakalayabilmesi için geliştirilmiştir. Daha iyi sonuç vermekle birlikte oldukça yavaştır ve kullanırken beraberinde gelen birçok parametreyi de ayarlayarak kullanmak gerekir. Bir DART güçlendirici kullanmayı tercih ederken, “drop-out” ı durdurmamız gerektiğinin farkında olmak önemlidir. Eğitim sırasında DART güçlendirici, bırakma gerçekleştirmeyi bekler.

    d. Goss: Örnekleri daha büyük gradyanlara ayırarak GBDT için yeni bir örnekleme yöntemi sağlar. Küçük veri setlerinde aşırı öğrenme sorunu vardır.

  • num_iterations: Gerçekleştirilecek güçlendirme turlarının sayısını, oluşturulacak ağaç sayısını kontrol eder. Varsayılan değer 100’dür. Birbiriyle zıt etkiye sahip olup bağlantılı olan “learning_rate” parametresini de beraber değiştirmek gerekir. Eğer “num_iteration” ı arttırırsanız, “learning_rate” i de azaltmalısınız. İterasyon sayısı arttıkça model kurma süresi de uzayacaktır. Modelin artık öğrenecek bir şeyi kalmadığında iterasyonu kesmek için “early_stop” parametresini de aktifleştirmek gerekir ki aşırı öğrenmeye gidilmeden eğitim kesilebilsin.

  • learning_rate: Model ağırlıkları her güncellendiğinde tahmini hataya yanıt olarak modelin ne kadar değiştirileceğini kontrol eden bir hiperparametredir. Varsayılan değer 0.1’dir. Çok küçük bir değerin seçilmesi zorlayıcıdır, çok küçük bir değer takılıp kalabilecek uzun bir eğitim süreci ile sonuçlanabilirken, çok büyük bir değer de optimal olmayan bir ağırlık setinin çok hızlı öğrenilmesine veya kararsız bir eğitim sürecine neden olabilir.

  • num_leaves: Ağaç yapısını ve karmaşıklığını kontrol etmek için en önemli parametredir. Tek bir ağaçtaki karar noktalarının sayısını belirler. 2^(max_depth)’ten daha küçük bir değere sahip olmalıdır. Varsayılan olarak 31 tanımlıdır.

  • device_type: LightGBM’i kendi kütüphanesinden çalıştırmanın en büyük avantajı gpu kullanılabiliyor olmasıdır. Varsayılan olarak cpu gelmekle beraber gpu ve cuda da seçilebilir.

  • seed: Farklı kişilerin ya da defalarca tekrarlanan durumlarda her defasında aynı model kısmının oluşturulup karşılaştırmaları daha düzgün yapmaya yardımcı olur. Her defasında parametre değiştirilmediğinde bile virgülden sonraki basamakların dahi aynı gelmesini sağlar. Varsayılan olarak “none” gelmektedir.

 

Kontrol Parametreleri 

  • max_depth: Maksimum derinlik ne kadar yüksekse, ağaç o kadar fazla seviyeye sahiptir, bu da onu daha karmaşık ve aşırı öğrenmeye iter hale getirir. Çok düşük değer verildiğinde de öğrenememe durumu ile karşılaşılacaktır. Model öğrenimi için önemli bir parametredir. Varsayılan değeri -1’dir. 

  • min_data_in_leaf: Bir yapraktaki minimum örnekleri tanımlar. Optimal değeri eğitim örneklerinin sayısına ve num_leaves’e bağlıdır. Modelinizin aşırı öğrenmeye gittiğini hissettiğinizde değerini arttırabilirsiniz. Varsayılan değer 20’dir. 

  • bagging_fraction: Satırlar için kullanılır, yineleme yapmadan verilerin bir kısmını rastgele seçerek kullanılacak veri oranını belirtir. Eğitim süresini hızlandırıp aşırı öğrenmeyi azaltabilir. Varsayılan değeri 1’dir. 

  • feature_fraction: Değeri 1.0’dan küçükse her yinelemede rastgele bir özellik alt kümesi seçilecektir. Örneğin 0.75 verilen değerde model ağaç oluşturmak için her yinelemede toplam özelliklerin %75’ini rastgele seçecektir. Eğitim süresini hızlandırıp aşırı öğrenmeyi azaltabilir. Varsayılan değeri 1’dir. 

  • bagging_freq: Bagging sıklığını ifade eder. 0 demek bagging metodunu devre dışı bırakır. bagging_fraction * N_train_examples boyutunun eğitim örneklerinin bir alt kümesini örnekler. Ve k’ncı ağacın eğitimi bu altkümede gerçekleştirilir. Bu örnekleme, her ağaç için (yani her yineleme) veya her bagging_freq ağacı eğitildikten sonra yapılabilir. Her frekans değerince yinelemede, sonraki frekans değeri yinelemesi için kullanılacak verilerin bagging_fraction * %100'ünü rastgele seçecektir. Bagging’i etkinleştirmek için “bagging_fraction” değerini de 1’den küçük bir değere ayarlanmalıdır. Varsayılan değer 0’dır. 

  • early_stopping: Doğrulama metriğince gelen değer önceki değerden daha iyi bir değere sahip olamayıp modelin gelişimi artık durduysa aşırı öğrenmeye kaçmamak için model eğitimi en optimum noktada kesilir. Varsayılan olarak false gelmektedir. 

  • max_cat_threshold: Kardinalitesi yüksek olan kategorik değişkenleri on-hot kodlamak ağacı dengesiz bir yapıya sokma riski taşır ve iyi bir doğruluk elde etmek için çok derinlere büyümesi gerekir. Bu noktada kardinalitesi yüksek olan değişkenlere en uygun çözüm, kategorilerini 2 alt kümeye bölerek kategorik bir özelliği bölmektir. Bunu gerçekleştirirken de veriye uygun max_cat_threshold değeri belirlemeliyiz. 0’dan büyük olmak zorunda olup varsayılan değeri 32’dir. 
     

IO Parametreleri  

  • max_binDeğişken başına gelecek maksimum benzersiz değer sayısıdır. Küçük verilen max_bin değeri performansı arttırır. Varsayılan değer 255’tir. 

  • use_missingLightGBM yapısı gereki eksik veriler ile başaçıkabilir. Boş gelen değerler model oluşturulmasını engellemez. Varsayılan değer true’dur ancak eksik veri başaçıkmasını devre dışı bırakmak için bu parametreyi kapatmak gerekir. 

  • zero_as_missingVarsayılan değeri false olarak gelmektedir. Veri setindeki boş değerleri 0 olarak atayıp boş değer doldurmayı lightGBM’e bırakmak istiyorsanız bunu true yapmanız gerekir. 
     



Özetleyecek olursak lightGBM ile karar ağacı oluştururken dikkat edilmesi gereken nokta oluşturduğumuz ağacın leaf-wise bir büyüme stratejisi sergilediğidir. Bu bağlamda ağacımızın “num_leaves”, “max_depth” ve “min_data_in_leaf” parametrelerini hep kontrol altında tutmalıyız. Oluşturulacak ağacın ana iskeletini yapraklarının ve derinliğinin etkilediğini her zaman göz önünde bulundurmak gerekir. Parametre optimizasyonu yaparken eğer koşullarınız elverişli ise hızı arttırmak için GPU kullanımı ile ağacınızı oluşturabilirsiniz, hız kazandıracaktır. İterasyon sayısı ile öğrenme sıklığının ters ilişkiye sahip olduğunu birinin değiştirilmesi halinde ötekinin de revize edilmesi gerektiği unutulmamalı. Küçük öğrenme hızı ile ne kadar çok iterasyon yaparsanız o kadar ağaç oluşturulup eğitim süresiniz de o kadar artacaktır. Her iterasyon basamağında oluşturulan yeni ağaçların bir kazanım sağladığının garantisi yoktur. Buna çözüm olarak iyileştirme sonlandığı vakit model geliştirmesini durduracak parametreyi, “early_stop”, çalıştırmak gerekir, böylece aşırı öğrenmeden bir adım kaçınmış olacaksınız.  

LightGBM yapısını ve kullanılması gereken parametreleri elimden geldiğince aktarmaya çalıştım, değerli vaktiniz için teşekkür eder bir sonraki yazıda görüşmek üzere.

Kaynaklar: I - II - III - IV - V

Parametre optimizasyonuna pratik bir çözüm: Optuna

Cem İstanbullu

Büyük Veri Dünyasının Küçük Sarı Fili: Hadoop

Oğuz Erdoğan

Matrisler

Nehir Günce Daşcı
Kaan Çullu

Çok faydalı bir yazı olmuş, teşekkürler.

SON 101'LER

GİRİŞ

Aşağıya kaydolduğunuz e-postayı girin. Şifrenizi sıfırlamanız için size bir bağlantı göndereceğiz.

Giriş Ekranına Dön
Şifre sıfırlama talimatları
adresine gönderildi.