ÖDEV

Öğrenci: OUSMANE SOULEYMANE MAHAMOUT

Ödevde 5 adet makine öğrenmesi algoritması kullanılarak Titanic gemisinden kurtulan yolcuların tahmini yapılacaktır. Veri özellikleri şu şekildedir: image.png

TITANIC VERİ SETİ

Survived: Hayatta kalma 0 = Hayır, 1 = Evet

Pclass: Bilet sınıfı 1 = 1. sınıf, 2 = 2. sınıf, 3 = 3. sınıf

Sex: Cinsiyet

Age: Yaş

SibSp: Gemide bulunan kardeş/eş sayısı

Parch: Gemide bulunan ebeveyn/çocuk sayısı

Ticket: Bilet numarası

Fare: Yolcu ücreti

Cabin: Kabin numarası

Embarked: Biniş Limanı C = Cherbourg, Q = Queenstown, S = Southampton

Değişkenler ile ilgili özel notlar

pclass: Sosyo-ekonomik durumu temsil eden bir değer 1st = Üst 2nd = Orta 3rd = Alt

age: Yaş, 1’den küçükse kesirli. Eğer yaş tahmin edilmişse, xx.5 biçimindedir.

sibsp: Veri seti, aile ilişkilerini şu şekilde tanımlar: Sibling = kardeş, kız kardeş, üvey kardeş, üvey kız kardeş Spouse = eş (metresler ve nişanlılar görmezden gelinmiştir)

parch: Veri seti, aile ilişkilerini şu şekilde tanımlar: Parent = anne, baba Child = kız, erkek, üvey kız, üvey erkek Bazı çocuklar sadece bir dadıyla seyahat ettiği için parch=0’dır.

Öncelikle veri ilgili csv dosyasından alınarak kontrol edilir, daha sonra veri önişleme adımlarına başlanır.

library(tidyverse) # veri işlemleri ile ilgili kütüphane
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── 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
df = read.csv("C://Project//Ousmane//train.csv")
head(df)
##   PassengerId Survived Pclass
## 1           1        0      3
## 2           2        1      1
## 3           3        1      3
## 4           4        1      1
## 5           5        0      3
## 6           6        0      3
##                                                  Name    Sex Age SibSp Parch
## 1                             Braund, Mr. Owen Harris   male  22     1     0
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1     0
## 3                              Heikkinen, Miss. Laina female  26     0     0
## 4        Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1     0
## 5                            Allen, Mr. William Henry   male  35     0     0
## 6                                    Moran, Mr. James   male  NA     0     0
##             Ticket    Fare Cabin Embarked
## 1        A/5 21171  7.2500              S
## 2         PC 17599 71.2833   C85        C
## 3 STON/O2. 3101282  7.9250              S
## 4           113803 53.1000  C123        S
## 5           373450  8.0500              S
## 6           330877  8.4583              Q

VERİ ÖNİŞLEME ADIMLARI

Veri incelendiğinde ilk olarak SibSp ve Parch sütunları birleştirilerek toplamı Family adında bir sütuna yazılmasına karar verildi.

Family Sütununun Eklenmesi

# Family sütunu oluşturularak aile ile ilgili kolonların toplamı bu sütuna yazılır.
df$Family = (df$SibSp + df$Parch)

isAlone Sütununun Eklenmesi

Kişinin yalnız seyahat edip etmediğini belirten bir isAlone sütunu da oluşturabiliriz. Eğer Family sütunu 0 ise kişi yalnız seyahat ediyor demektir.

# isAlone sütunu oluşturulur ve Family sütunu 0 dan büyükse 1 olarak işaretlenir.
df$isAlone = 1
df$isAlone[df$Family > 0] = 0
head(df)
##   PassengerId Survived Pclass
## 1           1        0      3
## 2           2        1      1
## 3           3        1      3
## 4           4        1      1
## 5           5        0      3
## 6           6        0      3
##                                                  Name    Sex Age SibSp Parch
## 1                             Braund, Mr. Owen Harris   male  22     1     0
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1     0
## 3                              Heikkinen, Miss. Laina female  26     0     0
## 4        Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1     0
## 5                            Allen, Mr. William Henry   male  35     0     0
## 6                                    Moran, Mr. James   male  NA     0     0
##             Ticket    Fare Cabin Embarked Family isAlone
## 1        A/5 21171  7.2500              S      1       0
## 2         PC 17599 71.2833   C85        C      1       0
## 3 STON/O2. 3101282  7.9250              S      0       1
## 4           113803 53.1000  C123        S      1       0
## 5           373450  8.0500              S      0       1
## 6           330877  8.4583              Q      0       1

Eksik Verilerin Kontrolü ve Tamamlanması

df[df == ''] <- NA

empty_columns = function(data) {
  total = colSums(is.na(data))
  percent = round(colSums(is.na(data))/nrow(data)*100, 2)
    return (tibble(names = colnames(data),total, percent))
}
empty_columns(df)
## # A tibble: 14 × 3
##    names       total percent
##    <chr>       <dbl>   <dbl>
##  1 PassengerId     0    0   
##  2 Survived        0    0   
##  3 Pclass          0    0   
##  4 Name            0    0   
##  5 Sex             0    0   
##  6 Age           177   19.9 
##  7 SibSp           0    0   
##  8 Parch           0    0   
##  9 Ticket          0    0   
## 10 Fare            0    0   
## 11 Cabin         687   77.1 
## 12 Embarked        2    0.22
## 13 Family          0    0   
## 14 isAlone         0    0

Eksik veriler kontrol edildiğinde Age verilerinin yaklaşık %20’sinin, Cabin verilerinin %77 sinin ve Embarked verilerinin %0.22 sinin eksik olduğu görülür.

Cabin kolonunun Survived durumunu etkilemeyeceği düşünülmektedir. Bu nedenle bu kolonlar doldurulmayacaktır.

Embarked verisi sadece 2 adet satırda eksiktir, bu nedenle en sık tekrar eden Embarked verisi ile boş veriler tamamlanacaktır.

Age sütunu ise bu sütundaki değerlerin ortalaması ile doldurulacaktır.

Öncelikle Embarked değeri için en sık kullanılan değer bulunur:

col = unique(df$Embarked)
tab = tabulate(match(df$Embarked, col))
col[tab == max(tab)]
## [1] "S"

En sık tekrar değer eden değerin ‘S’ olduğu görülür ve Embarked değeri boş olan 2 satırın Embarked değeri ‘S’ olarak doldurulur.

df$Embarked[is.na(df$Embarked)] = 'S'

Age değeri ortalama yaş değerleriyle doldurulur:

df$Age[is.na(df$Age)] = median(df$Age, na.rm = TRUE)
head(df)
##   PassengerId Survived Pclass
## 1           1        0      3
## 2           2        1      1
## 3           3        1      3
## 4           4        1      1
## 5           5        0      3
## 6           6        0      3
##                                                  Name    Sex Age SibSp Parch
## 1                             Braund, Mr. Owen Harris   male  22     1     0
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1     0
## 3                              Heikkinen, Miss. Laina female  26     0     0
## 4        Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1     0
## 5                            Allen, Mr. William Henry   male  35     0     0
## 6                                    Moran, Mr. James   male  28     0     0
##             Ticket    Fare Cabin Embarked Family isAlone
## 1        A/5 21171  7.2500  <NA>        S      1       0
## 2         PC 17599 71.2833   C85        C      1       0
## 3 STON/O2. 3101282  7.9250  <NA>        S      0       1
## 4           113803 53.1000  C123        S      1       0
## 5           373450  8.0500  <NA>        S      0       1
## 6           330877  8.4583  <NA>        Q      0       1

Makine öğrenmesinde kullanılmayacak olan sütunlar veriden silinir:

delete_columns <- c('Name', 'SibSp', 'Parch', 'Ticket', 'Cabin', 'Fare')
df <- df[, !names(df) %in% delete_columns]
head(df)
##   PassengerId Survived Pclass    Sex Age Embarked Family isAlone
## 1           1        0      3   male  22        S      1       0
## 2           2        1      1 female  38        C      1       0
## 3           3        1      3 female  26        S      0       1
## 4           4        1      1 female  35        S      1       0
## 5           5        0      3   male  35        S      0       1
## 6           6        0      3   male  28        Q      0       1

Veri makine öğrenmesinde kullanılması için train ve test olmak üzere 2’ye ayrılır:

tr = df[sample(1:nrow(df), 0.8 * nrow(df)),]  
test = df[-sample(1:nrow(df), 0.8 * nrow(df)),]

MODELLER

1. LİNEAR REGRESSİON (DOĞRUSAL REGRESYON)

Doğrusal regresyon, bir dizi noktaya en uygun düz çizgiyi veya hiper düzlemi bulmak için kullanılmaktadır. Bir diğer ifadeyle doğrusal regresyon, en uygun düz çizgi (regresyon çizgisi olarak da bilinir ) kullanarak bağımlı değişken (Y) ile bir veya daha fazla bağımsız değişken (X) arasında bir ilişki kurar. Aşağıdaki grafikte kırmızı çizgi en uygun düz çizgi olarak adlandırılır.

Makine öğreniminde bu model için denklemi şu şekilde yazarız:

y′=b+w1x1

→y′ öngörülen etikettir(istenen çıktı).

→b bias (the y-intercept)

→w1 özellik 1’in ağırlığıdır. Ağırlık “eğim” ile aynı kavramdır.

→x1 bir özelliktir (bilinen bir girdi)

Bu model yalnızca bir özellik kullanıyor olsa da, daha karmaşık bir model, her biri ayrı bir ağırlığa sahip olan birden fazla özelliğe güvenebilir (w1, w2, vb.). Örneğin, üç özelliğe dayanan bir model aşağıdaki gibi görünebilir:

İki boyutlu dağılımlar, bir değişkenin diğerini nasıl etkilediğinin anlaşılmasında yardımcı olmaktadır. Bu bir neden-sonuç bağımlılığı olabilir, örneğin yağmur miktarı (neden), tarımsal üretimde (etki) bir artışa yol açar.

İki boyutlu dağılımı temsil etmek için kartezyen bir koordinat sistemi kullanırsak, dağılım diyagramıyla bilinen bir dizi nokta elde ederiz; bu analiz, şekilde gösterildiği gibi her iki değişken arasındaki ilişkiyi niteliksel olarak incelememize izin verir.

Verilen veri noktalarına dayanarak, noktaları en iyi modelleyen bir çizgi çizmeye çalışıyoruz. X ekseninde giriş özelliğimize, y ekseninde ise hedef değere sahibiz. Noktaların yayılım gösterdiği çizgiye uyacak şekilde line çiziyoruz. Bu çizgi artık girdi olarak verilen değerleri tahmin eden bir model. Bu modele bakarak dağılımda olmayan bir x değeri için elde edilecek tahmini y değerini tahmin edebiliriz.

Peki iyi bir çizgimiz olup olmadığını nasıl bilebiliriz? Loss (kayıp) kavramı var. Belirli bir x değeri için tahmin ile gerçek değer arasındaki farka bakarak bu kaybı tanımlayabiliriz.

Loss Function for Regression

Gerçek değerden uzaklaştıkça yaşadığımız kayıp bir kare ile artar. Bir modeli eğitirken sadece bir örnekteki kaybı en aza indirmekle ilgilenmiyoruz, tüm veri setimizdeki kaybı en aza indirmeyi önemsiyoruz.

Loss, kötü bir tahminin cezasıdır. Yani kayıp modelin tahmininin tek bir örnek üzerinde ne kadar kötü olduğunu gösteren bir sayıdır. Modelin tahmini mükemmelse kayıp sıfırdır. Bir modeli eğitmenin amacı tüm örneklerde ortalama olarak düşük kayıplı bir ağırlık bulmaktır.

Squared Loss : a popular loss function

= the square of the difference between the label and the prediction

= (observation — prediction(x))2

= (y — y’)2

Mean Squared Error (MSE)

Modelimizin belirli bir veri seti üzerindeki performansını değerlendirmek için model tahminlerinin gerçek sonuçlarla ne kadar örtüştüğünü ölçmemize yarayacak yöntemlere ihtiyaç duyarız. Yani, belirli bir gözlem için tahmin edilen değerin o gözlemin gerçek değerine ne kadar yakın olduğunu sayısallaştırmamız gerekiyor. Regresyon için, en yaygın olarak kullanılan ölçüm Ortalama Karesel Hata (Mean Squared Error-MSE)’dır.

Tüm veri kümesinde örnek başına ortalama kare kaybıdır. MSE’yi hesaplamak için tek tek örnekler için tüm kare kayıpları toplanarak örnek sayısını bölünür.

(x,y) bir örnek:

→x modelin tahminlerde bulunmak için kullandığı özellikler kümesidir

→y örneğin etiketidir

→D birçok etiketli örnek içeren bir veri kümesidir. (x,y) çiftleri.

→ N- içindeki örnek sayısı D.

Amacımız, bize tüm noktalardan geçen en iyi çizgiyi sağlayacak olan bu ortalamayı en aza indirmektir. MSE, regresyon eğrisinin bir dizi noktaya ne kadar yakın olduğunu söyler. Tahminleyicinin performansını ölçer, her zaman pozitif değerlidir.

MSE değeri sıfıra yakın olan tahminleyicilerin daha iyi bir performans gösterdiği söylenebilir. Tahmin edilen değerler gerçek değerlere ne kadar yakınsa MSE o kadar küçük olur; gerçek değerlerden ne kadar uzaklaşırsa MSE o kadar büyük olur.

Verilerle doğrusal model eğitelim.

lm  <- lm(Survived~., data = tr)
summary(lm)
## 
## Call:
## lm(formula = Survived ~ ., data = tr)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.92429 -0.20356 -0.07543  0.21361  1.00064 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.389e+00  7.205e-02  19.277  < 2e-16 ***
## PassengerId  3.882e-05  5.490e-05   0.707 0.479794    
## Pclass      -1.676e-01  1.932e-02  -8.672  < 2e-16 ***
## Sexmale     -5.271e-01  3.109e-02 -16.950  < 2e-16 ***
## Age         -5.035e-03  1.189e-03  -4.237 2.57e-05 ***
## EmbarkedQ    2.976e-02  6.128e-02   0.486 0.627421    
## EmbarkedS   -5.174e-02  3.696e-02  -1.400 0.161993    
## Family      -4.628e-02  1.190e-02  -3.891 0.000109 ***
## isAlone     -1.027e-01  4.143e-02  -2.478 0.013440 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3714 on 703 degrees of freedom
## Multiple R-squared:  0.4299, Adjusted R-squared:  0.4235 
## F-statistic: 66.28 on 8 and 703 DF,  p-value: < 2.2e-16

Oluşturulan modelin grafiği aşağıdaki gibi olacaktır:

plot(lm)

Confusion matrixi ve accuracy değeri hesaplanır:

lm_prediction = predict(lm, test)
lm_conf_matrix = table(lm_prediction, test$Survived)
lm_conf_matrix
##                      
## lm_prediction         0 1
##   -0.166042782141915  1 0
##   -0.1347351054402    1 0
##   -0.0885890562562462 1 0
##   -0.0687137377942605 1 0
##   -0.0641450410903088 1 0
##   -0.0282092292886423 1 0
##   -0.0167348530555062 1 0
##   -0.0117600762091538 1 0
##   0.00587527546082334 1 0
##   0.00691121992022513 1 0
##   0.0103101351081608  1 0
##   0.0261647581994783  1 0
##   0.028766935177391   1 0
##   0.0315556597181341  1 0
##   0.0414882224841138  1 0
##   0.0428092614593367  1 0
##   0.0460113590786324  1 0
##   0.0465903655283483  0 1
##   0.0574085743974367  1 0
##   0.0580852400215706  1 0
##   0.0630708178132765  1 0
##   0.0656062507889757  1 0
##   0.0676733260563349  1 0
##   0.0680129430738823  0 1
##   0.0735686096898017  1 0
##   0.0773121361215891  1 0
##   0.0823351544299533  0 1
##   0.083151813898295   1 0
##   0.0847433362157333  1 0
##   0.0865010202359488  1 0
##   0.0867230347081565  1 0
##   0.0867232816208258  1 0
##   0.0925068597154322  1 0
##   0.0925456773329305  1 0
##   0.105212508475737   1 0
##   0.110436549988858   1 0
##   0.112626673417949   1 0
##   0.113890619643468   1 0
##   0.121421144542816   1 0
##   0.12332944461475    1 0
##   0.123889926411661   1 0
##   0.124416337904708   1 0
##   0.131148820883879   1 0
##   0.132824122355463   0 1
##   0.133156794813204   1 0
##   0.133737694843287   1 0
##   0.134813233126566   1 0
##   0.13523081464037    1 0
##   0.135861308799025   1 0
##   0.137763835830347   1 0
##   0.14656555894993    1 0
##   0.146587341415497   1 0
##   0.148677255945907   1 0
##   0.14974782293346    1 0
##   0.150247594370565   1 0
##   0.153940906274644   1 0
##   0.15976265797133    1 0
##   0.16041781015517    1 0
##   0.161580250606466   0 1
##   0.163173860997563   1 0
##   0.16352321955505    1 0
##   0.169240176307991   1 0
##   0.172429002941384   1 0
##   0.175479045744586   1 0
##   0.175556680979583   1 0
##   0.184900628963226   1 0
##   0.191183052784184   1 0
##   0.213367574869386   0 1
##   0.215883819672189   1 0
##   0.22922660546631    1 0
##   0.229575974570566   1 0
##   0.232254379631192   1 0
##   0.251720437755383   1 0
##   0.259833319812569   1 0
##   0.265688636135693   1 0
##   0.276102555962713   1 0
##   0.288679586979028   1 0
##   0.290177723115017   1 0
##   0.307563257893939   1 0
##   0.316114024976391   0 1
##   0.31641842199723    0 1
##   0.316468048498922   1 0
##   0.323695049924137   1 0
##   0.324483084705007   1 0
##   0.334170361032339   1 0
##   0.338303665540018   0 1
##   0.366510770315786   0 1
##   0.372168442675036   1 0
##   0.380886386640473   0 1
##   0.381366855948958   0 1
##   0.382293696922994   0 1
##   0.384183677510385   1 0
##   0.386104982537203   0 1
##   0.386226564128639   1 0
##   0.402187764019877   1 0
##   0.412590885509473   1 0
##   0.417404270079286   1 0
##   0.417896992693775   1 0
##   0.418646433839238   0 1
##   0.423537453644048   1 0
##   0.432792137236039   1 0
##   0.433052434896224   1 0
##   0.438903003905713   0 1
##   0.461324288081454   0 1
##   0.462156153392825   1 0
##   0.463370854541958   1 0
##   0.472326369177431   1 0
##   0.479531002234356   0 1
##   0.483272937312006   0 1
##   0.494570724383477   1 0
##   0.495284616270972   0 1
##   0.508422387562701   1 0
##   0.510995468681175   0 1
##   0.516023678722471   1 0
##   0.525434555196435   1 0
##   0.536571304168258   0 1
##   0.537558645245016   0 1
##   0.545425897233432   1 0
##   0.5606326396403     1 0
##   0.591177379410583   1 0
##   0.59865239134853    0 1
##   0.600033940119388   1 0
##   0.601569609667396   1 0
##   0.604331804428937   0 1
##   0.605734232885187   1 0
##   0.606743244027479   0 1
##   0.610099968777192   1 0
##   0.635719618438801   0 1
##   0.642629154353533   0 1
##   0.643388389202981   0 1
##   0.650857112162374   0 1
##   0.655361332893039   1 0
##   0.664039825486076   0 1
##   0.666835459605576   0 1
##   0.673455254525052   0 1
##   0.674233344593882   0 1
##   0.686305623635914   0 1
##   0.691979015457722   1 0
##   0.69465141139809    0 1
##   0.697756820797969   0 1
##   0.699464795967903   0 1
##   0.69956548602186    1 0
##   0.700268476129802   0 1
##   0.715441529658112   0 1
##   0.727104336232345   1 0
##   0.748459581749649   0 1
##   0.750611575317228   0 1
##   0.771335129417107   1 0
##   0.783114209001765   0 1
##   0.786187419023959   1 0
##   0.817115091222324   0 1
##   0.820358735940266   0 1
##   0.821489575586663   1 0
##   0.832412737242162   0 1
##   0.835120568735147   0 1
##   0.847113723041308   0 1
##   0.847270617524811   0 1
##   0.878032128020399   0 1
##   0.878487388005627   0 1
##   0.88137566475957    0 1
##   0.895090437062199   0 1
##   0.900528306384155   0 1
##   0.925923573386271   0 1
##   0.930303820244453   0 1
##   0.939829939642081   0 1
##   0.964895229313325   0 1
##   0.966033444920305   0 1
##   0.985604683238902   0 1
##   0.987694608316082   0 1
##   1.00576806187255    0 1
##   1.00993235582908    0 1
##   1.01848973060458    0 1
##   1.02278098722109    0 1
##   1.02739452120956    0 1
##   1.03900699824813    0 1
##   1.06711108782967    0 1
##   1.07458724946046    0 1
##   1.07595209234065    0 1
##   1.10735071523471    0 1
accuracy = sum(diag(lm_conf_matrix))/sum(lm_conf_matrix)
accuracy * 100
## [1] 0.5586592

2. LOGISTIC REGRESSION

Lojistik regresyon, bir sınıflandırma modelidir ve genellikle ikili sınıflandırma problemlerinde kullanılır. Lojistik regresyon, adını lojistik fonksiyon veya sigmoid fonksiyon olarak adlandırılan özel bir aktivasyon fonksiyonu kullanmasından alır.

Lojistik regresyonun temel özellikleri:

Hedef: Lojistik regresyonun temel amacı, giriş verilerini kullanarak belirli bir kategorik çıkışa ait olma olasılığını tahmin etmektir. Özellikle ikili sınıflandırma problemlerinde, olasılık genellikle “0” veya “1” olarak yorumlanır.

Olasılık Tahmini: Lojistik regresyon, log-odds oranını modellemek için kullanılır ve bu oranı lojistik fonksiyon ile olasılığa dönüştürür. Sigmoid fonksiyonu, çıkışa 0 ile 1 arasında sıkıştırarak bir olasılık değeri elde edilmesini sağlar.

Parametreler: Lojistik regresyon, giriş özelliklerinin ağırlıkları ve bir sapma terimi üzerindeki parametreleri öğrenir. Bu parametreler, eğitim verisi üzerindeki örneklerden elde edilir, genellikle maksimum olabilirlik tahminine dayanarak öğrenilir.

Sigmoid Fonksiyonu: Lojistik regresyonun temel matematiksel ifadesi, sigmoid (lojistik) fonksiyonu olan g(x) = 1/(1 + e^(-x)) şeklinde ifade edilir. Bu fonksiyon, bir sayıyı (log-odds) alır ve bu sayıyı 0 ile 1 arasında bir olasılık değerine dönüştürür.

Eğitim Ve Tahmin: Lojistik regresyon modeli, eğitim verisi üzerinde öğrenildikten sonra yeni giriş verileri için olasılıkları tahmin etmek için kullanılabilir. Genellikle bir eşik değeri belirlenir (örneğin, 0.5) ve bu eşik değeri üzerindeki olasılıklar sınıflara atanır.

Regularizasyon: Lojistik regresyon modellerinde, aşırı uyuma karşı koymak için L1 veya L2 regularizasyon teknikleri kullanılabilir. Bu, ağırlıkları sınırlamak ve genelleme yeteneğini artırmak için kullanılır. Lojistik regresyon kısaca ikili sınıflandırma problemleri için yaygın olarak kullanılan etkili bir modeldir.

Ödevde kullanılan titanic gemisi verileri için Logistic Regresyon Algoritması kullanılarak eğitim gerçekleştirilir.

tr$Survived=as.factor(tr$Survived)
test$Survived = as.factor(test$Survived)
library(tidymodels)
## ── Attaching packages ────────────────────────────────────── tidymodels 1.1.1 ──
## ✔ broom        1.0.5     ✔ rsample      1.2.0
## ✔ dials        1.2.0     ✔ tune         1.1.2
## ✔ infer        1.0.5     ✔ workflows    1.1.3
## ✔ modeldata    1.2.0     ✔ workflowsets 1.0.1
## ✔ parsnip      1.1.1     ✔ yardstick    1.2.0
## ✔ recipes      1.0.9
## ── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──
## ✖ scales::discard() masks purrr::discard()
## ✖ dplyr::filter()   masks stats::filter()
## ✖ recipes::fixed()  masks stringr::fixed()
## ✖ dplyr::lag()      masks stats::lag()
## ✖ yardstick::spec() masks readr::spec()
## ✖ recipes::step()   masks stats::step()
## • Learn how to get started at https://www.tidymodels.org/start/
model <- logistic_reg(mixture = double(1), penalty = double(1)) %>%
  set_engine("glmnet") %>%
  set_mode("classification") %>%
  fit(Survived ~ ., data = tr)

Test verisi üzerinde oluşturulan tahmin değerleri kullanılarak algoritmanın başarımı hesaplanır.

pred_class <- predict(model,
                      new_data = test,
                      type = "class")
pred_proba <- predict(model,
                      new_data = test,
                      type = "prob")
results <- test %>%
           select(Survived) %>%
           bind_cols(pred_class, pred_proba)

accuracy(results, truth = Survived, estimate = .pred_class)
## # A tibble: 1 × 3
##   .metric  .estimator .estimate
##   <chr>    <chr>          <dbl>
## 1 accuracy binary         0.810

3. NAIVE BAYES

Bayes Teoremi

1812 yılında Thomas Bayes tarafından bulunan koşullu olasılık hesaplama formülüdür.

Tanım : Bayes teoremi, olasılık kuramı içinde incelenen önemli bir konudur. Bu teorem bir rassal değişken için olasılık dağılımı içinde koşullu olasılıklar ile marjinal olasılıklar arasındaki ilişkiyi gösterir.

P ( A | B ) = B olayı gerçekleştiğinde A olayının gerçekleşme olasılığı P ( A ) = A olayının gerçekleşme olasılığı P ( B | A ) = A olayı gerçekleştiğinde B olayının gerçekleşme olasılığı P ( B ) = B olayının gerçekleşme olasılığı

Naive Bayes Classifier

Naive Bayes sınıflandırıcısının temeli Bayes teoremine dayanır. lazy ( tembel ) bir öğrenme algoritmasıdır aynı zamanda dengesiz veri kümelerinde de çalışabilir. Algoritmanın çalışma şekli bir eleman için her durumun olasılığını hesaplar ve olasılık değeri en yüksek olana göre sınıflandırır. Az bir eğitim verisiyle çok başarılı işler çıkartabilir. Test kümesindeki bir değerin eğitim kümesinde gözlemlenemeyen bir değeri varsa olasılık değeri olarak 0 verir yani tahmin yapamaz. Bu durum genellikle Zero Frequency ( Sıfır Frekans ) adıyla bilinir. Bu durumu çözmek için düzeltme teknikleri kullanılabilir. En basit düzeltme tekniklerinden biri Laplace tahmini olarak bilinir.

Kullanım alanlarına örnek olarak gerçek zamanlı tahmin, çok sınıflı tahmin, metin sınıflandırması, spam filtreleme, duyarlılık analizi ve öneri sistemleri verilebilir.

Ödevdeki Titanic verisi ile Naive Bayes algoritması eğitilir ve test edilerek modelin başarım oranı hesaplanır:

library(e1071)
## 
## Attaching package: 'e1071'
## The following object is masked from 'package:tune':
## 
##     tune
## The following object is masked from 'package:rsample':
## 
##     permutations
## The following object is masked from 'package:parsnip':
## 
##     tune
set.seed(1012)  
naive_bayes = naiveBayes(Survived ~ ., data = tr)
naive_bayes
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
## 
## A-priori probabilities:
## Y
##         0         1 
## 0.6053371 0.3946629 
## 
## Conditional probabilities:
##    PassengerId
## Y       [,1]     [,2]
##   0 444.0209 255.8033
##   1 445.5907 253.9404
## 
##    Pclass
## Y       [,1]      [,2]
##   0 2.538283 0.7362986
##   1 1.960854 0.8630705
## 
##    Sex
## Y      female      male
##   0 0.1345708 0.8654292
##   1 0.6975089 0.3024911
## 
##    Age
## Y       [,1]     [,2]
##   0 29.85035 12.14817
##   1 28.03502 13.87767
## 
##    Embarked
## Y            C          Q          S
##   0 0.14153132 0.07888631 0.77958237
##   1 0.27758007 0.08896797 0.63345196
## 
##    Family
## Y        [,1]     [,2]
##   0 0.8747100 1.891987
##   1 0.9466192 1.192535
## 
##    isAlone
## Y        [,1]      [,2]
##   0 0.6914153 0.4624461
##   1 0.4697509 0.4999746
pred = predict(naive_bayes, newdata = test)

cm = table(test$Survived, pred)


accuracy = sum(diag(cm))/sum(cm)
accuracy
## [1] 0.7988827

4. K NEAREST NEIGHBORS (K-EN YAKIN KOMŞULUK) MODELİ - KNN

K-en yakın komşu (k-nearest neighbors, KNN) algoritması, gözlemlerin birbirlerine olan benzerlikleri üzerinden tahminlerin yapıldığı gözetimli makine öğrenmesi modellerinde regresyon ve sınıflandırma problemlerinde kullanılan bir algoritmadır.

K-NN algoritması temelde ecludian(mesafe hesaplaması) temeline dayandırılmıştır. K-NN algoritması seçilen noktanın hangi sınıfa ait olduğunu tespit için kullanılan sınıflandırma algoritmasıdır.

K-NN algoritmasının çalışma mantığı:

  • K değeri seç.
  • K ya yakın noktaları bul.
  • K değerine yakın komşular arasında hangi sınıftan kaç tane var.
  • Daha sonra bu k değeri hangi sınıfa ait olduğunu tespit et.
  • Eğer bir değer atanacak ise bu seçilen noktaya o zaman dahil olduğu sınıfın ortama değeri atanır.

Veriler kullanılarak bir kNN modeli eğitilir ve başarım oranı hesaplanır:

library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following objects are masked from 'package:yardstick':
## 
##     precision, recall, sensitivity, specificity
## The following object is masked from 'package:purrr':
## 
##     lift
knn = train(Survived ~ .,
                 data = tr,
                 method = "knn", 
                 trControl =  trainControl(method = "cv", number = 5),
                 tuneGrid = expand.grid(k = seq(1, 10, 1))
)

preds = as.numeric(predict(knn, test, type = "raw"))-1
actual = test$Survived
mean(preds == actual)
## [1] 0.6145251

5. RANDOM FOREST

Sınıflandırma işlemi esnasında birden fazla karar ağacı üreterek sınıflandırma değerini yükseltmeyi hedefleyen bir algoritmadır. Bireysel olarak oluşturulan karar ağaçları bir araya gelerek karar ormanı oluşturur. Buradaki karar ağaçları bağlı olduğu veri setinden rastgele seçilmiş birer alt kümedir.

Bir karar ağacı aşağıdakilerden oluşan bir şekildir:

Şans noktaları (Daireler) Karar noktaları (Kareler) Karar dalları (Seçenekler) Şans dalları (Olaylar) Son noktalar (Getiriler veya faydalar)

Karar ağaçlarının :

Avantajları:

Anlaması ve yorumlaması kolaydır. Kullanılan ve oluşturulan yapılar görsellenebilir. Az oranda bir veri hazırlığına ihtiyaç duyar.

Dezavantajları:

Veriyi iyi bir şekilde açıklamayan aşırı karmaşık ağaçlar üretilebilir. Kısaca komplike yapılarda dezavantaj sağlar. Hatırlatmalarımızı ve kısa bir özetimizi geçtikten sonra gelin Random Forest’ı detaylı inceleyelim.

Random Forest Algoritması

  • Tek bir ağacın aksine birden fazla ağaç oluşturulur.
  • Sınıflandırma durumunda ormandaki tüm ağaçlar arasında en çok oyu alan seçilir.
  • Regresyon durumunda , farklı ağaçların çıktılarının ortalaması alınır.

Random Forest Algoritmasının :

Avantajları:

Bu algoritma çok kararlı bir algoritmadır. Mevcut makine öğrenmesi sistemlerinin çoğunu oluşturan hem sınıflandırma hem de regresyon problemleri için kullanılabilir.

Dezavantajları:

Genel olarak bu algoritmalar hızlı bir şekilde eğitilebilir, ancak bir kez eğitildiklerinde tahminler oluşturmak için oldukça yavaştır. Sınıflandırmada iyi ama regresyonda o kadar başarılı bir algoritma değildir.

Ödevde Titanic gemisindeki verilerle bir Random Forest modeli eğitilir ve test verileri ile test edilerek algoritmanın başarım oranı hesaplanı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
random_forest_model <- randomForest(Survived ~ ., tr,ntree=500)
mean(test$Survived==predict(random_forest_model,test))
## [1] 0.8994413