Veri Biliminde İstatistik ve Makina Öğrenmesi Metodları

bilimsel_metod.png

1 Benzer mi, farklı mı?

1.1 t-testi

Varsayalım ki elimizde iki sunucunun kendilerine aynı anda verilen bir isteği teslim etme sürelerini gösteren dizi sayı dizisi olsun.

veri <- data.frame(sunucuA = c(0.17, 0.24, 0.11, 0.28, 0.21, 0.19), 
                   sunucuB = c(0.26, 0.21, 0.20, 0.12, 0.13, 0.13))
veri
  sunucuA sunucuB
1    0.17    0.26
2    0.24    0.21
3    0.11    0.20
4    0.28    0.12
5    0.21    0.13
6    0.19    0.13

Sorumuz bu iki sunucunun isteklere cevap verme süreleri arasında istatiksel olarak bir fark gözleyebilip gözleyemeyeceğimiz olsun. İlk bakışta sunucuların ortalama cevap verme sürelerinin farklı olduğunu görebiliyoruz.

mean(veri$sunucuA)
mean(veri$sunucuB)
[1] 0.2
[1] 0.175

Ancak veri kümemizdeki eleman sayısının fazla olmadığına dikkat edin. Bu da arada bir farkın olmaduğunu istatistiksel bir kesinlikle söyleyebilmemize engel olabilir. Bunu öğrenmek için Student'in t-testini uygulayacağız.

t.test(veri$sunucuA, veri$sunucuB)
	Welch Two Sample t-test

data:  veri$sunucuA and veri$sunucuB
t = 0.74981, df = 9.9901, p-value = 0.4707
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.04929984  0.09929984
sample estimates:
mean of x mean of y 
    0.200     0.175

Bu testin sonucunda dikkat etmemiz gereken değer confidence interval değeridir. t-testin sonucuna göre aradaki fark %95 olasılıkla -0.05 ile 0.10 arasındadır. Demek ki sunucunun cevap verme süreleri arasındaki farkın sıfırdan farklı olduğunu göremiyoruz.

Dikkat edileceği üzre testin uygulanabilmesi için veri noktalarının ikişer ikişer gelmesi gerekiyor. Eğer veri noktaları çiftler şeklinde gelmediyse o zaman başka metodlar uygulamamız gerekir.

1.2 Kolmogorov-Simirnov testi

Varsayalım ki elimizde aynı dersi alan iki şube öğrenci olsun ve bu öğrenciler aynı soruları çözdükleri ilk sınavlarından 10 üzerinden şu notları almış olsunlar.

subeA <- c(2,9,8,6,7,3,5,2,8,5,9,7,9,4,6,8)
subeB <- c(6,1,4,2,4,3,6,2,3)

Bu iki grup öğrenci arasında bir fark olup olmadığını öğrenmek istiyoruz.

mean(subeA)
mean(subeB)
[1] 6.125
[1] 3.444444

Bu durumda veri noktaları çiftler şeklide gruplanamıyorlar. O yüzden t-testini kullanamıyoruz. Yukarıda t-testinde kullandığımız örneği düşünürsek ortalamalar arasında görünen farktan istatistiksel olarak emin olup olamayacağımızı bilmiyoruz. Bu durumda bu iki grup arasında fark olup olmadığını bulmak için Kolmogorov-Smirnov testi'ni kullanacağız.

ks.test(subeA, subeB)
        Two-sample Kolmogorov-Smirnov test

data:  subeA and subeB
D = 0.52778, p-value = 0.0808
alternative hypothesis: two-sided

Warning message:
In ks.test(subeA, subeB) : cannot compute exact p-value with ties

Burada bakmanız gereken istatistik D = 0.5. Bu değer 0.0 ve 1.0 arasında gelir. Demek ki onemli bir fark görüyoruz. Sonra bakmamız gereken değer ise p-value = 0.08. Çıkan sonuca göre %92 olasılıkla bu iki grubun birbirınden farklı olduğunu söyleyebiliriz.

1.3 Torbalama (Bootstrapping)

Torbalama tekniği eğer elimizde yeterince veri noktası yoksa uygulayabileceğimiz bir teknik. Ancak hesaplama ağırlığı fazla olduğu için elimızdeki veri kümesi çok büyük ise kaçınılması gerekir.

Basitçe anlatırsak:

  1. Elimizdeki veri kümesinden gelişi güzel noktalar çekip, kaydedip geri koyalım.
  2. Bu torba üzerinde gözlemlemek istediğimiz istatistiği (ortalama, varyasyon vb.) hesaplayalım. Bunu bir yere kaydedelim.
  3. Adım 1 ve 2'yi gerekli olduğu kadar tekrarlayalım. Adım 2'den yeterince veri noktası gelince duralım.

Merkezi Limit Teoremi'ne göre 2. adımda hesapladığımız değerler Gaussian dağılıma göre dağılmış olan bir raslantısal bir değişkendir.

Aşağıdaki kodda tanımladığımız fonksiyon, yukarıda subeA olarak tanımladığımız veri kümesinden rastgele 100 tane nokta çeker ve bunların ortalamasını hesaplar. Bunu 1000 kere tekrarlayıp torba adlı listenin içine yazıyoruz. Bu değerleri sıralıyoruz.

deney <- function(x) { 
            mean( sample( subeA, 100, replace=TRUE ) ) 
         }
torba <- sort( sapply(1:1000, deney))
c( torba[25], torba[975] )
[1] 5.66 6.58

Bu değerlerin 25. ve 975.ne bakarsak %95 olasılıkla ortalamaların hangi aralıkta olduğunu görüyoruz.

Bunu yapmanın başka bir yolu da t.test fonksiyonunu dogrudan subeA'ya uygulamaktır.

t.test(subeA)
	One Sample t-test

data:  subeA
t = 10.13, df = 15, p-value = 4.218e-08
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 4.836178 7.413822
sample estimates:
mean of x 
    6.125

Değerlerin aynı olmadığına dikkat edin. Genelde torbalama tekniği daha iyimser sonuçlar (daha dar aralıklar) verir.

2 Aralarında ilişki var mı yok mu?

2.1 χ2-testi

R deney yapmak icin hazır veri kümeleri ile beraber gelir. Bunlardan biri de HairEyeColor veri kümesidir. Bu küme 3 boyutlu bir matris olup 1974'te Profesör Snee'nin Delaware Üniversitesindeki öğrencilerden topladığı bir kümedir.

veri <- HairEyeColor
veri
, , Sex = Male

       Eye
Hair    Brown Blue Hazel Green
  Black    32   11    10     3
  Brown    53   50    25    15
  Red      10   10     7     7
  Blond     3   30     5     8

, , Sex = Female

       Eye
Hair    Brown Blue Hazel Green
  Black    36    9     5     2
  Brown    66   34    29    14
  Red      16    7     7     7
  Blond     4   64     5     8

Bu kümeden erkek ve kadın farkını (3. boyut) kaldıralım:

yeni <- HairEyeColor[,,1] + HairEyeColor[,,2]
yeni
       Eye
Hair    Brown Blue Hazel Green
  Black    68   20    15     5
  Brown   119   84    54    29
  Red      26   17    14    14
  Blond     7   94    10    16

Sorumuz saç ve göz renkleri arasında istatistiksel kesinlikle görünen bir ilişki olup olmadığı.

chisq.test(yeni)
        Pearson's Chi-squared test

data:  yeni
X-squared = 138.29, df = 9, p-value < 2.2e-16

Görüldüğü üzre, p-value oldukça ufak. Bu da elimizdeki verinin bu şekilde gelen bütün veriler arasında görünme olasılığının düşük olduğunu söylüyor. X-squared İstatistiğinin büyük olması ise bu iki değişkenin arasındaki ilişkinin çok kuvvetli olduğunu gösterir. Öte yandan cinsiyet ve saç rengi arasındaki ilişkiyi test etmek istersek:

dene <- HairEyeColor[,1,] + HairEyeColor[,2,]
dene
chisq.test(dene)
       Sex
Hair    Male Female
  Black   43     45
  Brown  103    100
  Red     20     23
  Blond   33     68

	Pearson's Chi-squared test

data:  dene
X-squared = 9.3483, df = 3, p-value = 0.025

aralarında bir ilişki olduğunu ancak bu ilişkinin daha zayıf olduğunu görebiliyoruz. Şimdi de göz rengi ve cinsiyet ilişkisine bakalım:

dene <- HairEyeColor[1,,] + HairEyeColor[2,,]
dene
chisq.test(dene)
       Sex
Eye     Male Female
  Brown   85    102
  Blue    61     43
  Hazel   35     34
  Green   18     16

	Pearson's Chi-squared test

data:  dene
X-squared = 4.7529, df = 3, p-value = 0.1908

Aralarında istatiksel kesinlikle iddia edebileceğimiz bir ilişki göremiyoruz.

2.1.1 Dikkat edilmesi gereken noktalar

χ2 Testi tablo haline getirebileceğimiz ayrık kategorik değişkenler için kullanılmalıdır. Örneğin yukarıda kullandığımız veri kümesi ya da aşagıdaki veri kümesi gibi.

head(data.frame(Titanic))
  Class    Sex   Age Survived Freq
1   1st   Male Child       No    0
2   2nd   Male Child       No    0
3   3rd   Male Child       No   35
4  Crew   Male Child       No    0
5   1st Female Child       No    0
6   2nd Female Child       No    0

2.2 Korelasyon

Eğer elimizdeki veri nümerik veri ise o zaman χ2-testini kullanamayız. Onun yerine iki veri kümesi arasında lineer bir ilişki olup olmadığını test edebiliriz.

Bır sonraki örnek için iris veri kümesini kullanacağız.

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

İlk olarak nümerik kolonlar arasında ne tür ilişkiler var ona bakalım:

cor( iris[,1:4] )
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000

Diagonalin 1.0 çıkması beklenir bir şeydir. Sonuçta her kolon kendisine sıkı bir şekilde bağlıdır. Bunun ötesinde görüyoruz ki Sepal uzunluk ve Petal uzunluk arasında pozitif ve kuvvetli bir ilişki var: biri arttığında diğeride onunla beraber artmaktadır. Bunun tersine Petal uzunluk arttığında Sepal genişlik ise düşmektedir. Sepal genişlik ve uzunluk arasında da buna benzer bir ilişki bulunmakta ancak bu ilişki Petal uzunluk ve Sepal genişlik arasındaki ilişkiden daha zayıftır.

3 Regresyon modelleri

3.1 Numerik regresyon

Yukarıdaki iris veri kümesi örneğinde kolonlar arasındaki korelasyonu bulmuştuk. Şimdi de bunu kullanarak nasıl istatistiksel bir model geliştirebileceğimize ve bu modelden nasıl tahminde bulunabileceğimizi görelim.

Varsayalım ki Petal genişliği Sepal genişlik ve uzunluk cinsinden yazmak istiyoruz. Önce veri kümemizi eğitim (%75) ve dogrulama (%25) verisi olarak iki parçaya bölelim.

N <- nrow(iris)
egit <- sample(1:N, floor(0.75*N), replace=FALSE)
dogrula <- -egit

Şimdi de lineer regresyon modelimizi kuralım:

model <- glm ( Petal.Length ~ Sepal.Length + Sepal.Width, data = iris, subset = egit)

Bu modeli kullanarak dogrula veri kümesi üzerinde Petal uzunlukları tahmin edelim.

tahmin  <- predict(model, iris[dogrula,])

Yanlız hatırlayalım ki Petal uzunlukların gerçek değerlerini biliyoruz. Ortalama (göreli) hatayı ölçelim:

a <- min(iris$Petal.Length[dogrula])
b <- max(iris$Petal.Length[dogrula])
err <- mean( abs(tahmin - iris$Petal.Length[dogrula]) )
err/(b-a)
[1] 0.09995596

Ortalama hatanın düşük olması (yaklaşık %10) göstermektedir ki Petal uzunluğu, Sepal uzunluk ve genişlik verilerinden istatistiksel olarak tatmin edici bir biçimde çıkartmamız mümkün görünuyor.

3.2 Multinomyel regresyon

Eğer bağımlı değişkenimiz ayrık değerli bir değişken ise o zaman multinomyel regresyon metodunu kullanabiliriz. Bu kısımda yukarıda kullandığımız iris veri kümesini yeniden kullanacağız.

Yine elimizdeki veriyi iki parçaya bölelim:

N <- nrow(iris)
egit <- sample(1:N, floor(0.75*N), replace=FALSE)
dogrula <- -egit

Multinomyel regresyon için nnet kütüphanesine ihtiyacımız var.

library(nnet)

Modelimizi kuralım:

model <- multinom( Species ~ . , data=iris, subset=egit)
sonuc <- predict(model, iris[dogrula,])
tablo <- table(hesaplanan = sonuc, gercek = iris$Species[dogrula])
tablo
# weights:  18 (10 variable)
initial  value 123.044576 
iter  10 value 12.245445
iter  20 value 2.647394
iter  30 value 1.386576
iter  40 value 1.137896
iter  50 value 0.828985
iter  60 value 0.730253
iter  70 value 0.711031
iter  80 value 0.666706
iter  90 value 0.531543
iter 100 value 0.444413
final  value 0.444413 
stopped after 100 iterations
            gercek
hesaplanan   setosa versicolor virginica
  setosa         13          0         0
  versicolor      0         13         2
  virginica       0          0        10

Başarı oranımızı hesaplayalım:

(tablo[1,1]+tablo[2,2]+tablo[3,3])/sum(tablo)
[1] 0.9473684

3.3 Log-lineer modeller

Log-lineer modeller ayrık değerli veri kümelerinde veri değerlerinin sıklıkları arasındaki ilişkileri incelemek için kullanılır.

veri <- data.frame(Titanic)
head(veri)
  Class    Sex   Age Survived Freq
1   1st   Male Child       No    0
2   2nd   Male Child       No    0
3   3rd   Male Child       No   35
4  Crew   Male Child       No    0
5   1st Female Child       No    0
6   2nd Female Child       No    0

Tahmin etmek istediğimiz değişken sıklık değişkeni (Freq) olduğu için modelimizi aşağıdaki gibi kuracağız.

model <- glm( Freq ~ . , data = veri, family=poisson)
exp(model$coefficients)
(Intercept)    Class2nd    Class3rd   ClassCrew   SexFemale    AgeAdult 
  8.5690577   0.8769231   2.1723077   2.7230769   0.2715194  19.1926605 
SurvivedYes 
  0.4771812

Yukarıda hesapladığımız sayılar bir referans değerine göre olasılık oranlarıdır.

  1. Bir çocuğun kurtulmuş olması olasılığı bir yetişkinin kurtulmuş olması olasılığının yaklaşık 19 katıdır.
  2. Titanik'in 1. Sınıf kabinde kalan bir yolcunun kurtulmuş olması olasılığı 3. sınıf kabinde kalan bır yolcunun kurtulmuş olması olasılığının yaklaşık 2 katıdır.

Referans değerlerini aşağıdaki gibi değiştirebiliriz:

veri <- within(veri, Class <- relevel(Class, ref = "2nd"))
veri <- within(veri, Sex <- relevel(Sex, ref = "Female"))
model <- glm( Freq ~ . , data = veri, family=poisson)
exp(model$coefficients)
 (Intercept)    Class1st    Class3rd   ClassCrew     SexMale    AgeAdult 
  2.0403062   1.1403509   2.4771930   3.1052632   3.6829787  19.1926605 
SurvivedYes 
  0.4771812

Bu yeni oranlardan

  1. bir kadının kurtulmuş olması olasılığı bir erkeğin kurtulmuş olması olasılığının yaklaşık 3.7 katı
  2. ikinci sınıf kabinde yolculuk eden bir yolcunun kurtulmuş olması bir gemi çalışanının kurtulmuş olması olasılığının yaklaşık 3 katı

olduğunu görüyoruz.

4 Öbekleme ve sınıflandırma

Öbekleme ve sınıflandırma algoritmaları eldeki veri kümesinin noktalarının etiketlenerek parçalanması için kullanılır.

4.1 k-ortalamalar

Bu algoritmada veri kümesini kaç parçaya böleceğimiz baştan bir k sayısı verilerek belirtilir. Veri kümemizin noktalarının bir vektör uzayı içine oturtulmuş olması gerekir: veri setinin bütün kolonları nümerik olmalıdır. Algoritmayı kısaca şöyle anlatabiliriz:

  1. Veri kümesi içinden rastgele k nokta y1 ,…, yk seçelim, ve bunları 1'den k'ya kadar sayılarla işaretleyelim.
  2. Veri kümesindeki her x noktasının yi'lere olan uzaklıklarını ölçelim ve x'in etiketini x'e en yakın noktanın etiketi olarak belirleyelim.
  3. Her etiket j için, j etiketine sahip olan bütün noktaların merkezlerini mj hesaplayalım.
  4. Eğer bütün j'ler için mj'ler ve yj'ler arasındaki uzaklık başta belirlediğimiz bir eşik değerinin altındaysa o zaman algoritmayı bitireceğiz.
  5. Eğer algoritma 4. adımda bitirilmediyse o zaman 2. adıma geri dönelim.

Bu kısımda veri kümemizi dogrudan web'den indireceğiz. Kullanacağımız veri UCI'ın şarap veri kümesi olacak.

sarap <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data",
                    header=FALSE)
head(sarap)
  V1    V2   V3   V4   V5  V6   V7   V8   V9  V10  V11  V12  V13  V14
1  1 14.23 1.71 2.43 15.6 127 2.80 3.06 0.28 2.29 5.64 1.04 3.92 1065
2  1 13.20 1.78 2.14 11.2 100 2.65 2.76 0.26 1.28 4.38 1.05 3.40 1050
3  1 13.16 2.36 2.67 18.6 101 2.80 3.24 0.30 2.81 5.68 1.03 3.17 1185
4  1 14.37 1.95 2.50 16.8 113 3.85 3.49 0.24 2.18 7.80 0.86 3.45 1480
5  1 13.24 2.59 2.87 21.0 118 2.80 2.69 0.39 1.82 4.32 1.04 2.93  735
6  1 14.20 1.76 2.45 15.2 112 3.27 3.39 0.34 1.97 6.75 1.05 2.85 1450

Veri kümesi şarapları 3 kümeye bölmüş şekilde geliyor. İlk kolon bu etiketi gösteriyor. Öncelikle bütün kolonları normalize edelim.

veri <- c()
for(i in 2:14) {
   veri <- cbind(veri, (sarap[,i] - mean(sarap[,i]))/var(sarap[,i]))
}
veri <- data.frame(veri)
sonuc <- kmeans(veri,3)
tablo <- table(hesaplanmis = sonuc$cluster, gercek = sarap[,1])
tablo
           gercek
hesaplanmis  1  2  3
          1 12 33  0
          2 45 19 10
          3  2 19 38

Etiketler başlangıçta gelişi güzel seçıldiği için, başta verilen sınıflarla uyum göstermesini bekleyemeyiz. Dolayısıyla başarıyı diagonal üzerinde ölçemeyecegiz. Tablodaki değerler arasındaki ilişkinin kuvvetini ölçmek için χ2 testini kullanacağız.

chisq.test(tablo)
        Pearson's Chi-squared test

data:  tablo
X-squared = 98.429, df = 4, p-value < 2.2e-16

4.2 k-en yakın komşular

Bu algoritma da bir önceki metod gibi elimizdeki veri kümesini kendi içinde benzeyen parçalara bölmek için kullanılır. Bu metodu kullanabilmemiz için elimizdeki veri kümesinin eğitim veri alt kümesinde veri noktalarının etiketlerini bilmemiz gerekiyor. Elimizde etiketlenmesi gereken bir nokta olsun.

  1. Bu noktanın etiketleri bilinen kümedeki elemanlara uzaklıkları hesaplanır.
  2. Bu noktaya en yakın k tane noktaya bakılır.
  3. Bu noktaların etiketleri sayılır ve en çok gorülen etiket elimizde etiketi bilinmeyen noktaya etiket olarak atanır.

Bu örnek için iris veri kümesini kullacağız.

library(class)

N <- nrow(iris)
egit <- sample(1:N, 0.75*N, replace=FALSE)
dogrula <- -egit

tahmin <- knn(iris[egit,1:4], iris[dogrula,1:4], iris$Species[egit], k = 4, prob = FALSE)
tablo <- table(tahmin, gercek = iris$Species[dogrula])
tablo
            gercek
tahmin       setosa versicolor virginica
  setosa         11          0         0
  versicolor      0         14         0
  virginica       0          1        12

Şimdi başarı oranımızı hesaplayalım:

(tablo[1,1]+tablo[2,2]+tablo[3,3])/sum(tablo)
[1] 0.9736842

4.3 Basit Bayes sınıflandırma

4.4 Karar ağaçları

Karar ağaçları elinizdeki ayrık bağımlı bir değişkeni tahmin etmek için kullanılır. Algoritma bunu yapmak için veri kolonlarını bağımlı değişkende en büyük değişikliği yapacak biçimde bölmeye çalışır.

Bu kısımdaki örnek için yukarıda kullandığımız şarap veri kümesini kullanacağız. Karar ağaçlarını kullanmak için party kütüphanesi kullanacağız. Model oluşturma kodu daha önce kullandığımız model kodlarına çok benzediği için çok bir açıklama yapmayacağız.

library(party)
N <- nrow(sarap)
egit <- sample(1:N, 0.7*N, replace=FALSE)
dogrula <- -egit
model <- ctree(V1 ~ . , data = sarap, subset = egit)
plot(model, type="simple")

karar_agaci.png

Modelimizi test edelim:

tahmin <- predict(model, sarap[dogrula,])
tablo <- table(hesaplanan = round(tahmin), gercek = sarap$V1[dogrula])
tablo
          gercek
hesaplanan  1  2  3
         1 13  4  0
         2  0 20  1
         3  0  0 16

Başarı oranımızı da hesaplayalım:

(tablo[1,1]+tablo[2,2]+tablo[3,3])/sum(tablo)
[1] 0.9074074

4.5 Rastlantısal ormanlar (random forests)

Raslantısal ormanlar birden çok karar ağacı birleştirilerek kurulan bir istatitik metodudur. Ancak neyse ki R ya da python gibi bir dil kullanıyorsanız, dil içindeki kütüphaneler bu metodun kullanımını kolaylaştırmaktadır.

Bu kısımdaki örnek için Amerikan Parlamentosu oylama veri kümesini kullanacagız.

library(randomForest)

oylar <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/voting-records/house-votes-84.data", 
                  header=FALSE)

N <- nrow(oylar)
egit <- sample(1:N, 0.75*N, replace=FALSE)
dogrula <- -egit

model <- randomForest(V1 ~ . , data = oylar, subset = egit)
tablo <- table(hesaplanan = predict(model, oylar[dogrula,]), gercek = oylar$V1[dogrula])
tablo

(tablo[1,1]+tablo[2,2])/sum(tablo)
            gercek
hesaplanan   democrat republican
  democrat         68          1
  republican        2         38
[1] 0.9724771

Bu sonuçları karar ağacı metodundan elde edeceğimiz sonuçla karşılaştıralım:

model <- ctree(V1 ~ . , data = oylar, subset = egit)
tablo <- table(hesaplanan = predict(model, oylar[dogrula,]), gercek = oylar$V1[dogrula])
tablo

(tablo[1,1]+tablo[2,2])/sum(tablo)
            gercek
hesaplanan   democrat republican
  democrat         61          0
  republican        9         39
[1] 0.9174312

Aralarında çok büyük bir fark göremiyoruz. Bunun temel nedeni bağımlı değişkenin sadece iki farklı değer alması, çok farklı sayıda değer almamasıdır. Eğer bağımlı değişken az sayıda değer alıyorsa o zaman ya bir monomyel regresyon ya da karar ağacı kullanılması daha uygun olacaktır.

4.6 SVM

SVM teknik olarak yüksek boyuntlu bir vektör uzayı içine gömülmüş bir veri kümesini sadece iki farklı değer alan bagımlı bir değişkene göre ikiye bölmek için geliştirilmiştir. Ancak birden fazla SVM modeli yanyana kullanılarak sonlu sayıda farklı değer alan bagımlı bir değişkene göre de eldeki veri parçalanabilir. R ve pthon gibi dillerin kullandıkları SVM kodu bu şekilde çalışacak şekilde yazılmıştır.

Şimdi bu metodu sarap veri kümesi üzerinde uygulayalım:

N <- nrow(sarap)
egit <- sample(1:N, 0.75*N)
dogrula <- -egit
model <- svm( V1 ~ . , scale = TRUE, data = sarap, subset = egit)
sonuc <- round(predict(model, sarap[dogrula,]))
tablo <- table(hesaplanan = sonuc, gercek = sarap$V1[dogrula])
tablo
(tablo[1,1]+tablo[2,2]+tablo[3,3])/sum(tablo)
          gercek
hesaplanan  1  2  3
         1 17  0  0
         2  1 17  1
         3  0  0  9
[1] 0.9555556

5 Birleştirilmiş metodlar

Author: Atabey Kaygun

Created: 2016-02-06 Sat 02:19

Validate