LightGBM ile Merhaba Dünya

0 2.431

Karar ağacı tabanlı makine öğrenmesi algoritmalarının Kaggle yarışmalarını domine ettiği bir gerçek. Kazanan çözümlerin yarısından fazlası XGBoost algoritmasını benimsemiş durumda. Microsoft da kendi gradient boosting altyapısı olan LightGBM‘in duyurusunu geçtiğimiz yıl yapmıştı. LightGBM’ şu günlerde tüm ilgiyi üzerine çekmiş durumda. Kaggle yarışmacıları LightGBM’i XGBoost’tan daha fazla kullanmaya başlaması bunun bir göstergesi. Araştırmalar XGBoost ile (biraz) daha iyi sonuçlar üretildiğini gösterse de LightGBM kısa bir süre öncesine kadar 10 kat, şu an ise 6 kat daha hızlı çalışmakta. Kaggle türevi yarışmalarda da nitelik mühendisliği ve yüzlerce model ile deneme yapma ihtiyacı hızı başarıdan daha önemli kılmakta. Şimdiden onlarca LightGBM ile oluşturulmuş model kaggle yarışmalarında podyuma çıkmış durumda.

pip install lightgbm komutunu çalıştırarak paketi yükledikten sonra altyapıyı kullanabiliyorsunuz. Sonrasında python kodunuzda ilgili kütüphaneyi şu şekilde referans göstermeniz gerekiyor.

Veri seti

Veri madenciliği derslerinden sıklıkla alışkın olduğunuz hava durumu, sıcaklık, nem ve rüzgar niteliklerine istinaden golf oynama kararlarının verildiği veri seti üzerinde çalışacağız. Veri setine buradan erişebilirsiniz. Bu veri setini seçtim çünkü hem nümerik hem de metin niteliklerini içeriyor. Karar sütunu niteliklere göre kurallarını çıkarmak istediğim hedef sütunu. Veri setini pandas ile yüklemem ileriki adımlarda kolon bazlı işlemleri daha kolay yapmamı sağlayacak.

Veri setim pandas’ın data frame formatında saklanacak. Data frame’in head fonksiyonu ile veri setinin ilk 5 satırını görüntüleyebilirim.

Outlook Temp. Humidity Wind Decision
0 Sunny 85 85 Weak No
1 Sunny 80 90 Strong No
2 Overcast 83 78 Weak Yes
3 Rain 70 96 Weak Yes
4 Rain 68 80 Weak Yes

Etiketlerin kodlanması

LightGBM, kategorik yani metinsel niteliklerin tam sayıya dönüştürülmesini beklemekte. Burada sıcaklık ve nem sütunları zaten sayı halindeler. Fakat hava durumu ve rüzgar sütunları kategorik halde, bu sütunları dönüştürmeliyiz. Dönüşüm için scikit-learn kütüphanesinin dönüştürücüsünü kullanacağım.

Her ne kadar kategorik nitelikler tam sayıya dönüştürülse de kategorik olanları belirtmemiz gerekecek. Bu sebeple yukarıdaki kod bloğunda nitelikleri (features) ve kategorik nitelikleri (categorical_features) ayrı değişkenlerde tuttum.

Veri setini tekrar görüntüleyelim.

Outlook Temp. Humidity Wind Decision
0 2 85 85 1 0
1 2 80 90 0 0
2 0 83 78 1 1
3 1 70 96 1 1
4 1 68 80 1 1

 

Böylelikle veri seti son formuna dönüştürülmüş oldu. Şimdi de LightGBM’e beslemek için girdi niteliklerini ve çıktı etiketlerini ayırmamız gerekiyor. Son durumda bunları aşağıdaki değişkenlerde numpy dizisi olarak saklıyorum.

Kategorik niteklerin belirtilmesi

String niteliklerin integer’a dönüşümünü önceki adımlarda yaptığımızı hatırlarsınız. Şimdi bu niteliklerin kategorik olduklarını ayrıca belirteceğiz. Her ne kadar belirtilmediği durumda da çalışsa da, komplikasyonlara neden olabilmekte. Sayısal nitelikler için karar ağaçları bir eşik değerden büyük ya da küçük olduğu kontrolünü uygulamakta. Örneğin cinsiyet bilgisini ele alalım. Bilinmeyen cinsiyetler için 0, erkekler için 1, kadınlar için de 2 değerini atadığımızı varsayalım. Karar ağacı bir noktada cinsiyet sıfırdan büyük mü değil mi şeklinde bir kontrol uygulayabilir. Bu da anlamlı cinsiyet bilgisini kaybetmemiz anlamına gelmektedir. Niteliğin kategorik olduğunun belirtilmesi 0, 1 ve 2 için ayrı dallar oluşturulmasını sağlayacağından bu handikaptan kurtulmuş oluyoruz.

Eğitim

Problemi hem regresyon hem de sınıflandırma olarak modelleyebiliriz. Temelde objektif ve metrik parametrelerinde değişiklik yapmak yetecektir. Parametre seti ve LightGBM için oluşturduğum eğitim setinin geçilmesi eğitimi başlatacaktır.

Tahminleme

Bir önceki adımda makine öğrenmesi modelimizin eğitimini gerçekleştirmiş ve gbm değişkeninde saklamıştık. Yeni bir örnekleme ait kararı bu değişkene artık sorabiliriz. Kısıtlı bir veri kümesi üzerinde çalıştığımız için eğitim setinin kararlarını doğrudan sormayı tercih ediyorum.

Bu kod bloğu eğitim setimiz için aşağıdaki tahminleri yapıyor. Görüldüğü gibi tüm örneklemler doğrulukla tahmin edilebilmiş.

Görselleştirme

Sinir ağları gibi algoritmaların aksine karar ağacı algoritmaları okuyabildiğimiz ve anlayabildiğimiz kural setlerinden oluşmakta. LightGBM ile oluşturulan karar ağacını ve niteliklerin önemini kolaylıkla görselleştirebiliyoruz.

Bunun için öncelikle Graph Visualization Software’in kurulumunu gerçekleştirmemiz gerekmekte. İlk olarak pip install graphviz komutunu çalıştırarak python paketinin kurulumunu gerçekleştireceğiz. Sonrasında bu linkten işletim sisteminiz ile ilişkili programın kurulumunu da yapmanız gerekiyor. Kodumuzda kurulumu yaptığımız dizini aşağıdaki gibi gösterebiliyoruz.

Sonrasında ağacı kolayca çiziyoruz.

Karar kuralları aşağıdaki ağaçtan kolaylıkla okunabilir.

Karar ağacı

Ayrıca veri setindeki niteliklerin önemine de artık hakimiz.

 

Nitelikler

Bu yazımızda Microsoft’un bir çok makine öğrenmesi araştırmacısının benimsediği LightGBM altyapısını inceledik. Alternatifleri ile kıyaslandığında artılarını ve eksilerine de değinmiş olduk. Bunlarla birlikte bir “Merhaba Dünya” modelini LightGBM ile geliştirdik. Son olarak, yazı sırasında paylaştığım kod bloklarının tamamını içeren not defterini GitHub’ta paylaştım.

Bu yazı A Gentle Introduction to LightGBM for Applied Machine Learning yazısından Türkçe’ye çevrilmiştir.

Email adresiniz yayınlanmayacaktır.