Bu konuda, projeyi beraber yürüttüğümüz arkadaşım Ozan Akalın ile birlikte hareket ettik, domain bilgileri ile birlikte gerekli veriler belirlendi. Şirketlerin gerçek verilerini paylaşmakta istekli olmadıkları, aynı zamanda veri gizliliği nedeniyle zorluk yaşadık.Farklı API`lerin kullanımını denendi, fakat gerekli verilere erişemedik. Şanslıyız ki istediğimiz verilere benzer verisetini bulduk ve projemizi biraz da ona göre şekillendirdik.
Proje yönetimi aşamasında farklı aşamalar belirlendi:
- Planlama
- Bulut ortamında veri saklama ve manipülasyonu
- Veritabanı bağlantı havuzu
- Feature engineering ve EDA(Exploratory Data Analysis)
- ML modellerin belirlenmesi, parametre güncellemeleri ve karşılatırma
1.Planlama:
Projemizde veri bilimi ve mühendisliği becerilerini içeren adımlar bulunduğu için öncelikle planlama yapmamız gerekliydi. Bu nedenle zaman planlaması, görev paylaşımı gibi noktaları belirlendi, akabinde Github project oluşturarak Kanban metodolojisi benzeri planlama aracı kullanarak planlamaları yazıya döktük ve version kontrol aracı olarak Github kullanıldı. Her gün kısa toplantılar gerçekleştirerek son durumu değerlendirildi.
2.Bulut ortamında veri saklama ve manipülasyonu:
Bulduğumuz veri yaklaşık 4.5 milyonluk sayıda ve csv formatında idi. Verilerin tarihsel olması ve farklı dosyalarda bulunması, bu verilerin hızlı şekilde işlenmesini zorlaştırırdı. Bu nedenle, verilerin bulut platformunda tutulmasına karar verdik, Amazon Web Services`in Elastic Cloud (EC2) hizmetini kullanmayı tercih ederek. Veri sözlüğünü ve tiplerini inceledikten sonra veritabanında kullanılacak nesnelerin yapısını belirlendi, EC2 Linux (Ubuntu) sunucusunda bulunan Postgres veritabanında bashettiğim nesneleri oluşturarak veri aktarımını gerçekleştirildi. Tarihsel veriseti olduğundan dolayı tarih bazında partition oluşturmak istedik, fakat sonrasında bu işlemin işlevselliğinin düşük kalacağını düşündükten sonra vazgeçildi.Domain bilgileri ile ilerleyerek bazı kayıtları silindi, yeni alanlar eklendi ve kayıtlar kategoriye ayrıldı.Alınan ham veri setinde tüm havayolu şirketleri mevcuttu, fakat bizim projemiz düşük bütceli uçuşlar gerçekleştiren havayollarını hedeflemediği için ilgili şirketleri tablolardan çıkardık. Bir nevi feature engineering adımının bazı aşamalarını SQL üzerinde gerçekleştirildi. Belirtilen işlemler sonrasında kayıt sayısı yarım milyona indi.
Oluşturulan tablo ve veri aktarımı örnek scriptler:
3.Veritabanı bağlantı havuzu:
Farklı işlemlerle bağlantıları ayrı-ayrı oluşturmak yerine tek havuzdan beslenecek şekilde Postgres-Python bağlantı havuzu oluşturuldu.Fakat daha sonra gereksinimler gereği tek bağlantıda ilerlendi. Oluşturduğumuz bağlantı havuzunu github repomuzda paylaştık. Bulut sistemini içeren host bilgisini encode ederek notebook`a eklendi.
4.Feature Engineering ve EDA:
Postgres üzerinde yapılan işlemler sonrasında Python`a aktardığımız verilerin bilgisi:
Uçuş mesafesi bazında yolcu sayısı |
Uçuş mesafeleri ile yolcu sayıları arasında anlamlı bağlantı `Boş Koltuk Sayıları ve Oranları` gibi alanlarda da mevcut. Yolcu sayıları ve target alanı arasında anlamlı ilişki olmasına rağmen model verisetimize eklenmedi, nedeni Yolcu Sayılarının overbook işlemlerinden sonra belirlenmesiydi.
5.ML modellerinin belirlenmesi, parametre güncellemeleri ve karşılaştırma:
Projemiz classification modellemeye uygun olduğundan Decision Trees, Random Forest, KNN, AdaBoost, Gradient Boosting gibi algoritmaları kullandık. Verisetimizin %20`ni test işlemlerine ayırdık. Modeller uygulandıktan sonra cross validation ile skorları inceledik, tüm modellerde accuracy skor % 60-70 arasında geldi. Çalıştığımız verisetine uygulanan Machine Learning algoritmaları içerisinde en iyi sonuçları Random Forest ve Decision Trees`de aldık. Sonradan Voting Classifier üzerinde bazı iyi sonuç getiren modellerin ortalamasını almaya çalışsak da, parametre güncellemeleri sonrasında en iyi sonucu %76 ile Random Forest`den alındı.
Bazı modellerde alınan sonuçlara etki yapan alan değerlerini ise aşağıdaki şekilde sıralayabiliriz (örnek):
Sütunların modellerde önem sıralaması |
Random Forest modelini elimizdeki verisetindeki overbook değerleriyle aynı tabloda görmek için aşağıdaki işlem uygulandı, bu şekilde gerçek uygulamada da elimizdeki girdi değerlerini verisetindeki değerlerle aynı olacağını düşünerekten hareket edebilir ve tahmin değerleri oluşturulabilir. Sonuç olarak girilen girdilere göre model, uçuşa overbook uygulanabilirliğine Evet (1) yada Hayır (0) şeklinde yanıt verecektir, tablodaki is_overbooked alanını gerçek, rf_overbooked`u ise tahmin edilen değer olarak düşünebilirsiniz:
Overbook tahminlemesi |
Oluşturulmuş model pickle formatında saklandı. Bu işlemin amacı modeli Heroku`ya taşıyarken deploy etmek ve böylece Flask`de kullanma fırsatımız doğar.
Fikirleriniz ve feedback`leriniz ile projeyi daha da pekiştirebiliriz, lütfen çekinmeden yorumlarınızı iletin.
Projenin detaylarına Github repomuzdan ulaşabilirsiniz:
https://github.com/baylarov/Airlines_TicketSalesOptimization_ML
Bu projenin gerçekleşmesinde emeği geçen İstanbul Veri Bilimi Akademisi`ne, özellikle Zekeriya Beşiroğlu ve Ozan Akalın`a teşekkür ederim.
No comments:
Post a Comment