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
library(readr)
train <- read_csv("train.csv")
## Rows: 8693 Columns: 14
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): PassengerId, HomePlanet, Cabin, Destination, Name
## dbl (6): Age, RoomService, FoodCourt, ShoppingMall, Spa, VRDeck
## lgl (3): CryoSleep, VIP, Transported
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(train)
test <- read_csv("test.csv")
## Rows: 4277 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): PassengerId, HomePlanet, Cabin, Destination, Name
## dbl (6): Age, RoomService, FoodCourt, ShoppingMall, Spa, VRDeck
## lgl (2): CryoSleep, VIP
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(test)
str(train)
## 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>
“Tidyverse” bir çok yardımcı paketleri içeren bir pakettir
library(tidyverse)
## ── 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.5.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ── 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
library(explore)
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ı
library(stringr)
train[c('ailenum', 'ailesira')] <- str_split_fixed(train$PassengerId, "_", 2)
“Test” datası için uygulayacağız
test[c('ailenum', 'ailesira')] <- str_split_fixed(test$PassengerId, "_", 2)
“Train” datası için aile numarası ve aile sırasını ilk sütuna alıyoruz
train <- train[, c(15:16, 1:14)]
“Test” datası için aile numarası v aile sırasını ilk sütuna alıyoruz
test <- test[, c(14:15, 1:13)]
Dikkat edersek tablodeki “Cabin” değişkeninde 3 farklı bilgi verilmiş, biz onları ayrı ayrı sütuna ayıracağız
train[c('deck', 'num', 'side')] <- str_split_fixed(train$Cabin, '/', 3)
“Test” datası için aynı değişikliği uygulayacağız
test[c('deck', 'num', 'side')] <- str_split_fixed(test$Cabin, '/', 3)
train[train == ''] <- NA
test[test == ''] <- NA
“Cabin” bilgileri 3’e ayırdıktan sonra tekrar sütunları sıralayacağız
train <- train[, c(1:6, 17,18,19, 7:16)]
Yukarıdaki aynı işlemi “Test” datası için de uygulayacağız
test <- test[, c(1:5, 16,17,18, 6:15)]
Değişiklik yapıldıktan sonra “Cabin” sütununu kaldırabiliriz
train <- train[, c( 1,2, 3,4, 5, 17,18,19, 7:16 )]
“Test” datası için de uygulayacağız
test <- test[, c( 1,2, 3,4:8, 10:18 )]
“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
train$HomePlanet <- addNA(train$HomePlanet)
“Test” datası için de uygulayacağız
test$HomePlanet <- addNA(test$HomePlanet)
levels(train$HomePlanet)
## [1] "Earth" "Europa" "Mars" NA
levels(train$HomePlanet)[is.na(levels(train$HomePlanet))] <- "NA"
levels(test$HomePlanet)[is.na(levels(test$HomePlanet))] <- "NA"
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
train$CryoSleep <- addNA(train$CryoSleep)
“Test” datası için de uygulayacağız
test$CryoSleep <- addNA(test$CryoSleep)
levels(train$CryoSleep)[is.na(levels(train$CryoSleep))] <- "NA"
levels(test$CryoSleep)[is.na(levels(test$CryoSleep))] <- "NA"
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
unique(train$Destination)
## [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
train$Destination <- addNA(train$Destination)
“Test” datası için de uygulayacağız
test$Destination <- addNA(test$Destination)
levels(train$Destination)[is.na(levels(train$Destination))] <- "NA"
levels(test$Destination)[is.na(levels(test$Destination))] <- "NA"
“side” datası için de yukarıdaki aynı işlemi yapabiliriz
train$side <- addNA(train$side)
“Test” datası için de uygulayacağız
test$side <- addNA(test$side)
levels(train$side)[is.na(levels(train$side))] <- "NA"
levels(test$side)[is.na(levels(test$side))] <- "NA"
“VIP” datası için de yukarıdaki aynı işlemi yapabiliriz
train$VIP <- addNA(train$VIP)
“Test” datası için de uygulayacağız
test$VIP <- addNA(test$VIP)
levels(train$VIP)[is.na(levels(train$VIP))] <- "NA"
levels(test$VIP)[is.na(levels(test$VIP))] <- "NA"
“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
hist(train$FoodCourt)
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
train <- train %>% mutate(FoodCourt = coalesce(FoodCourt, 0))
“Test” datası için de uygulayacağız
test <- test %>% mutate(FoodCourt = coalesce(FoodCourt, 0))
train %>% describe_all()
## # 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
## # 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
train <- train %>% select(-Name)
“Test” datası için de uygulayacağız
test <- test %>% select(-Name)
“deck” datasındeki boşlukları “NA” olarak doldurabiliriz
train$deck <- addNA(train$deck)
“Test” datası için de uygulayacağız
test$deck <- addNA(test$deck)
levels(train$deck)[is.na(levels(train$deck))] <- "NA"
levels(test$deck)[is.na(levels(test$deck))] <- "NA"
“Train” seti tablosundan ‘num’ değişkenini kaldırabiliriz
train <- train %>% select(-num)
Aynı şekilde “Test” datası için
test <- test %>% select(-num)
train$aile <- ifelse(duplicated(train$ailenum) | duplicated(train$ailenum, fromLast = TRUE), 1, 0)
test$aile <- ifelse(duplicated(test$ailenum) | duplicated(test$ailenum, fromLast = TRUE), 1, 0)
train %>% describe_all()
## # 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
test %>% describe_all()
## # 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
## # 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
train <- train %>% select(-c(ailenum, ailesira))
test <- test %>% select(-c(ailenum, ailesira))
Datamız temizlendi ve sonraki işlem için hazır.
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
train_set <- train[2:15]
test_set <- test[2:14]
Oluşturduğumuz “train_set”i 2 gruba yani “training_set” ve “testing_set” olarak oluşturacağız
İlk olarak kütüphanemizde olmayan caTools paketini yüklemeliyiz.
##instaal.packages(caTools)
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
logistic = glm(formula = Transported ~ .,
family = binomial,
data = training_set)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Regresyonu tahmin ederiz. Datamız ‘testing_set’. Datadeki ‘Transported’ değişkeni dahil etmeyeceğiz
prob_pred = predict(logistic, type = 'response', newdata = testing_set[-4])
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
y_pred = ifelse(prob_pred > 0.5, 1, 0)
“testing_set” setindeki ‘Transported’ değişkeninin gerçek değerleri ’TRUE’e eşitse 1 olarak işaretleyecek
y_true = ifelse(testing_set[4] == TRUE, 1, 0)
“cm” kodu yardımıyla y_true(gerçek değerlerle) ve y_pred(tahmninleri) karşılaştırabliriz
cm = table(y_true, y_pred )
cm
## y_pred
## y_true 0 1
## 0 819 260
## 1 189 905
(819+905)/(819+905+260+189)
## [1] 0.7933732
Son olarak bütün “train_set”i regresyona dahil edeceğiz
logistic_son = glm(formula = Transported ~ .,
family = binomial,
data = train_set)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Regresyonu tahmin ederiz. Datamız “test_set”. Tahminleri ise ‘TRUE’ ve ‘FALSE’ olarak işaretleriz
prob_pred = predict(logistic_son, type = 'response', newdata = test_set)
y_pred = ifelse(prob_pred > 0.5, TRUE, FALSE)
Kaggle tahminlerimizin formatını aşağıdaki görselde olduğu gibi kabul eder ve bizde bu modele göre ilerlemeliyiz.
Transported <- as.character(y_pred)
PassengerId <- test$PassengerId
’Transported’u vektör olarak belirteceğiz
Transported <- as.vector(Transported)
“cbind” kodu yardımıyla ‘PassengerId’ ve ‘Transported’ değerlerini birleştirebiliriz
submission <- cbind(PassengerId, Transported)
submission <-as.data.frame(submission)
library(stringr)
submission$Transported <- str_to_title(submission$Transported)
‘submission_logistic.csv’ dosyasını ‘Final Projesi’ dosyamıza kaydederiz ve onu Kaggle’e yükleyip ne kadar doğru tahmin ettiğimizi görebiliriz
write.csv(submission, "submission_logistic.csv", row.names = FALSE,
quote=FALSE)
## 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.
library(e1071)
Regresyon oluşturacağız
fit_nb <- naiveBayes(Transported ~ ., data = training_set)
Regresyonu tahmin ederiz. Datamız ‘testing_set’. Datadeki ‘Transported’ değişkeni dahil etmeyeceğiz
preds <- predict(fit_nb, newdata = testing_set[-4], type = "raw") %>%
data.frame()
Aşağıdaki kodla TRUE > 0,5 ise 1 olarak, eğer 0,5 den küçükse 0 olacağını belirteceğiz
y_pred = ifelse(preds$TRUE. > 0.5, 1, 0)
“cm” kodu yardımıyla y_true(gerçek değerlerle) ve y_pred(tahminleri) karşılaştırabliriz
cm = table(y_true, y_pred )
Son olarak bütün “train_set”i regresyona dahil edeceğiz
nb_final = naiveBayes(Transported ~ ., data = train_set)
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 <- as.character(y_pred)
PassengerId <- test$PassengerId
’Transported’u vektör olarak belirteceğiz
Transported <- as.vector(Transported)
“cbind” kodu yardımıyla ‘PassengerId’ ve ‘Transported’ değerlerini birleştirebiliriz.
submission <- cbind(PassengerId, Transported)
submission <-as.data.frame(submission)
submission$Transported <- str_to_title(submission$Transported)
‘submission_nb.csv’ olarak ‘Final Projesi’ dosyamıza kaydederiz 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.
library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:dplyr':
##
## combine
## The following object is masked from 'package:ggplot2':
##
## margin
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
fit_rf <- randomForest(Transported ~ .,
data = train_set)
## Warning in randomForest.default(m, y, ...): The response has five or fewer
## unique values. Are you sure you want to do regression?
Tahminde kullanacağımız en önemli değişkenleri “varImpPlot()” kodunu kullanarak grafikten inceleyebiliriz
varImpPlot(fit_rf)
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’
preds = predict(fit_rf, newdata = test_set, type = "class")
y_pred = ifelse(preds == TRUE, TRUE, FALSE)
Transported <- as.character(y_pred)
PassengerId <- test$PassengerId
’Transported’u vektor olarak belirteceğiz
Transported <- as.vector(Transported)
“cbind” kodu yardımıyla ‘PassengerId’ ve ‘Transported’ değerlerini birleştirebiliriz
submission <- cbind(PassengerId, Transported)
submission <-as.data.frame(submission)
submission$Transported <- str_to_title(submission$Transported)
‘submission_random.csv’ olarak ‘Final Projesi’ dosyamıza kaydederiz ve onu Kaggle’e yükleyip ne kadar doğru tahmin ettiğimizi görebiliriz
write.csv(submission, "submission_random.csv", row.names = FALSE,
quote=FALSE)