Rossmann Store Sales Prediction
Kaggle Competition(score = 0.12754) — FBProphet — LightGBM —
Merhabalar,
Bu yazımda bir Kaggle yarışması için yaptığım çözümü göstermeye çalışacağım. Bu yarışma normal Kaggle yarışmalarından biraz farklı. Ama önce amacımızın ne olduğundan kısaca bahsedeyim.
Rossmann, binden fazla deposu olan bir ilaç şirketi. Bizden istenen, ilaç satışlarını 6 hafta önceden tahmin edecek bir model kurmamız.
Mağaza satışları; promosyonlar, rekabet, okul ve resmi tatiller, mevsimsellik ve yerellik gibi birçok faktörden etkilenmekte.
Yarışmanın farklı olduğu yönü ise train ve test setinin yanında store adlı bir verisetinin daha olması. Mağazalara ait bilgileri içeren store dosyasını train ve test setleriyle birleştirmek için python yeteneklerimizi biraz zorlayacağız.
Kodlar github linkinde.
Hazırsanız başlayalım…
Tarih object olarak görünüyor. Datetime’a dönüştürelim.
Eğer mağaza kapalıysa müşteri ve satış da olmaması lazım, bunun kontrolünü yapmalıyız!
Kontrolü sağladık. No problem!
Train ve test setindeki yılları ve ayları ayrı birer değişken olarak oluşturalım.
Yazıyı çok uzatmamak adına bazı çıktı resimlerini paylaşmıyorum. Sadece kendi çıktınızla kıyaslayabilmeniz için ara ara görsel eklemeye çalışıyorum.
Test setindeki eksik değerleri inceleyelim.
Eksik değerlerin tamamı 622 no’lu stora ait. 622' nin geçmiş yıllardaki değerlerine bakalım.
622'nin daha önceki yıllarda ve aylardaki davranışını incelediğimde sadece haftanın 7.gününde kapalı diğer günler açık olduğunu görüyorum.
Bunun dışında test setindeki eksik değerleri inceleyecek olursak tatil vs de yok. Bu durumda eksik Open değerlerini 1 ile dolduracağım.
Eğer bu yarışmadan yüksek skor almak istiyorsak store_df ’ teki özelliklerden en iyi şekilde faydalanmamız gerektiği ortada. Bu yüzden store_df ’ teki bazı özellikleri train ve test setine eklemeye çalışacağım.
store_df ’teki StoreType değerlerini train ve test setlerinde yeni bir sütun oluşturarak uygulamak istiyorum.
Bu pek karşılaştığımız bir durum değil. Bu problemi su şekilde çözeceğim.
# Önce store_df ’teki Store ve StoreType değişkenlerini birleştirerek bir sözlük yapısı elde etmek istiyorum.
# Daha sonra train ve test setinde yeni bir değişken oluşturup store id’lerini buraya kopyalamak istiyorum.
# Sonrasında ise replace komutu ile oluşturduğum sözlük yapısını verisetine uygulamak istiyorum.
Hem test hem de train setine bu şekilde uyguladım. Şimdi diğer değişkenlerden de gerekli gördüklerimi benzer şekilde ekleyeceğim.
CompetitionDistance değişkenin store_df ‘ teki 3 değeri eksik.
CompetitionOpenSinceMonth ile CompetitionOpenSinceYear değişkeni aynı anda NaN oluyor, mantıken de durum bu şekilde.
Promo2 0 ise diğer promo değişkenleri de NaN olmuş. Onlar da aslında eksik veri değil. O halde devam edelim.
CompetitionOpenSinceYear değişkenini şu şekilde modele alacağım.
Şuanki yıldan(O zaman için düşünürsek =2015) CompetitionOpenSinceYear değişkenini çıkarıp yeni bir değişken olarak train ve test setine yeni değişken ekleyeceğim.
CompetitionOpenSinceMonth değişkenini modele almayı düşünmüyorum. Promo2'yi de modele alacağım.
Promo2SinceWeek değişkenini de değerleri 52'den çıkarıp yeni bir değişken olarak alacağım.(52 hafta 1 yıla eşit olduğu için)
Şuanki yıldan Promo2SinceYear değişkenini çıkarıp yeni bir değişken olarak modele alacağım.
Artık bu işlemlere alıştığımızı düşünüyorum. Bu yüzden fazla uzatmamak adına kodları paylaşıp çıktıları ara ara paylaşacağım.
Promo2SinceWeek değişkenini de değerleri 52'den çıkarıp yeni bir değişken olarak alacağım.(52 hafta 1 yıl olduğu için)
Şuanki yıldan Promo2SinceYear değişkenini çıkarıp yeni bir değişken olarak modele alacağım.
Customers değişkeni test_df ’te mevcut değil. Bu yüzden train_df ’ten silecegim.
Verisetimiz model kurmak için hazır. Ben önce zaman serisi analizi yaparak inceleyeceğim. Sonrasında ise doğrusal olmayan regresyon modeli deneyeceğim. Bakalım skorumuz nasıl değişecek.
Zaman serisi analizini FBProphet kütüphanesiyle gerçekleştireceğim. Eğer daha önce hiç kullanmadıysanız indirmeniz gerekmektedir. İndirmeniz için link bırakıyorum.
ZAMAN SERİSİ ANALİZİ
Tatillerin satışlarda önemli etkisinin olacağını düşündüğüm için state/school holiday ‘ ler ile ilgili yeni bir değişken oluşturacağım.
Parametreleri kodların altında not şeklinde kısaca açıklamaya çalıştım. Daha fazla bilgi için link de bırakıyorum.
Yukarıda performance metriklerini df olarak oluşturduk. rmse değerinin 850 civarlarında olduğunu görüyoruz. Şimdi bir de cv uygulayarak inceleyelim.
CV uyguladık ve rmse değerinin aslında 1000 civarlarında olduğunu gördük.
Zaman serisi analizinden elde ettiğim sonucu Kaggle’ da submit edip denemedim. Bazen rmse değeri daha fazla olan modelin Kaggle’ daki skoru daha yüksek çıkabiliyor. Bu yüzden size denemenizi tavsiye ederim. Ben birazdan kuracağım regresyon modeliyle bu modeli rmse skoruna bakarak kıyasladım. Aslında burada işin kolayına kaçtım. Normalde Kaggle’ da belirtilen performance metriği üzerinden kıyaslama yapmak gerekir. Evet bu açıklamayı da yaptıktan sonra artık regresyon modeline geçebilirim.
Peki hangi modeli kurmalıyım?
Bizim tahmin etmek istediğimiz Sales değişkeni 1000, 6000,10000 gibi sayısal ve sürekli bir değişken. Ayrıca birden fazla değişkenin Sales üzerinde etkisinin olduğunu biliyoruz. Bu durumda doğrusal regresyon modeli kurmamızın da bir manası yok. Ayrıca Sales değişkeni üzerinde gruplandırma vs de yapmak değiş amacımız. Bu durumda Kmeans gibi Unsupervised ML modeli de bizim problemimize uygun değil. O halde Random Forests, Xgboost, CatBoost, LightGBM gibi doğrusal olmayan regresyon modelleri bizim için en uygun seçim olacaktır.
LightGBM
train ve test setindeki Date değişkenini siliyorum, zaten ayrı sütunlara parçalayarak eklemistik yıl ve ayları.
Tüm değişkenleri sayısallaştırmalıyız.
StateHoliday değişkeninde 0 bazı yerlerde str bazı yerlerde de int görünüyor. Type’i o yüzden object olmuş, İnt olanları str’ye dönüştürelim.
Train setiyle test setindeki değişken sayımızın eşit olması gerekiyor. Bu yüzden fazla değişkenleri sileceğim.
Verisetlerimiz model için hazır. Şimdi train setinin % 80' inini eğitim için % 20' sini de validasyon için ayıralım ve modelimizi kuralım.
Daha önce LightGBM kullanmadıysanız indirmeniz gerekmektedir.
pip install lightgbm
komutunu jüpiter’de çalıştırmanız yeterli olacaktır. Detaylı bilgi için link bırakıyorum.
Ben fazla zaman almasın diye hiperparametre optimizasyonu yapmadım. Ancak isterseniz siz lgbm_grid içeriğini çoğaltabilirsiniz.
fbprophet ile rmse değerimiz 1000 civarlarındaydı, LightGBM ile 689'e düşürdük.
Şimdi Kaggle’ a submit edeceğimiz csv dosyasını hazırlayalım.
sample_submission1.csv dosyası bilgisayarınıza inmiş olmalı. Bu dosyayı Kaggle’a yükleyip skorunuzu öğrenebilirsiniz.
# score = 0.12754
Biraz uzun bir yazı oldu. Yazının sonuna kadar sabrettiğiniz için teşekkür ederim. Bir sonraki yazımda görüşmek üzere, hoşça kalın…