Spaceship Titanic – Makine Öğrenmesi Projesi Raporu
1. Giriş
Bu projede, Kaggle platformunda yer alan Spaceship Titanic adlı sınıflandırma problemi ele alınmıştır. Amaç, kurgusal bir uzay gemisinde seyahat eden yolcuların bir anomali sonucunda alternatif bir boyuta taşınıp taşınmadığını tahmin eden bir makine öğrenmesi modeli geliştirmektir.
Her ne kadar veri seti kurgusal olsa da, proje kapsamında uygulanan veri temizleme, ön işleme, modelleme ve değerlendirme adımları gerçek hayattaki veri bilimi problemleriyle büyük ölçüde benzerlik göstermektedir. Bu çalışma ile R programlama dili kullanılarak uçtan uca bir makine öğrenmesi sürecinin sistematik şekilde uygulanması hedeflenmiştir.
1.1. Kaggle ve Veri Seti Tanıtımı
Kaggle, veri bilimi ve makine öğrenmesi alanında yarışmaların, veri setlerinin ve örnek çözümlerin paylaşıldığı çevrimiçi bir platformdur. Spaceship Titanic yarışmasında katılımcılara iki ana veri seti sunulmaktadır:
Train veri seti: 8693 gözlem ve 14 değişken
Test veri seti: 4277 gözlem ve 13 değişken
Train veri setinde hedef değişken Transported olup, yolcunun alternatif bir boyuta taşınıp taşınmadığını (True/False) göstermektedir. Diğer değişkenler demografik bilgiler, kabin bilgileri ve yolcunun gemi içindeki harcama alışkanlıklarını içermektedir.
Veri seti skim() fonksiyonu kullanılarak incelenmiştir. Bu inceleme sonucunda bazı sayısal değişkenlerde (Age, RoomService, FoodCourt vb.) eksik gözlemler olduğu tespit edilmiştir.
Eksik veriler, modelleme sürecinde sorun oluşturmaması için recipe yapısı içerisinde uygun yöntemlerle doldurulmuştur. Bu yaklaşım sayesinde veri sızıntısı (data leakage) engellenmiş ve tüm ön işleme adımları yalnızca eğitim verisi üzerinden öğrenilmiştir.
Ön işleme sonrası hem eğitim hem test veri setlerinde hiçbir eksik (NA) değer kalmadığı açıkça doğrulanmıştır.
PassengerId değişkeni kullanılarak yolcuların aynı grup içerisinde seyahat edip etmedikleri belirlenmiştir. Grup bilgisinin, yolcuların benzer koşullardan etkilenmiş olma ihtimalini yansıtacağı varsayılmıştır.
2.2.Cabin Değişkeninin Ayrıştırılması
library(tidyr)library(dplyr)train <- train %>%separate(Cabin, into =c("Deck", "CabinNum", "Side"),sep ="/", fill ="right")test <- test %>%separate(Cabin, into =c("Deck", "CabinNum", "Side"),sep ="/", fill ="right")train$CabinNum <-as.numeric(train$CabinNum)test$CabinNum <-as.numeric(test$CabinNum)
Model performansını artırmak amacıyla bazı yeni değişkenler türetilmiştir:
PassengerId → Group:
PassengerId içindeki grup bilgisi ayrıştırılarak yolcuların birlikte seyahat edip etmedikleri hakkında bilgi elde edilmiştir.
Cabin → Deck / CabinNum / Side:
Kabin bilgisi üç ayrı bileşene ayrılarak gemi içindeki konum bilgisinin modele daha anlamlı şekilde dahil edilmesi sağlanmıştır.
Bu adımlar, modelin veri setindeki yapısal bilgileri daha iyi öğrenebilmesi amacıyla uygulanmıştır.
Temizlenmiş train veri seti, set.seed(123) kullanılarak tekrar üretilebilir şekilde:
%75 deneme_train
%25 deneme_test
olarak ayrılmıştır. Ayrım sırasında hedef değişken (Transported) için stratified split uygulanmış ve sınıf oranlarının her iki alt veri setinde de korunması sağlanmıştır.
Tüm ön işleme adımları tidymodels çatısı altında recipe kullanılarak gerçekleştirilmiştir. Uygulanan adımlar şunlardır:
Eksik değerlerin doldurulması (sayısal ve kategorik)
Kategorik değişkenler için:
bilinmeyen seviyelerin tanımlanması
Nadir kategorilerin “other” sınıfında toplanması
Dummy (one-hot) encoding uygulanması
Sayısal değişkenlerin normalize edilmesi
Varyansı sıfır olan değişkenlerin (step_zv) modelden çıkarılması
Bu yapı sayesinde tüm modeller aynı ve adil bir ön işleme süreciyle eğitilmiştir.
3.1.Temizlenmiş Veri Setleri
Ham veri seti, modelleme öncesinde tidymodels altyapısı içerisinde tanımlanan recipe adımı kullanılarak temizlenmiştir. Bu aşamada sayısal değişkenlerde bulunan eksik gözlemler ortalama (mean) yöntemi ile doldurulmuş, kategorik değişkenlerdeki eksik değerler ise en sık gözlenen kategori (mode) ile tamamlanmıştır.
Ayrıca kategorik değişkenler one-hot encoding yöntemiyle sayısal forma dönüştürülmüş ve modelleme sürecinde veri sızıntısını önlemek amacıyla tüm ön işleme adımları yalnızca eğitim verisi üzerinde öğrenilmiştir. Böylece modelleme aşamasında kullanılan veri setleri, eksik değerlerden arındırılmış ve algoritmalar için uygun hale getirilmiştir.
# Temizlenmiş veri setlerinde NA kontrolücolSums(is.na(train_baked))colSums(is.na(test_baked))
Yukarıdaki çıktılar incelendiğinde, recipe adımı sonrasında hem eğitim hem de test veri setlerinde hiçbir değişkende eksik (NA) değer kalmadığı açıkça görülmektedir. Bu durum, ön işleme sürecinin başarıyla tamamlandığını ve modelleme için temiz veri setleri elde edildiğini göstermektedir.
4.Modellerin Kurulması ve Değerlendirilmesi
Çalışmada üç farklı makine öğrenmesi yöntemi kullanılmıştır:
Logistic Regression
Random Forest
XGBoost
Her model, aynı recipe yapısı kullanılarak deneme_train veri seti üzerinde eğitilmiş ve deneme_test veri seti üzerinde test edilmiştir.
Modellerin başarısını değerlendirmek için kullanılan Hata Matrisi (Confusion Matrix) bileşenleri şu şekildedir:
True Positive (TP): Alternatif boyuta taşınan ve modelin doğru tahmin ettiği yolcular.
True Negative (TN): Taşınmayan ve modelin doğru tahmin ettiği yolcular.
False Positive (FP): Aslında taşınmayan ancak modelin taşındı dediği yolcular (Hatalı alarm).
False Negative (FN): Aslında taşınan ancak modelin taşınmadı dediği yolcular (Kaçırılan durum).
4.1. Lojistik Regresyon
library(tidymodels)log_spec <-logistic_reg(mode ="classification") %>%set_engine("glm")log_wf <-workflow() %>%add_recipe(rec) %>%add_model(log_spec)log_fit <-fit(log_wf, data = deneme_train)log_preds <-predict(log_fit, new_data = deneme_test, type ="class") %>%bind_cols(deneme_test %>%select(Transported))conf_mat(log_preds, truth = Transported, estimate = .pred_class)metrics(log_preds, truth = Transported, estimate = .pred_class)metric_set(precision, recall, f_meas)( log_preds, truth = Transported, estimate = .pred_class)
Lojistik regresyon, ikili sınıflandırma problemleri için temel bir referans model olarak kullanılmıştır.
Tahmin / Gerçek
False (TN/FP)
True (FN/TP)
False
843 (TN)
197 (FN)
True
236 (FP)
898 (TP)
Lojistik regresyon %80.1 accuracy ile temel bir başarı sergilemiştir.
Modellerden elde edilen sayısal sonuçlar şu şekilde yorumlanmalıdır:
Accuracy (Doğruluk): Genel başarıyı gösterir. %81.6’lık bir doğruluk, modelin 100 yolcudan yaklaşık 82’sini doğru sınıflandırdığını ifade eder.
Precision (Kesinlik): Modelin “Taşındı” dediği yolcuların ne kadarının gerçekte taşındığını gösterir. Yüksek olması, gereksiz yere “anomali” alarmı verilmediğini kanıtlar.
Recall (Duyarlılık): Gerçekten taşınan yolcuların ne kadarının model tarafından yakalanabildiğini gösterir. Bu projede kritik olan, taşınan yolcuları gözden kaçırmamaktır (düşük FN oranı).
F1-Score: Precision ve Recall arasındaki dengeyi temsil eder. Random Forest’ın 0.813’lük F1 skoru, modelin hem yanlış alarm vermediğini hem de taşınanları yüksek oranda yakaladığını teyit eder.
Kappa Skoru: Modelin şans eseri doğru tahmin yapma ihtimalini dışarıda bırakarak başarısını ölçer. 0.631’lik Kappa değeri, modelin sınıflar arasında “iyi derecede” bir uyum ve ayırt edicilik sağladığını gösterir.
Tüm eğitim verisi kullanılarak Random Forest modeli yeniden eğitilmiş ve Kaggle formatına uygun tahmin dosyası oluşturulmuştur.
5.1.Kaggle Submission Sonucu
Aşağıda, geliştirilen modelin Kaggle test verisi üzerindeki doğrulama sonucu yer almaktadır.
Bu çalışma sonucunda, uygun bir öznitelik mühendisliği ve disiplinli bir ön işleme (preprocessing) süreciyle %82 civarında bir doğruluğa ulaşılabileceği görülmüştür. Kaggle üzerindeki public score sonucu 0.79939 olarak kaydedilmiştir.