.Kaggle’den Veri Setini Yüklemek

.Veri Setinin İç Yapısını Görüntülemek

.“Train” ve “Test” veri setini eksik değerlerini ele alıp, gereken değişiklikleri yapmak ve temizlemek

.Tahmin:

Logistic Regresyon (1.Model)

Naive Bayes (2.Model)

“RANDOM FOREST” (3.Model)

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)

Veri setinin iç yapısını görüntülemek

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>

“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

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.

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

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)