XGBoost LightGBM’e Karşı
XGBoost ve LightGBM en yaygın ve en popüler gradient boosting çerçeveleri. Bugün kaggle yarışmalarının yarısından fazlası derin öğrenme yöntemlerini değil bunlardan birisini kullanıyor. Tabi ki sadece tek bir iyi yok. Her iki yazılım çerçevesi de artılara ve eksilere sahip. Bu yazıda bahsi geçen bu kütüphaneleri karşılaştırarak olumlu ve olumsuz özelliklerini listeleyeceğiz. Böylelikle sizin projenize ait doğru çözümü seçmenize yardımcı olabilecek bir rehber oluşturmayı hedefledik.
Ağacın büyüme şekli
İki çerçeve arasındaki en büyük farklılık karar ağacını oluşturma şekilleri. XGBoost seviye bazlı büyüme yöntemini (Level-wise tree growth) tercih ederken, LightGBM yaprak bazlı büyüme yöntemini (leaf-wise tree growth) tercih ediyor. Seviye bazlı yaklaşım yatay olarak büyür ve bir alt seviyeye geçmek için mevcut bulunulan seviyenin açılmasını bekler. Yaprak bazlı yaklaşım ise gidebildiği kadar diklemesine ağacı açmaya devam eder, maksimum derinliğe ulaştığında yukarıdan itibaren diğer dalı diklemesine açmaya başlar.
Eğer karar ağaçlarını tamamen açacak olsaydık bu iki yaklaşım da aynı ağacı oluşturacaktı. Ancak çoğunlukla ağaçların tamamen açılmasına izin vermeyiz. Aşırı öğrenmeyi (overfitting) önlemek adına erken durma kriteri (early stop) ya da budama yöntemlerini sıklıkla uygularız. Bununla birlikte yaprak bazlı yaklaşım ağacı global kayba göre kırarken seviye bazlı yaklaşım o dalın sebep olduğu kayba göre kırmaktadır. Bu sebeplerle her iki yaklaşım farklı karar ağaçları üretmektedir.
Bu noktada seviye bazlı yaklaşımın daha yavaş ama daha güçlü modeller ürettiğini söyleyebiliriz. Bundandır ki LightGBM 10 kat daha hızlı iken, XGBoost ile üretilen modeller %1-2 aralığında daha başarılıdır. Bu arada XGBoost yeni verisyonunda yaprak bazlı ağaç büyümesine destek vermeye başladı ancak varsayılan konfigürasyonu halen seviye bazlı büyümedir.
Kategorik öznitelikler
Veri setinizde kategorik öznitelikler (features) varsa her iki uygulamanın bunları ele alış şekli tamamen farklıdır. Öncelikle her iki uygulama da nümerik olmayan öznitelik ve hedef değerlerini nümeriğe dönüştürmemizi beklemektedir. Karar noktasında da ikili bölme uygulayarak eğer bir değerden büyük eşitse ya da küçükse şeklinde dallanmaktadır.
Varsayalım evcil hayvanınızın cinsi şeklinde bir kolonunuz var ve kediye 1, köpeğe 2, kuşa 3 şeklinde değer atadınız. Karar ağacı eğer hayvanın cinsi >= 2 şeklinde bir kuralla kırılması veri setinin kedi ya da değil şeklinde gruplanması demekdir. Bu istediğimiz bir şey olmaz. Bunun gibi kategorik alanlar için eğer kedi ise, eğer köpek ise, eğer kuş ise gibi her kategorinin farklı dallara ayrılmasını isteyebiliriz.
Bu noktada LightGBM’e bu kolonlar kategoriktir dememiz yeterli olmaktadır.
1 2 3 4 5 6 7 8 |
#LightGBM train = lightgbm.Dataset(x, y , feature_name = ['Yaş', 'Cinsiyet', 'Ağırlık', 'Cins'] , categorical_feature = ['Cins']) |
Ancak XGBoost her durumda karar noktalarını binary olarak kırmaktadır. Cins kolonuna one-hot encoding uygulayarak bu eksikliğin çevresinden dolanabiliriz.
1 2 3 4 5 6 7 8 9 10 |
#XGBoost unique_classes = df['Cins'].unique() one_hot = pd.get_dummies(unique_classes, prefix='Cins') one_hot['Cins'] = unique_classes df = df.merge(one_hot, on = ['Cins'], how='left') df = df.drop(columns = ['Cins']) |
One hot encoding’i pandas ile uyguladık ve pandas single core çalışan bir kütüphane. Sklearn ile uygulasaydık da single core çalışacaktı. Özetle bunu yapmak yavaş bir işlem olacak ve büyük veri setlerinde canımızı sıkabililir.
Öte yandan, haftanın günü şeklinde bir özniteliğiniz varsa bunları 1’den 7’ye kadar numaralandırabilirsiniz. Karar ağacı da eğer gün >=6 şeklind bir kural oluşturabilir ki bu hafta içi ve haftasonunu ayırmaktadır. Buradan da anlamlı örüntüler çıkabilirler.
İşleme birimi
Sahip olduğunuz işleme birimine göre yazılım çerçevelerinin davranışları değişmektedir.
LightGBM’in 10 kat kadar hızlı olduğunu söylemiştim. Ancak bu fark CPU üzerinde çalışırken gözlemlenmekte. GPU kullanacaksanız işler tersine dönecek ve bu sefer XGBoost daha hızlı olacaktır.
Öte yandan LightGBM’i GPU ile kullanmak biraz problematik. Varsayılan yöntem ile kurulan paketlerde gpu desteği malesef yok. Paket kurulumunu gpu dağıtımı için çalıştırmalısınız ve dua edin ki hata almayın…
1 2 3 4 5 6 |
#LightGBM !pip install lightgbm --install-option=--gpu |
Fakat, XGBoost’u GPU ile kullanmak oldukça kolay. Varsayılan paket kurulumuyla birlikte gpu desteği de geliyor. Model eğitim parametrelerinde gpu kullanmak istediğinizi söylemeniz de yeterli.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#XGBoost params = { 'learning_rate': 0.01, 'n_estimators': 250, 'object': 'multi:softmax', 'nthread': 4, 'gpu_id': 0, 'tree_method': 'gpu_hist' } |
Sonuç
Makine öğrenmesi modellerinizi kurumsal bir ortamda oluşturacaksınız büyük ihtimalle elinizde GPU’lar ve kuvvetli CPU’lar olacaktır. Bu durumda XGBoost kullanmanız daha ölçeklenebilir şeyler üretmenizi sağlayacaktır.
Modelinizi kişisel ortamınızda geliştirecekseniz ve GPU’nuz yoksa ve sınırlı bir CPU gücünüz varsa, LightGBM’i projenizin erken saflarında kullanabilirsiniz. Daha hızlı modelleme yeteneği sayesinde öznitelik mühendisliğine (feature engineering) daha fazla zaman ayırmanıza katkıda bulunacaktır. Unutmayın ki öznitelik mühendisliği en çok deneme yanılmayı yapacağınız ve en çok zamanı ayıracağınız kısım olacaktır. Projenizin sonlarına doğru XGBoost’a geçiş yapmayı düşünebilirsiniz. Çünkü o zamana kadar öznitelik mühendisliği tamamlanmış olacak ve bu geçiş ile daha başarılı modeller kurabileceksiniz.
Tabi veri setiniz oldukça büyük ve çok sayıda kategorik özniteliğiniz varsa tercihinizi doğrudan LightGBM olarak da yapabilirsiniz. Ya da H2O üzerinden XGBoost’u tüketmeniz sizi oldukça hızlandıracaktır.
Aynı veri setini hem XGBoost hem de LightGBM ile nasıl modelleyeceğinize ait kaynak kodu bu repo‘da paylaştım.
İhtiyacınız daha hafifsiklet bir çözümse Chefboost‘u da kullanmayı düşünebilirsiniz.
Bu yazı, XGBoost vs LightGBM yazısından Türkçe’ye çevrilmiştir.