XGBoost ile Merhaba Dünya

0 98

Extreme Gradient Boosting ya da Türkçesi ile Ekstrem Gradyan Arttırmanın kısaltması olan XGBoost resmi olarak bugün Washington Üniversitesinde öğretim üyesi olan  iki akademisyen tarafından ilk olarak 2016 yılında duyuruldu. Yazılım çerçevesi aslında bu akademik yayın öncesinde Tianqi Chen tarafından Dağıtık Makine Öğrenimi Topluluğunun (DMLC) bir parçası olan bir araştırma projesi olarak başlamıştı. Yazılım çerçevesinin kaggle yarışmalarında gösterdiği üstün başarılar popülaritesini arttırdı. XGBoost, aşırı öğrenmeyi engelleme amaçlı regülarizasyon kullanımı, budama ve parelelleştirme gibi düz GBM’in üzerine bazı gelişmeler getirmiştir. Bu yazımızda XGBoost ile bir merhaba dünya uygulaması geliştireceğiz.

XGBoost

Veri seti

Golf veri seti ile çalışacağız. Veri setine buradan erişebilirsiniz. Özetle hava durumu, sıcaklık, nem ve rüzgar durumuna göre golf oynayıp oynamama kararlarını içeren bir veri seti için modelleme yapacağız.

Veri seti

Veri setinde hava durumu ve rüzgar öznitelikleri kategorikken, sıcaklık ve nem öznitelikleri nümeriktir. Veri setini değiştirsek bile aşağıdaki kod bloğu ile hangi özniteliklerin kategorik olduklarını bulabiliriz.

Kodlama

XGBoost, öznitelik ve hedefleri nümerik formatta beklemektedir. Öznitelik eğer haftanın günü gibi sıralı bir bilgi içeriyorsa etiket kodlaması (label encoding) yapabiliriz. Öte yandan özniteliğin kategorik olması halinde, yani şube kodu gibi kodu gibi büyüklük küçüklük içermeyen bir bilgi ise, one-hot kodlama yapmalıyız. Böylece karar ağacı haftanın günü (1: pazartesi, 7: pazar) kontrolünü 6’dan büyük eşit ise gibi haftaiçi ve haftasonlarını gruplamak için kullanabilir. Öte yandan şube kodu kategorik bir alan olduğu için karar ağacı kontrolü her şube için farklı dallara ayrılacaktır.

Etiket kodlaması

Veri setimizde nümerik olmayan iki kolon da aslında kategorik bilgiler içerdiğinden sadece hedef değerine etiket kodlaması uygulayacağız.

One-hot kodlama

Hava durumu ve rüzgar öznitelikleri kategorik bilgiler içerdiğinden bu ikisine one-hot encoding uygulayacağız.

Kodlama işlemlerinden sonra veri setimiz aşağıdaki şekile dönüşecektir.

Kodlanmış veri seti

Siz farklı bir veri setinde nümerik olmayan kolonlara etiket kodlaması uygulamayı daha uygun görebilirsiniz.

Bir özniteliğinizin 1000 farklı değer alabildiğini düşünün. Veri setinizin boyutu da milyonlar mertebesinde olsun. One-hot kodlamayı pandas aracılığıyla yapıyoruz ve pandas aslında tek core ile çalışan bir kütüphane. Bu ön-işleme işlemi saatler alacaktır. Oysa ki XGBoost’u H2O içerisinde kullanmayı tercih ederseniz ön-işleme ve eğitimi radikal şekilde hızlandırabilirsiniz.

Modelleme

Bu problemi hem sınıflandırma hem de regresyon olarak modelleyeceğiz.

Sınıflandırma

Çok sınıflı bir sınıflandırma probleminde kayıp fonksiyonu cross-entropy olacaktır. İki sınıflı bir sınıflandırma probleminde lojistik ya da sigmoid fonksiyonunu kullanabilecekken çok sınıflı bir sınıflandırma probleminde softmax kullanmak durumdayız.

Normal şartlarda veri setini eğitim, validasyon ve test için üç sınıfa ayırmalıyız ancak veri setinin örneklem sayısı oldukça az olduğundan tüm veri setini eğitim için kullanacağız.

Model kurulduktan sonra tahminlemeyi artık yapabiliriz. En dominant tahmini ya da her bir sınıf için tahmin olasılığını hesaplayabiliriz.

Sınıflandırma sonuçları

Model aynı zamanda Evet / Hayır çıktılarının olasılıklarını da söyleyebilir.

Tahmin olasılıkları

Regresyon

Problemi regresyon şeklinde modellersek kayıp fonksiyonunu hataların ortalama karekökü (root mean squared error ) olarak atayabiliriz.

XGB sınıflandırıcısı yerine XGB regressor’u ile modelleme yapacağız.

Hayır cevabını 0, evet cevabını da 1 olarak düşünebilirsiniz. Dolayısıyla tahminlerimiz [0, 1] aralığında bir desimal değer olacaktır. Tahmin evet / hayır olarak görmek istiyorsanız en yakın sınıfa atayabilirsiniz.

Regresyon sonuçları

Özniteliklerin önemi

Kurulan model özniteliklerin önemini de içermektedir. Açıklanabilir bir yapay öğrenme modeli olması adına bunun gösterimi önemlidir.

Öznitelik Önemi

Paralellik

GBM algoritması bir karar ağacı kurulduktan sonra bunun yaptığı hatalar ile ikinci bir karar ağacının kurulması prensibine dayanmaktadır. Dolayısıyla ilk ağaç bitmeden ikincisini hesaplamaya başlayamayız. Ancak bir karar ağacı kurulurken dallarını paralelde oluşturabiliriz. Varsayalım ki en domine eden öznitelik hava durumu olsun. Ağacı bir dalı sıcak hava için dallanacakken, diğer dalı kapalı hava için dallanacaktır. Bu iki dalı birbirinden bağımsız şekilde hesaplayabiliriz. Buna seviye temelli ağacın büyümesi diyoruz. İşte XGBoost’u klasik GBM’den hızlı yapan özellik de budur.

Seviye temelli ağaç büyümesi

GPU ile modelleme

XGBoost her zaman LightGBM ile karşılaştırılır. CPU’da modelleme yapacaksanız LightGBM on kat daha hızlıyken, GPU’da işler tersine dönüyor. Hem kullanım kolaylığı açısından da XGBoost’a sadece GPU kullanmak istediğizine dair bir parametre göndermeniz yeterken LightGBM’i GPU için sizin derlemeniz gerekmekte.

Güçlü modeller

LightGBM daha hızlı olsa bile ürettiği çıktılar olarak XGBoost’un %1 ila %2 arasında gerisinde kalmakta. Çok kaba bir yaklaşım olarak öznitelik mühendisliği yaptığınız dönemlerde modelleri LightGBM ile kurup, nihai hale geldiğinden XGBoost ile modellemek size çokça fayda sağlayacaktır.

Bu yazıda sıfırdan bir XGBoost modelini nasıl kuracağımızı adım adım inceledik. Yazılan koda GitHub üzerinden erişebilirsiniz.

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

Yorum yaz

Email adresiniz yayınlanmayacaktır.