Spaceship Titanic Kaggle Competition
Spaceship Titanic, yaklaşık bir ay önce fırlatılan bir yıldızlar arası yolcu gemisiydi. Yaklaşık 13,000 yolcusuyla gemi, güneş sistemimizden üç yeni yaşanabilir ötegezegeni çevreleyen yıldızlara yolcuları taşıyarak ilk seyahatine çıktı.
Alpha Centauri’yi dolaşırken ilk hedefi olan sıcak 55 Cancri E’ye doğru yol alırken, Spaceship Titanic bir toz bulutunun içinde gizlenmiş bir uzay-zaman anomalisiyle çarpıştı. Ne yazık ki, gemi önceki bin yıl adıyla benzer bir kaderi paylaştı. Gemi bütünlüğünü korudu, ancak neredeyse yolcularının yarısı alternatif bir boyuta taşındı!
Kurtarma ekiplerine yardımcı olmak ve kaybolan yolcuları kurtarmak için, bize geminin hasar görmüş bilgisayar sisteminden kurtarılan kayıtları kullanarak, hangi yolcuların anomali tarafından taşındığını tahmin etme görevi veriliyor.
Bunu yapmak için 3 farklı modeli kullanacağız. Daha önce verileri inceleme, düzeltme, temizleme aşamasına bakacağız.
Kaggle’den Veri setini yüklemek
Kaggle web sitesinden “Spaceship Titanic” ait “train” ve “test” veri setini R’a yüklüyoruz
Veri setinin iç yapısını görüntülemek
## spc_tbl_ [8,693 × 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ PassengerId : chr [1:8693] "0001_01" "0002_01" "0003_01" "0003_02" ...
## $ HomePlanet : chr [1:8693] "Europa" "Earth" "Europa" "Europa" ...
## $ CryoSleep : logi [1:8693] FALSE FALSE FALSE FALSE FALSE FALSE ...
## $ Cabin : chr [1:8693] "B/0/P" "F/0/S" "A/0/S" "A/0/S" ...
## $ Destination : chr [1:8693] "TRAPPIST-1e" "TRAPPIST-1e" "TRAPPIST-1e" "TRAPPIST-1e" ...
## $ Age : num [1:8693] 39 24 58 33 16 44 26 28 35 14 ...
## $ VIP : logi [1:8693] FALSE FALSE TRUE FALSE FALSE FALSE ...
## $ RoomService : num [1:8693] 0 109 43 0 303 0 42 0 0 0 ...
## $ FoodCourt : num [1:8693] 0 9 3576 1283 70 ...
## $ ShoppingMall: num [1:8693] 0 25 0 371 151 0 3 0 17 0 ...
## $ Spa : num [1:8693] 0 549 6715 3329 565 ...
## $ VRDeck : num [1:8693] 0 44 49 193 2 0 0 NA 0 0 ...
## $ Name : chr [1:8693] "Maham Ofracculy" "Juanna Vines" "Altark Susent" "Solam Susent" ...
## $ Transported : logi [1:8693] FALSE TRUE FALSE FALSE TRUE TRUE ...
## - attr(*, "spec")=
## .. cols(
## .. PassengerId = col_character(),
## .. HomePlanet = col_character(),
## .. CryoSleep = col_logical(),
## .. Cabin = col_character(),
## .. Destination = col_character(),
## .. Age = col_double(),
## .. VIP = col_logical(),
## .. RoomService = col_double(),
## .. FoodCourt = col_double(),
## .. ShoppingMall = col_double(),
## .. Spa = col_double(),
## .. VRDeck = col_double(),
## .. Name = col_character(),
## .. Transported = col_logical()
## .. )
## - attr(*, "problems")=<externalptr>
“Train” ve “Test” veri setini eksik değerlerini ele alıp, gereken değişiklikleri yapmak ve temizlemek
“Tidyverse” bir çok yardımcı paketleri içeren bir pakettir
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ purrr 1.0.2
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Kaç tane boş değişkenleri olduğunu göstermek için aşağadaki “explore” paketini kullanacağız
## # A tibble: 14 × 8
## variable type na na_pct unique min mean max
## <chr> <chr> <int> <dbl> <int> <dbl> <dbl> <dbl>
## 1 PassengerId chr 0 0 8693 NA NA NA
## 2 HomePlanet chr 201 2.3 4 NA NA NA
## 3 CryoSleep lgl 217 2.5 3 0 0.36 1
## 4 Cabin chr 199 2.3 6561 NA NA NA
## 5 Destination chr 182 2.1 4 NA NA NA
## 6 Age dbl 179 2.1 81 0 28.8 79
## 7 VIP lgl 203 2.3 3 0 0.02 1
## 8 RoomService dbl 181 2.1 1274 0 225. 14327
## 9 FoodCourt dbl 183 2.1 1508 0 458. 29813
## 10 ShoppingMall dbl 208 2.4 1116 0 174. 23492
## 11 Spa dbl 183 2.1 1328 0 311. 22408
## 12 VRDeck dbl 188 2.2 1307 0 305. 24133
## 13 Name chr 200 2.3 8474 NA NA NA
## 14 Transported lgl 0 0 2 0 0.5 1
Tablodeki değişkenleri tek-tek inceleyerek hangı değişkenlerde boşluk olursa, onları doldurmamız gerekirse değişlikler yapmalıyız
Veri setinde bazi değişkenler yaratmaya başlarız, “PassangerId” değişkenini 2’ye böleceğiz birisi “ailenum” aile numarası, diğer “ailesira” aile sırası
“Test” datası için uygulayacağız
“Train” datası için aile numarası v aile sırasını ilk sütuna alıyoruz
“Test” datası için aile numarası v aile sırasını ilk sütuna alıyoruz
Dikkat edersek tablodeki “Cabin” değişkeninde 3 farklı bilgi verilmiş, biz onları ayrı ayrı sütuna ayıracağız
“Test” datası için aynı değişikliği uygulayacağız
“Cabin” bilgileri 3’e ayırdıktan sonra tekrar sütunları sıralayacağız
Yukarıdaki aynı işlemi “Test” datası için de uygulayacağız
Değişiklik yapıldıktan sonra “Cabin” sütununu kaldırabiliriz
“Test” datası için de uygulayacağız
“Train” datasındeki “Cabin” sütununu kaldırmanın farklı yolu
train <- train %>% select(-Cabin)
Train datasindeki “HomePlanet” değişkeni boşluklarını “NA” olarak dolduracağız
“Test” datası için de uygulayacağız
## [1] "Earth" "Europa" "Mars" NA
## # A tibble: 18 × 8
## variable type na na_pct unique min mean max
## <chr> <chr> <int> <dbl> <int> <dbl> <dbl> <dbl>
## 1 ailenum chr 0 0 6217 NA NA NA
## 2 ailesira chr 0 0 8 NA NA NA
## 3 PassengerId chr 0 0 8693 NA NA NA
## 4 HomePlanet fct 0 0 4 NA NA NA
## 5 CryoSleep lgl 217 2.5 3 0 0.36 1
## 6 VRDeck dbl 188 2.2 1307 0 305. 24133
## 7 Name chr 200 2.3 8474 NA NA NA
## 8 Transported lgl 0 0 2 0 0.5 1
## 9 deck chr 199 2.3 9 NA NA NA
## 10 num chr 199 2.3 1818 NA NA NA
## 11 side chr 199 2.3 3 NA NA NA
## 12 Destination chr 182 2.1 4 NA NA NA
## 13 Age dbl 179 2.1 81 0 28.8 79
## 14 VIP lgl 203 2.3 3 0 0.02 1
## 15 RoomService dbl 181 2.1 1274 0 225. 14327
## 16 FoodCourt dbl 183 2.1 1508 0 458. 29813
## 17 ShoppingMall dbl 208 2.4 1116 0 174. 23492
## 18 Spa dbl 183 2.1 1328 0 311. 22408
Tabloya baktığımızda “Age” değişkeninde 179 tane boşluk olduğunu görüyoruz. Bu boşlukları doldurmak için “HomePlanet” değişkenine göre yaş ortalamasını alıp doldurmak istiyoruz
train <- train %>%
group_by(HomePlanet) %>%
mutate_at(vars(Age), ~replace_na(., mean(., na.rm = TRUE)))“Test” datası için de uygulayacağız
test <- test %>%
group_by(HomePlanet) %>%
mutate_at(vars(Age), ~replace_na(., mean(., na.rm = TRUE)))Tablodan “CyroSleep” değişkeninde 217 tane boşluk olduğunu görebiliyoruz, bilinmeyen bu değişkeni “NA” olark dolduracağız
“Test” datası için de uygulayacağız
## # A tibble: 18 × 8
## variable type na na_pct unique min mean max
## <chr> <chr> <int> <dbl> <int> <dbl> <dbl> <dbl>
## 1 ailenum chr 0 0 6217 NA NA NA
## 2 ailesira chr 0 0 8 NA NA NA
## 3 PassengerId chr 0 0 8693 NA NA NA
## 4 HomePlanet fct 0 0 4 NA NA NA
## 5 CryoSleep fct 0 0 3 NA NA NA
## 6 VRDeck dbl 188 2.2 1307 0 305. 24133
## 7 Name chr 200 2.3 8474 NA NA NA
## 8 Transported lgl 0 0 2 0 0.5 1
## 9 deck chr 199 2.3 9 NA NA NA
## 10 num chr 199 2.3 1818 NA NA NA
## 11 side chr 199 2.3 3 NA NA NA
## 12 Destination chr 182 2.1 4 NA NA NA
## 13 Age dbl 0 0 84 0 28.8 79
## 14 VIP lgl 203 2.3 3 0 0.02 1
## 15 RoomService dbl 181 2.1 1274 0 225. 14327
## 16 FoodCourt dbl 183 2.1 1508 0 458. 29813
## 17 ShoppingMall dbl 208 2.4 1116 0 174. 23492
## 18 Spa dbl 183 2.1 1328 0 311. 22408
Sıra “Destination” değişkenine. Tabloda gördüğümüz üzere “Destination” 182 boşluk içeriyor. Bunlar sayı ya da kategorik değişken olduğunu görmek için “unique” fonksiyonunu kullanacağız
## [1] "TRAPPIST-1e" "PSO J318.5-22" "55 Cancri e" NA
Basit yöntemle yola çıkarak yanlış tahminde bulunmamak için bilinmeyen değişkeni “NA” olarak dolduracağız
“Test” datası için de uygulayacağız
“side” datası için de yukarıdaki aynı işlemi yapabılırız
“Test” datası için de uygulayacağız
“VIP” datası için de yukarıdaki aynı işlemi yapabılırız
“Test” datası için de uygulayacağız
“RoomServis” datası biraz farklı çünkü yolcuların ne kadar harcadığı ile alakalı değişkendir. O yüzden yolcuların gideciği yere(Destination) göre ortalamasını bulacağız.
train <- train %>%
group_by(Destination) %>%
mutate_at(vars(RoomService), ~replace_na(., mean(., na.rm = TRUE)))“Test” datası için de uygulayacağız
test <- test %>%
group_by(Destination) %>%
mutate_at(vars(RoomService), ~replace_na(., mean(., na.rm = TRUE)))“FoodCourt” datasında 183 boşluk var ve bu data rakamlardan oluştuğundan sayılarnı nasıl dağıldığını histogram üzerinden bakabiliriz
Histograma göre yolcuların 8000ni 0 TL harcamış. Boşlukların yerini 0
koyarsak tahminimiz mantıklı olur, onun için “coalesce” kodu
kullanabiliriz
“Test” datası için de uygulayacağız
## # A tibble: 18 × 8
## variable type na na_pct unique min mean max
## <chr> <chr> <int> <dbl> <int> <dbl> <dbl> <dbl>
## 1 ailenum chr 0 0 6217 NA NA NA
## 2 ailesira chr 0 0 8 NA NA NA
## 3 PassengerId chr 0 0 8693 NA NA NA
## 4 HomePlanet fct 0 0 4 NA NA NA
## 5 CryoSleep fct 0 0 3 NA NA NA
## 6 VRDeck dbl 188 2.2 1307 0 305. 24133
## 7 Name chr 200 2.3 8474 NA NA NA
## 8 Transported lgl 0 0 2 0 0.5 1
## 9 deck chr 199 2.3 9 NA NA NA
## 10 num chr 199 2.3 1818 NA NA NA
## 11 side fct 0 0 3 NA NA NA
## 12 Destination fct 0 0 4 NA NA NA
## 13 Age dbl 0 0 84 0 28.8 79
## 14 VIP fct 0 0 3 NA NA NA
## 15 RoomService dbl 0 0 1277 0 225. 14327
## 16 FoodCourt dbl 0 0 1507 0 448. 29813
## 17 ShoppingMall dbl 208 2.4 1116 0 174. 23492
## 18 Spa dbl 183 2.1 1328 0 311. 22408
“ShoppingMall”, “Spa” ve “VRDeck” datalara baktığımızda sayılı değişken olduğunu ve boşlukları 0 olarak doldursak daha mantıklı olacağını düşünebiliriz. Kullanacağımız kod “coalesce”.
train <- train %>% mutate(ShoppingMall = coalesce(ShoppingMall, 0),
Spa = coalesce(Spa, 0),
VRDeck = coalesce(VRDeck, 0))“Test” datası için de uygulayacağız
test <- test %>% mutate(ShoppingMall = coalesce(ShoppingMall, 0),
Spa = coalesce(Spa, 0),
VRDeck = coalesce(VRDeck, 0))“Name” datasındeki bilgiler bizim tahminimize bilgi katmadığından dolayı kaldırabilriz
“Test” datası için de uygulayacağız
“deck” datasındeki boşlukları “NA” olarak doldurabiliriz
“Test” datası için de uygulayacağız
“Train” seti tablosundan ‘num’ değişkenini kaldırabiliriz
Aynı şekilde “Test” datası için
## # A tibble: 17 × 8
## variable type na na_pct unique min mean max
## <chr> <chr> <int> <dbl> <int> <dbl> <dbl> <dbl>
## 1 ailenum chr 0 0 6217 NA NA NA
## 2 ailesira chr 0 0 8 NA NA NA
## 3 PassengerId chr 0 0 8693 NA NA NA
## 4 HomePlanet fct 0 0 4 NA NA NA
## 5 CryoSleep fct 0 0 3 NA NA NA
## 6 VRDeck dbl 0 0 1306 0 298. 24133
## 7 Transported lgl 0 0 2 0 0.5 1
## 8 deck fct 0 0 9 NA NA NA
## 9 side fct 0 0 3 NA NA NA
## 10 Destination fct 0 0 4 NA NA NA
## 11 Age dbl 0 0 84 0 28.8 79
## 12 VIP fct 0 0 3 NA NA NA
## 13 RoomService dbl 0 0 1277 0 225. 14327
## 14 FoodCourt dbl 0 0 1507 0 448. 29813
## 15 ShoppingMall dbl 0 0 1115 0 170. 23492
## 16 Spa dbl 0 0 1327 0 305. 22408
## 17 aile dbl 0 0 2 0 0.45 1
## # A tibble: 16 × 8
## variable type na na_pct unique min mean max
## <chr> <chr> <int> <dbl> <int> <dbl> <dbl> <dbl>
## 1 ailenum chr 0 0 3063 NA NA NA
## 2 ailesira chr 0 0 8 NA NA NA
## 3 PassengerId chr 0 0 4277 NA NA NA
## 4 HomePlanet fct 0 0 4 NA NA NA
## 5 CryoSleep fct 0 0 3 NA NA NA
## 6 deck fct 0 0 9 NA NA NA
## 7 side fct 0 0 3 NA NA NA
## 8 Destination fct 0 0 4 NA NA NA
## 9 Age dbl 0 0 83 0 28.7 79
## 10 VIP fct 0 0 3 NA NA NA
## 11 RoomService dbl 0 0 846 0 219. 11567
## 12 FoodCourt dbl 0 0 902 0 429. 25273
## 13 ShoppingMall dbl 0 0 715 0 173. 8292
## 14 Spa dbl 0 0 833 0 296. 19844
## 15 VRDeck dbl 0 0 796 0 305. 22272
## 16 aile dbl 0 0 2 0 0.45 1
“Train” ve “Test” datasındaki ‘ailenum’ ve ‘ailesira’ değişkenleri kaldırabiliriz
Datamız temizlendi ve sonraki işlem için hazır.
Tahmin
Logistic Regresyon (1.Model)
Lojistik regresyon (Logistic Regression), bir sınıflandırma modelidir ve genellikle ikili (binary) sınıflandırma problemlerinde kullanılır. Temel amacı, bir dizi bağımsız değişken kullanılarak bir bağımlı değişkenin kategorik bir sınıflandırmasını yapmaktır. Örneğin, bir öğrencinin sınavı geçip geçmediğini tahmin etmek veya bir e-postanın spam olup olmadığını sınıflandırmak gibi uygulamalarda yaygın olarak kullanılır.
Lojistik regresyon, bir sınıflandırma modelidir. Genellikle ikili sınıflandırma problemleri için kullanılır, yani çıktı sınıfları yalnızca iki tane olabilir (0 veya 1, Evet veya Hayır, Sağlıklı veya Hasta).
Lojistik regresyon, sınıflandırma problemlerinde yaygın olarak kullanılan bir modeldir ve basitliği, yorumlanabilirliği ve iyi performansı nedeniyle tercih edilmektedir.
Ilk önce Regresyonda
kullanmayacığımız “Train” ve “Test” veri setindeki ’PassengerId’yi
şimdilik regresyona dahil etmeyeceğiz o yüzden “train_set” ve “test_set”
oluşturacağız
Oluşturduğumuz “train_set”i 2 gruba yani “training_set” ve “testing_set” olarak oluşturacağız
library(caTools)
set.seed(123)
split = sample.split(train_set$Transported, SplitRatio = 0.75)
training_set = subset(train_set, split == TRUE)
testing_set = subset(train_set, split == FALSE)Regresyon oluşturacağız
Regresyonu tahmin ederiz. Datamız ‘testing_set’. Datadeki ‘Transported’ değişkeni dahil etmeyeceğiz
## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from rank-deficient fit; attr(*, "non-estim") has doubtful cases
Aşağıdaki kodla tahminimiz yani prob_pred > 0,5 ise 1 olarak, eğer 0,5 den küçükse 0 olacağını belirteceğiz
“testing_set” setindeki ‘Transported’ değişkeninin gerçek değerleri ’TRUE’e eşitse 1 olarak işaretleyecek
“cm” kodu yardımıyla y_true(gerçek değerlerle) ve y_pred(tahmninleri) karşılaştırabliriz
## y_pred
## y_true 0 1
## 0 819 260
## 1 189 905
## [1] 0.7933732
Son olarak bütün “train_set”i regresyona dahil edeceğiz
## Warning: glm.fit: возникли подогнанные вероятности 0 или 1
Regresyonu tahmin ederiz. Datamız “test_set”. Tahminleri ise ‘TRUE’ ve ‘FALSE’ olarak işaretleriz
## Warning in predict.lm(object, newdata, se.fit, scale = 1, type = if (type == :
## prediction from rank-deficient fit; attr(*, "non-estim") has doubtful cases
Kaggle tahminlerimizin formatını aşağıdaki görselde olduğu gibi kabul eder ve biz de ona göre oluşturacağız
’Transported’u vektor olarak belirteceğiz
“cbind” kodu yardımıyla ‘PassengerId’ ve ‘Transported’ değerlerini birleştirebiliriz
‘submission_logistic.csv’ olarak ‘Final Projesi’ dosyamıza kayd ederiz ve onu Kaggle’e yükleyip ne kadar doğru tahmin ettiğimizi görebiliriz
Naive Bayes (2.Model)
Naive Bayes, özellikle sınıflandırma problemleri için kullanılan olasılıksal bir modeldir. Temel amacı, Bayes Teoremi’ni kullanarak bir belge veya örneğin bir sınıfa ait olma olasılığını tahmin etmektir. Bu model, “naive” (saf veya basit) adını, modelin varsayımlarının birbirinden bağımsız ve eşit olasılıklı olduğu varsayımından alır. Bu varsayım, modelin pratikte oldukça etkili olmasına rağmen, gerçekteki durumları basitleştirdiği için “naive” olarak adlandırılır.
Naive Bayes modelinin farklı türleri vardır, en yaygın olanları şunlardır: Bernoulli Naive Bayes: Binarry veri setlerinde kullanılır. Multinomial Naive Bayes: Çok sınıflı sınıflandırma problemleri için kullanılır. Gaussian Naive Bayes: Sürekli özelliklere sahip veri setlerinde kullanılır.
Bu modeli kullanmak için “e1071” paketi kullanacağız.
Regresyon oluşturacağız
Regresyonu tahmin ederiz. Datamız ‘testing_set’. Datadeki ‘Transported’ değişkeni dahil etmeyeceğiz
Aşağıdaki kodla TRUE > 0,5 ise 1 olarak, eğer 0,5 den küçükse 0 olacağını belirteceğiz
“cm” kodu yardımıyla y_true(gerçek değerlerle) ve y_pred(tahmninleri) karşılaştırabliriz
Son olarak bütün “train_set”i regresyona dahil edeceğiz
Regresyonu tahmin ederiz. Datamız “test_set”. Tahminleri ise 0,5 büyükse ‘TRUE’ ve ‘FALSE’ olarak işaretleriz
preds <- predict(nb_final, newdata = test_set, type = "raw") %>%
data.frame()
y_pred = ifelse(preds$TRUE. > 0.5, TRUE, FALSE)’Transported’u vektor olarak belirteceğiz
“cbind” kodu yardımıyla ‘PassengerId’ ve ‘Transported’ değerlerini birleştirebiliriz
‘submission_nb.csv’ olarak ‘Final Projesi’ dosyamıza kayd ederiz ve onu Kaggle’e yükleyip ne kadar doğru tahmin ettiğimizi görebiliriz
“RANDOM FOREST” (3.Model)
Random Forest (Rastgele Orman) algoritması; birden çok karar ağacı üzerinden her bir karar ağacını farklı bir gözlem örneği üzerinde eğiterek çeşitli modeller üretip, sınıflandırma oluşturmanızı sağlamaktadır.
Kullanım kolaylığı ve esnekliği; hem sınıflandırma hem de regresyon problemlerini ele aldığı için benimsenmesini ve kullanımının yaygınlaşmasını hızlandırdı.
Algoritmaya yönelik en beğenilen nokta ise; veri kümeniz üzerinde çeşitli modellerin oluşturulması ile kümenizi yeniden ve daha derin keşfetme imkanı sunmasıdır.
Bu paket, sınıflandırma ve regresyon problemleri için Random Forest modellerini oluşturmak ve değerlendirmek için kullanılır.
Regresyon oluşturacağız
Tahminde kullanacağımız en önemli değişkenleri “varImpPlot()” kodunu kullanarak grafikten inceleyebiliriz
Grafikte gördüğümüz gibi tahminde kullanılacak en önemli ilk 4 değişkenler sırasıyla “Spa”, “CryoSleep,”RoomService” ve “VRDeck”
Regresyonu tahmin ederiz. Datamız ‘test_set’
’Transported’u vektor olarak belirteceğiz
“cbind” kodu yardımıyla ‘PassengerId’ ve ‘Transported’ değerlerini birleştirebiliriz
‘submission_random.csv’ olarak ‘Final Projesi’ dosyamıza kayd ederiz ve onu Kaggle’e yükleyip ne kadar doğru tahmin ettiğimizi görebiliriz