Light GBM ile Müşteri Kayıp Tahminlemesi (Churn Prediction)

Özcan Gündeş
Yazılım Bilimi
Published in
5 min readMay 9, 2019

Makine öğrenmesi sürekli duyduğumuz, okuduğumuz ve dünya çapında birçok yapay zeka projesinin arka planında başvurulan bir alan. Böylesine önemli olduğu için de her geçen gün yeni algoritmalarla daha da güçleniyor. Bu yazımda son zamanlarda çokça rastladığım bir makine öğrenmesi algoritması olan Light GBM yardımıyla Kaggle üzerinden paylaşılan bir telekom firmasına ait müşteri bazlı veri seti yardımıyla firmanın her bir müşteriyi kaybetme ihtimallerini tahminleyeceğim. Kaggle üzerinde birçok profil kendi tahmin yöntemini paylaşmış, ilginizi çekerse onları da inceleyebilirsiniz.

Analize başlamadan önce kısaca Light GBM’i tanıtmak faydalı olacaktır. Aşağıda bu algoritmanın zaman içindeki artan popülerliğini gösteren Google Trends grafiğini de görebilirsiniz:

Light GBM, karar ağacı tabanlı bir öğrenme algoritmasıdır ve en önemli avantajları, ismindeki Light kelimesinin de sebebi olan “yüksek hız”ı, büyük veri setlerini işleme kabiliyeti, kodu çalıştırmak için gereken belleğin daha düşük olması ve sonuçlardaki daha yüksek doğruluk oranları (accuracy) olarak sıralanabilir. Bunun yanında, küçük veri setlerinde, aşırı uyum gösterme veya veriyi ezberleme (overfitting) yatkınlığı olmasından dolayı belirli bir sayı olmasa da 9K-10K’dan daha az sayıdaki veri setleri için pek önerilmeyen bir algoritma. Son olarak, her ne kadar basit bir implementasyon olsa da içinde 100'den fazla parametre barındırdığı için implementasyon öncesinde ilgili dökümanları okuyarak en azından bu parametrelerin ne olduğunu anlamakta fayda var.

Implementasyon

Kodları Anaconda’da Spyder ortamında yazdığımdan dolayı kodumu ekran görüntüleriyle bu ortamdan paylaşacağım. Light GBM i yüklemek için Anaconda prompt’a aşağıdaki kodu yazmanız yeterli.

Veri setine gelecek olursak, bahsettiğim gibi bir telekom firmasına ait bu set 7043 farklı müşterinin 21 tane detay bilgilerini içeriyor (7043*21).

Bu 21 sütun aşağıdaki gibi:

Bu sütunlardaki değerleri aşağıdaki şekilde çıkarttığımızda Tenure, MonthlyCharges, TotalCharges sütunları dışındakilerin hepsinin kategorik olduğunu görüyoruz. Ayrıca 5 tanesinin de değerlerinin “yes” ve “no” dan oluştuğunu görüyoruz (Partner, Dependents, PhoneService, PaperlessBilling,Churn).

Veri Önişleme

Öncelikle tüm sütun değerlerini küçük harflere dönüştürüyoruz.

Yukarıda bahsettiğim 5 binary sütunu da yes değerleri için 1, no değerleri için 0 olacak şekilde işliyoruz.

df.dtypes komutu ile sütunların veri tiplerine baktığımızda TotalCharge sütununun object olarak gözükmesi dolayısıyla bu sütunu numerik hale getiriyoruz.

Bu aşamada verimizde NA değerler var mı kontrol edip varsa (TotalCharge sütununda 11 satır), bu değerleri “0” ile dolduruyoruz.

Veriden analizimizi etkilemesin diye customerID leri ayrı bir değişkene tanımladıktan sonra silip kategorik sütunları get_dummies komutu ile binary sütunlara dönüştürüyoruz.

Artık Churn sütununu etiket olarak yeni bir değişkene atayıp veriden sildikten sonra, veri setimizi eğitip ve test etmek amacıyla 2'ye ayırıp ve numerik verileri MinMax Scaler yardımıyla normalize ederek veri setimizi Light GBM ile modellemeye hazır hale getiriyoruz.

Modelleme

Yukarıda bahsettiğim gibi bu algoritmanın can alıcı noktası parametreleri anlayıp uygun bir şekilde belirlemek. 500 iterasyon ile eğittiğim modelde kulladığım parametreler ve değerleri aşağıdaki gibidir:

learning_rate: Her bir karar ağacının sonuç üzerindeki etkisini gösteriyor. GBM her bir çıktıyı göz önünde tutarak tahminlerini güncelliyor ve bu parametre bu güncellemenin ne büyüklükte olacağını belirliyor. Genelde kullanılan değerler 0.1, 0.001 veya benim de kullandığım gibi 0.003 kullanılıyor.

boosting_type: Hangi algoritmayı kullanacağınızı belirttiğiniz parametre, Default olarak gbdt yani gradient boosting decision tree. Diğer alabileceği değerler rf (random forest), dart (dropouts meet multiple additive regression trees) veya goss (gradient-based one-side sampling). İsterseniz kendi modelinizde bunları da deneyebilirsiniz.

objective: Binary sınıflandırma (müşteri kaybedilecek mi kaybedilmeyecek mi?) problemi olduğu için “binary” değerini seçiyoruz.

metric: Yukarıdaki parametre ile aynı sebepten dolayı “binary_logloss” seçmemiz gerekir.

num_leaves: Tüm karar ağacındaki toplam ayrım (leaves) sayısını gösterir.

min_data: Bir ayrım noktasında olabilecek minimum veri sayısı. Verinin ezberlenmesi (overfitting) konusunda önemli bir parametre. Ne kadar küçülürse modelin veriye aşırı uyum gösterme ihtimali artar. Küçük sayılamayacak bir veri setimiz olduğu için 50 verdim bu değere.

max_depth: Karar ağacının maksimum derinliğini gösterir. Yukarıdakine benzer bir şekilde veriye aşırı uyum gösterme açısından önemli bir parametre, bunu düşürerek overfitting ihtimalini azaltabilirsiniz. Ben 10 değerini kullandım.

Model Tahminleri

Eğittiğim modeli test veri setim üzerinde uygulayarak, eğer müşteriyi kaybetme ihtimalimiz 0.5'ten büyükse 1 (yani müşteriyi kaybederiz), küçükse 0 (müşteriyi elimizde tutabiliriz) şeklinde bir tahmin verisi hazırlıyoruz.

Bu tahmini gerçekleşen veri ile aşağıdaki gibi karşılaştırdığımızda %81 lik bir doğruluk skoruna ulaşıyoruz ve Kaggle’daki birçok uygulanan modele göre daha yüksek bir skor.

Tahminlerin ve gerçekleşen değerlerin karşılaştırmasına baktığımızda şöyle bir confusion matrix’e ulaşıyoruz:

Sonuç olarak, birçok blog yazısına göre Light GBM başarılı sonuçlar çıkarmış ve benim önerim modellerinizde en azından bu algoritmayı da bir denemeniz. Özellikle talep tahminleme gibi numerik veri tahminleme (regression) veya bu örnekte olduğu gibi sınıflandırma (classification) problemlerinde faydalı olacaktır diye inanıyorum.

Teşekkürler,

Özcan GÜNDEŞ

Kaynaklar:

--

--

Özcan Gündeş
Yazılım Bilimi

METU'16 Industrial Engineer, BOUN MIS, TechLover, Data Enthusiast