2020-04-27

Havayolu şirketlerinde overbook uygulamasına ML çözümü

Gerçek dünya sorunlarına çözüm üretmek için odak noktamız havayolu sektörü oldu. Çalışmamız amacı, havayolu şirketlerine ek getiri sağlayan `overbook` uygulamasının hangi uçuşlarda kullanılabileceğinin yüksek olasılıkla tahmin edilebilmesidir. Havayolu firmaları satışa sunduğu seferin biletlerine ek olarak, yolcuların uçağı kaçırma, geç gelme ya da zamanında yapmadığı check-in işlemlerinden dolayı uçağın kapasitesinin üstünde yaptığı bilet satışı gerçekleştirir, bu uygulamaya `overbook` denir. Yolcu, bir sonraki uçuş ile  seyahat eder ve yolcu memnuniyeti sağlanması adına, ek bilet yada maddi olarak ödüllendirilir.
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üğü 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ş mesafelerini içeren bilgileri kategori etmek için uçuş başına mesafeyi belirledik ve akabinde kategorilere ayrıldı.Kategoriye ayırma işlemlerinde quartile fonksiyonu uygulanarak daha doğru paylaşım yapılması hedeflendi.Tarihsel verileri incelediğimizde 2019 dışında diğer yıllara ait verilerin tüm ayları içerdiğini görebiliyorduk. Dolayısıyla, outlier veri niteliğinde olduğu nedeniyle 2019 verilerini de verisetimizden ayırdık. Proje hedefimiz Machine Learning classification modellerini kullanmaya uygun olduğundan domain bilgileri eşliğinde bazı alanları kaldırma kararı alındı. Isı haritası ile verisetimizdeki alanların korelasyon değerlerini göreselleştirdik.Çıkardığımız sonuçlarla ilerleyerek uçuş mesafeleri ve yolcu sayıları arasındaki ilişki görselleştirildi.

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ı
Modeli belirleme esnasında cross-validation değerleri de dikkate alınarak recall, accuracy ve precision değerleri karşılaştırıldı. Örnekte Random Forest için uygulanan işlemleri görebiliriz:

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