Temel Makine öğrenmesi algoritmaları yazılarımıza devam ediyoruz, daha önce içerik üreticisi arkadaşlarımızdan @Şengül, @Burak, @Ferhat, @Cemre, @Cihan yazdığı yazılara da bakabilirsiniz. Bu çalışmanın konusu ise SVM(Support Vector Machines) algoritmaları olacaktır.
SVM’ler: Yeni Nesil Öğrenme Algoritmaları;
1980 Öncesi:
– Hemen hemen tüm öğrenme yöntemleri doğrusal karar yüzeylerini öğrendi.
– Doğrusal öğrenme yöntemleri teorik özelliklere sahipti.
1980
– Karar ağaçları ve NN’ler, doğrusal olmayan karar yüzeylerinin verimli öğrenilmesine izin verdi.
– Az teorik temel ve hepsi yerel minimadan muzdarip çalışmalar.
1990’lar
– Geliştirilmiş hesaplamalı öğrenme teorisine dayanan doğrusal olmayan fonksiyonlar için etkili öğrenme algoritmaları ve…
– Güzel teorik özellikler. (Uygulaması kolay, Az bir bakım maliyeti ile bir çok problem için çözüm üretilebilir.)
İstatistiksel Öğrenme Teorisi;
Sistemler matematiksel olarak şu şekilde tanımlanabilir; Verileri (gözlemleri) girdi olarak alır ve gelecekteki verilerin bazı özelliklerini tahmin etmek için kullanılabilecek bir işlev çıkarır. İstatistiksel öğrenme teorisi bunu bir fonksiyon tahmin problemi olarak modeller ve genelleştirme performansı (test verilerinin etiketlenmesinde doğruluk) olarak ölçer.
Destek Vektör Makinaları! (Support Vector Machines)
Eğer çözülmesi gereken sorun, denetlenen ikili sınıflandırmalardan biri ise SVM(Support Vector Machine) kullanılabilir. Yani, görünmeyen yeni nesneleri(kategorisi bilinmeyen), özelliklerine ve zaten kategorize edilmiş bir dizi bilinen örneğe göre iki ayrı gruba ayırmak istediğimizde SVM algoritmalarını kullanabiliriz.
Böyle bir sisteme iyi bir örnek, daha önce pozitif veya negatif olarak sınıflandırılmış diğer belgelere dayanarak bir dizi yeni belgeyi pozitif veya negatif olarak gruplarına göre sınıflandırmaktır. Yada benzer şekilde, mail kutusuna gelen e-postaları, zaten insanlar tarafından spam veya spam olmayan olarak işaretlenmiş büyük bir belge topluluğuna göre spam veya spam olmayan olarak sınıflandırabiliriz. SVM’ler bu tür durumlar için oldukça kullanışlı algoritmalardır.
Bir Destek Vektör Makinesi, her boyutu belirli bir nesnenin “özelliğini” temsil eden sonlu boyutlu bir vektör alanı olan bir özellik alanı oluşturarak durumu modeller. Spam mail veya belge sınıflandırması bağlamında, her “özellik” belirli bir kelimenin yaygınlığı veya o kelimenin ne kadar önemli olduğu ile ilgilidir.
SVM’nin amacı, görünmeyen yeni nesneleri belirli bir kategoriye atayan bir model oluşturmaktır. Bunu, özellik alanının iki kategoriye doğrusal bir bölümünü oluşturarak yapmaya çalışır.Yeni görünmeyen nesnelerdeki özelliklere (örn. Belgeler / e-postalar) dayanarak, bir kategoriyi (ör. Spam veya spam olmayan) çoklu ayırma düzleminin (hyperplane ) “üstüne” veya “altına” yerleştirir. Bu, olasılık dışı doğrusal bir sınıflandırıcıya bir örnek olur. Olasılıksızdır, çünkü yeni nesnelerdeki özellikler, özellik uzayındaki yerini tam olarak belirler.
SVM’ler Neden Kullanılır;
Destek vektör makineleri (SVM), sınıflandırma ve regresyon analizi için kullanılan verileri analiz eden ilişkili öğrenme algoritmalarına sahip denetimli öğrenme modelleridir.
Eldeki verilerden yeni kalıpları tanımlamak için büyük miktarda veriyi analiz ederler. SVM’ler, aşağıdaki resimde gösterildiği gibi bir veri kümesini en iyi iki sınıfa ayıran bir hiper düzlem bulma amacı ile oluşturulur.
Destek Vektörleri;
- Destek Vektörler sadece bireysel gözlemin koordinatlarıdır.
- Destek Vektör Makinesi, iki sınıfı (düzlem / çizgi) en iyi bir şekilde ayıran sınır çizgileridir.
- Destek vektörleri karar yüzeyine (veya hiper düzleme) en yakın veri noktalarıdır.
- Sınıflandırılması en zor veri noktalarıdır.
- Karar yüzeyinin optimum konumu üzerinde doğrudan etkisi vardır.
- Optimal hiper düzlemin en düşük “kapasiteye” sahip fonksiyon sınıfından kaynaklandığını gösterebiliriz.
- Destek vektörleri hiper düzlemin en yakın veri noktalarıdır, bu sebeple bir veri kümesini bölen hiper düzlemin konumunu değiştirecek noktalardır. Bu nedenle, bir veri kümesinin kritik unsurları olarak kabul edilebilirler.
Hiper düzlem nedir?
Basit bir örnek olarak, yalnızca iki özelliğe sahip bir sınıflandırma görevi için, bir hiper düzlemi bir veri kümesini doğrusal olarak ayıran ve sınıflandıran bir çizgi olarak düşünebiliriz. Şöyle de düşünebiliriz, veri noktalarımız hiper düzlemden ne kadar uzak olursa, doğru sınıflandırıldıklarından o kadar emin oluruz. Bu nedenle, veri noktalarımızın doğrulara hiper düzlemden olabildiğince uzakta olmasını istiyoruz.
Dolayısıyla, yeni test verileri eklendiğinde, iniş yapan hiper düzlemin herhangi bir tarafı, ona atadığımız sınıfa karar verecektir.
Doğru düzlemi (hyperplane) nasıl bulabiliriz?
Veriler içindeki iki sınıfı en iyi şekilde nasıl birbirinden ayırabiliriz? Düzlem ve her iki kümeden en yakın veri noktası arasındaki mesafe kenar boşluğu olarak bilinir. Amaç, hiper düzlem ile eğitim setindeki herhangi bir nokta arasında mümkün olan en yüksek marja sahip bir hiper düzlem seçmek ve yeni verilerin doğru bir şekilde sınıflandırılma şansını arttırmaktır. Ayrılan bölge içinde asla veri noktası olmaması gerekmektedir.
Eğer net bir hiper düzlem olmazsa ne olur?
Veriler, genellikle yukarıdaki grafikte gösterilen basit örneğimiz kadar temiz değildir. Bir veri kümesi genellikle doğrusal olarak ayrılamayan bir veri kümesini temsil eden karışık elemanlar kümesine benzeyecektir.
Yukarıdaki gibi bir veri kümesini sınıflandırmak için, verilerin 2Boyutlu görünümden 3B görünümüne geçmek gerekir. Bunu daha basitleştirilmiş bir örnekle açıklayabiliriz. Yukarıdaki iki renkli top setimizin bir kağıda konulduğunu ve bu sayfanın aniden kaldırıldığını ve topları havaya fırlatıldığını düşünün. Toplar havadayken, onları ayırmak için elimizdeki kayıt tabakayı kullanalım. Yani topların bu ‘kaldırılması’ işlemi verilerin daha yüksek bir boyuta eşlenmesini temsil eder. Bu işleme ise çekirdekleme (kernel trick) işlemi denilmektedir.
Şimdi üçüncü boyutta olduğumuz için, hiper düzlemimiz artık bir çizgi olamaz. Ve ayırma düzlemi artık yukarıdaki örnekte gösterildiği gibi bir düzlem olmalıdır. Burada bize verilen bilgi, verilerin ayrılması için bir hiper düzlem oluşturulana kadar verilerin daha yüksek boyutlara eşlenmeye devam edileceğidir.
Şimdi bu işlemin nasıl çalıştığına bir bakalım! Ve doğru bir hiper düzlemi nasıl tanımlayabiliriz inceleyelim.
Doğru hiper düzlemi tanımlamak için; “İki sınıfı en iyi şekilde ayıran hiper-düzlem seçilecektir.”
Yapacağımız işlemleri birkaç farklı yöntem ile örneklendirelim;
1.Doğru hiper düzlemi tanımlayın (Yöntem-1):
Burada üç hiper düzlemimiz olsun (A, B ve C). Şimdi, yıldızı ve daireyi sınıflandırmak için doğru düzlemi tanımlayalım.
Bu örnekte “B” düzlemi yada ayracı bizim sınıflandırma işlemini mükemmel bir şekilde yerine getirmiştir diyebiliriz.
2.Doğru hiper düzlemi tanımlayın (Yöntem-2):
Burada üç hiper düzlemimiz var (A, B ve C) ve hepsi sınıfları iyi bir şekilde ayırıyor. Şimdi, doğru hiper düzlemi nasıl tanımlayabiliriz?
Burada, en yakın veri noktası (sınıflardan biri) ve hiper düzlem arasındaki mesafeleri en üst düzeye çıkarmak doğru hiper düzlemi belirlememize yardımcı olacaktır. Bu mesafeye Marj mesafesi denir. Aşağıdaki resme bakalım:
Hiper düzlem C marjının hem A hem de B’ye göre yüksek olduğunu görebiliriz. Bu nedenle, doğru hiper düzlemi C olarak kabul ediyoruz. Yüksek marjlı hiper düzlemi seçmenin bir başka önemli nedeni de sağlamlıktır. Düşük marjlı bir hiper düzlem seçersek, yanlış sınıflandırma olasılığı yüksek olacaktır.
3. Doğru hiper düzlemi tanımlayalım (Yöntem-3)
Bazılarınız hiper-düzlem B’yi A’ya göre daha yüksek marja sahip olduğu için seçmiş olabilir ancak burada hiper düzlem B de bir sınıflandırma hatası olduğunu gözlemliyoruz ve A ayracı farklı türlerin hepsini doğru bir şekilde sınıflandırdığı için doğru hiper düzlem A’dır diyebiliriz.
4.İki sınıfı sınıflandırabilir miyiz ?(Yöntem-4)
Yukarıdaki resimde yıldızlardan biri diğer (daire) sınıfın alanında bir aykırı değer olarak yer aldığı için iki sınıfı düz bir çizgi kullanarak ayıramıyoruz. Diğer uçtaki bir yıldız, yıldız sınıfı için bir aykırı değer gibidir. SVM, aykırı değerleri yok sayma ve maksimum kenar boşluğuna sahip hiper düzlemi bulma özelliğine sahiptir. Bu nedenle, SVM’nin aykırı değerlere karşı sağlam olduğunu söyleyebiliriz.
5.Sınıflara ayrılacak hiper düzlemin bulunma işlemi (Yöntem-5)
Aşağıdaki senaryoda, iki sınıf arasında doğrusal ayrım olamaz, bu yüzden SVM bu iki sınıfı nasıl sınıflandırabilir? Şimdiye kadar sadece doğrusal hiper düzlemi inceledik.
SVM bu sorunu da çözebilir. Bu durumu çözmek için ek özellik uygulanır. Burada yeni bir z = x^2 + y^2 özelliği ekleyeceğiz. Gelin şimdi veri noktalarını x ve z eksenine çizelim:
Yukarıdaki grafikte dikkat edilmesi gereken noktalar:
- Z için tüm değerler her zaman pozitif olur çünkü z hem x hem de y’nin karesel toplamıdır
- Orijinal grafikte, kırmızı daireler x ve y eksenlerinin orijinine yakın görünür ve z değerinin düşük olmasına ve başlangıç noktasından nispeten daha yüksek z değerine sahip yıldıza yol açar.
- SVM’de, bu iki sınıf arasında doğrusal bir hiper düzlemin olması kolaydır. Ancak, ortaya çıkan bir başka önemli soru, bir hiper düzlem için bu özelliği manuel olarak eklememiz gerektiğidir.
- İşte burada bize yardımcı olan SVM’nin çekirdek hilesi adı verilen bir tekniği vardır. Bunlar, düşük boyutlu girdi alanını alan ve daha yüksek boyutlu bir alana dönüştüren işlevlerdir(bir nevi dönüşüm işlemi), yani ayrılamaz problemi ayrılabilir probleme dönüştürür, bu fonksiyonel işlemlere ise çekirdek işlemleri denir.
- Çoğunlukla doğrusal olmayan ayırma probleminde çekirdek işlemi faydalıdır. Basitçe söylemek gerekirse, son derece karmaşık veri dönüşümleri yapar, ardından verileri tanımladığınız etiketlere veya çıktılara göre ayırma işlemini öğrenir.
Düzlemleri Doğrusal olarak Ayırma !
Doğrusal ayırma hiper düzlemi, SVM’nin kalbindeki kilit geometrik varlıktır. Gayri resmi olarak, yüksek boyutlu bir özellik alanımız varsa, doğrusal hiper düzlem, özellik alanını iki bölgeye ayıran bu alandan bir boyut daha düşük bir nesnedir. Bu doğrusal ayırma düzleminin özellik alanımızın merkezinden geçmesi gerekmez, yani sıfır vektörünü düzlem içinde bir varlık olarak dahil etmesi gerekmez. Bu hiper düzlemler affin olarak bilinir.
Matematiksel olarak ℜp olarak bilinen gerçek değerli bir p-boyutlu özellik alanını düşünürsek, o zaman lineer ayırma hiper düzlemimiz içine gömülmüş bir affin p-1 boyutlu uzaydır diyebiliriz.
P = 2 olması durumunda, bu hiper düzlem basitçe daha büyük iki boyutlu düzlemde yaşayan tek boyutlu düz bir çizgidir deriz, oysa p = 3 için hiper düzlem daha büyük üç boyutlu özellikte yaşayan iki boyutlu bir düzlemdir.
Sınıflandırma;
Örneğin bizim bir spam e-mail sınıflandırma problemimiz olsun, bu spam filtreleme çalışmasında maillerin öncelikle etiketlenmesi ve bazı kelimeler geçen maillerin spam filtresine takılması şeklinde bir çalışma yapacağımız zaman öncelikle mailleri spam(1) yada spam olmayan(0) mail şeklinde sınıflandırıp ve gelen 10.000 lerce mail içerisinden ilgili maillerin istenmeyen mail kutusuna taşıması için bir sınıflandırma algoritması olarak SVM’den yararlanabiliriz.
Sınıflandırıcıyı Türetme işlemi;
Ayırıcı hiper düzlemler benzersiz değildir, yani ayırıcı hipermetreler için herhangi bir eğitim gözlemine dokunmadan böyle bir düzlemi hafifçe çevirmek veya döndürmek mümkündür.
Yani, sadece böyle bir düzlemin nasıl inşa edileceğini bilmekle kalmıyoruz, aynı zamanda en uygun olan düzlemi de belirleyebileceğimizi biliyoruz. Çünkü bu, herhangi bir eğitim gözleminden en uzak olan ve dolayısıyla “optimal” olan ayırıcı hiper düzlemdir diyebiliyoruz.
Maksimum marj düzlemini nasıl belirleyeceğiz ?
- Eldeki eğitim veri setinde öncelikle gözlemlere olan uzaklığın bulunması gerekir.(xi)
- Hiper düzlemde bir eğitim verisine en yakın mesafe, marj mesafesi olarak bilinir.
- Marjın en büyük olduğu noktada MMH(Maksimum margin hyperplane) ayraç olarak kullanılır.
- MMC’nin (SVC ve SVM) temel özelliklerinden biri, MMH’nin konumunun sadece doğrudan sınır (ancak hiper düzlem değil) sınırında yatan eğitim gözlemleri olan destek vektörlerine bağlı olmasıdır. Bu, MMH’nin yerinin başka herhangi bir eğitim gözlemine BAĞLI OLMADIĞI anlamına gelir.
Destek Vektör Sınıflandırıcıları(Support Vector Classifiers)
Esasen, ayrı bir hiper düzlemin, çizginin doğru tarafındaki her eğitim gözlemini mükemmel bir şekilde ayırması (yani gerçek sınıf etiketi ile ilişkili olduğunu garanti etme) gereksinimini bilmemiz gerekir. Bu, durum destek vektör sınıflandırıcısı (SVC) kavramını ortaya çıkarır. MMC’ler yeni eğitim gözlemlerinin eklenmesine son derece duyarlı olabilir.
x1 sınıfına +1 bir nokta eklersek, MMH konumunun önemli ölçüde değiştiğini görürüz. Dolayısıyla bu durumda MMH açıkça fazla oturmuştur diyebiliriz. (Sağ resim açıklaması)
MMH iki sınıfı mükemmel bir şekilde ayırdığını ise aşağıdaki resimden görebiliyoruz.
İki sınıfı mükemmel bir şekilde ayırmayan, ancak yeni bireysel gözlemlerin eklenmesinde daha fazla sağlamlığa sahip olan ve eğitim gözlemlerinin çoğunda daha iyi bir sınıflandırmaya sahip olan ayırıcı bir hiper düzlemi temel alan bir sınıflandırıcı düşünebiliriz. Bu, birkaç eğitim gözleminin yanlış sınıflandırılması anlamına gelir. Bir destek vektör sınıflandırıcısı veya yumuşak kenar boşluğu sınıflandırıcısı böyle çalışır. SVC bazı gözlemlerin kenar boşluğunun (veya hiper düzlemin) yanlış tarafında olmasına izin verir, dolayısıyla “yumuşak” bir ayrım yapılmasını sağlar. Aşağıdaki şekiller gözlemlerin sırasıyla kenar boşluğunun yanlış tarafında ve hiper düzlemin yanlış tarafında olduğunu göstermektedir:
Destek Vektör makineleri;
SVC’nin genişletilmesinin ardındaki motivasyon, doğrusal olmayan karar sınırlarına izin vermesidir. Bu, Destek Vektör Makinesi’nin (SVM) alanıdır. Aşağıdaki rakamları düşünün. Böyle bir durumda, tamamen doğrusal bir SVC, verilerin net bir doğrusal ayrımı olmadığı için son derece düşük performansa sahip olacağını tahmin edebiliriz:
Bu açıkça kuadratik polinomlarla sınırlı değildir. Daha yüksek boyutlu polinomlar, etkileşim terimleri ve diğer fonksiyonel formlar içinde düşünülebilir. Bir dezavantaj olarak, özellik alanının boyutunu bazı algoritmaların izlenebilir hale gelmeyecek şekilde önemli ölçüde artırmasıdır diye de değerlendirebiliriz.
SVM’lerin en büyük avantajı, “çekirdek hile” olarak bilinen bir işlemi kullanarak, özellik alanının doğrusal olmayan bir şekilde büyütülmesine izin verirken, aynı zamanda önemli bir hesaplama verimliliğini koruyabilmeleridir.
Peki SVM’ler nedir?
Esasen, çekirdekler olarak bilinen fonksiyonların kullanımı yoluyla özellik alanının genişletilmesinden kaynaklanan SVC’lerin bir uzantısıdır. Çekirdekleri anlamak için, yukarıda özetlenen SVC optimizasyon problemine çözümün bazı yönlerini kısaca tartışmamız gerekir.
SVM Çekirdek İşlevleri(SVM Çekirdek Fonksiyonları)
SVM algoritmaları, çekirdek olarak tanımlanan bir dizi matematiksel işlev kullanır. Çekirdeğin görevi, verileri girdi olarak almak ve gerekli forma dönüştürmektir. Farklı SVM algoritmaları farklı türde çekirdek işlevleri kullanır. Bu işlevler farklı tiplerde olabilir. Örneğin doğrusal, doğrusal olmayan, polinom, radyal temel işlevi (RBF) ve sigmoid gibi…
Dizi verileri, grafikler, metin, görüntüler ve vektörel işlemler için Çekirdek işlevlerini kullanabiliriz.
En çok kullanılan çekirdek işlevi türü (Radyal Temel İşlevi)RBF’dir. Çünkü tüm x ekseni boyunca lokalizedir ve sonlu tepkiler vermiştir. Çekirdek fonksiyonları, alt ürünü uygun bir özellik alanında iki nokta arasında döndürür. Böylece, çok yüksek boyutlu alanlarda bile çok az hesaplama maliyeti ile benzerlik kavramını tanımlayarak en hızlı şekilde sınıflandırma işlemi yapılmasına olanak sağlar.
Şimdi SVM ile ilgili bu kadar izahat yapıldıktan sonra R dili ile bir örnek çalışma yaparak yazımızı tamamlayalım.
R’de SVM(Support Vector Machine) Destek Vektör Makinesi Örnek çalışması;
Destek Vektör Makinesi – Regresyon (SVR)
Destek Vektör Makinesi, algoritmayı karakterize eden tüm ana özellikleri (maksimum marj) koruyarak bir regresyon yöntemi olarak da kullanılabilir. Destek Vektör Regresyonu (SVR), sınıflandırma için SVM ile aynı ilkeleri kullanır ve yalnızca birkaç küçük fark vardır. Her şeyden önce, çıktı gerçek bir sayı olduğundan, eldeki bilgileri tahmin etmek çok zorlaşır, bu da sonsuz olasılıklara sahiptir.
Regresyon durumunda, problemden zaten talep edebilecek olan SVM’ye yaklaşık olarak bir tolerans marjı (epsilon) ayarlanır. Ancak bu gerçeğin yanı sıra, daha karmaşık bir neden de vardır. Bununla birlikte, ana fikir her zaman aynıdır: hatayı en aza indirmek, kenar boşluğunu en üst düzeye çıkaran hiper düzlemi kişiselleştirmek ve hatanın bir kısmının tolere edildiğini göz önünde bulundurmaktır.
Şimdi bir tane 2 boyutlu bir oyun veriseti oluşturalım ve SVM ile nasıl eğitip test edeceğimizi kontrol edelim;
1 2 3 4 5 6 7 |
n <- 150 # boyutlu bir vektör oluşturulam p <- 2 # oluşturduğumuz vektörü 2 boyutlu olarak belirleyelim sigma <- 1 # Dağılımın varyansını 1 olarak ayarlayalım meanpos <- 0 # pozitif örneklerin dağılım merkezini bulalım meanneg <- 3 # negatif örneklerin dağılım merkezini bulalım npos <- round(n/2) # pozitif örnek sayısı nneg <- n-npos # negatif örnek sayısı |
1 2 3 4 5 6 7 |
# Pozitif ve negatif örnekler üretelim xpos <- matrix(rnorm(npos*p,mean=meanpos,sd=sigma),npos,p) xneg <- matrix(rnorm(nneg*p,mean=meanneg,sd=sigma),npos,p) x <- rbind(xpos,xneg) # Etiketleri üretelim y <- matrix(c(rep(1,npos),rep(-1,nneg))) # Sonrada verilerimizi görselleştirelim. plot(x,col=ifelse(y>0,1,2)) legend("topleft",c(’Positive’,’Negative’),col=seq(2),pch=1,text.col=seq(2)) |
Şimdi verilerimizi %80 Eğitim ve %20 Test verisi olacak şekilde bölelim:
1 2 3 4 5 6 7 8 9 |
## eğitim ve test veri setlerimizi ayıralım ## ntrain <- round(n*0.8) # eğitim veri setimizdeki verilerin %'desi tindex <- sample(n,ntrain) # eğitim verilerimizin indexlenmesi işleminide yapıyoruz. xtrain <- x[tindex,] xtest <- x[-tindex,] ytrain <- y[tindex] ytest <- y[-tindex] istrain=rep(0,n) istrain[tindex]=1 # GörSelleştirelim plot(x,col=ifelse(y>0,1,2),pch=ifelse(istrain==1,1,2)) legend("topleft",c('Pozitif Eğitim','Pozitif Test','Negatif Eğitim’,’Negatif Test'), col=c(1,1,2,2),pch=c(1,2,1,2),text.col=c(1,1,2,2)) |
Şimdi veriler hazır SVM ile bir eğitim işlemi gerçekleştirelim;
1 2 3 |
# kernlab paketini yükleyelim öncelikle; > library(kernlab) svp <- ksvm(xtrain, ytrain, type = "C-svc", kernel = 'vanilladot', C = 100, scaled =c()) |
1 2 |
#svp içeriğini yazdıralım ve SVM'in detaylarına bir göz atalım; > svp |
1 2 3 4 5 6 7 8 9 10 11 |
Support Vector Machine object of class "ksvm" SV type: C-svc (classification) parameter : cost C = 100 Linear (vanilla) kernel function. Number of Support Vectors : 8 Objective Function Value : -609.3984 Training error : 0.016667 |
1 2 3 4 5 |
> attributes(svp) > alpha(svp) > alphaindex(svp) > b(svp) > plot(svp, data =xtrain) |
Şimdi test setindeki noktaların etiketini tahmin etmek için eğitimli SVM’yi kullanabiliriz ve varyant metriklerini kullanarak sonuçları analiz ederiz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
> ypred = predict(svp, xtest) > table(ytest, ypred) Çıktı; ypred ytest -1 1 -1 11 1 1 1 17 #Eğitim verilerimizin doğruluk oranını kontrol edelim > sum(ypred == ytest) /length(ytest) [1] 0.9333333 #Tahmin puanını hesaplayalım > ytahminpuani <- predict(svp, xtest, type = "decision") # Tahmin edilen etiketlerin puanlarını kontrol edelim > table(ytahminpuani > 0, ypred) ypred -1 1 FALSE 12 0 TRUE 0 18 |
1 2 3 4 |
#ROC Eğrisini çizdirmek için ROCR paketini ekleyelim > library(ROCR) > tahmin <- prediction(ytahminpuani, ytest) #ROC Eğrisini çizdirelim > perf <-performance(tahmin, measure = "tpr", x.measure = "fpr") > plot(perf) |
1 2 |
#Tahmin Eğrisini çizdirelim > perfi <- performance(tahmin, measure = "prec", x.measure = "rec") > plot(perfi) |
1 2 |
#Eşik değeri eğrisini çizdirelim > perfo <- performance(tahmin, measure = "acc") > plot(perfo) |
ÇAPRAZ DOĞRULAMA:
Bir eğitim setini ve bir test setini düzeltmek yerine, k katlama çapraz doğrulaması çalıştırarak bu tahminlerin kalitesini artırabiliriz. Eğitim setini yaklaşık olarak aynı büyüklükteki k gruplarına böldükten sonra, k – 1 gruplarını kullanarak bir SVM’yi tekrar tekrar eğitiyoruz ve bir kenara bırakılan grup üzerinde tahmin yapıyoruz. K, eğitim puanı sayısına eşit olduğunda, bir kerede bırakma (LOO) çapraz doğrulamasından bahsediyoruz. K katlarında n noktadan rastgele bir bölünme oluşturmak için, örneğin aşağıdaki fonksiyonu oluşturabiliriz:
1 2 3 4 5 |
cv.folds <- function(n,folds=3) ## n tane örneği rastgele olarak bölüyoruz { split(sample(n),rep(1:folds,length=length(y))) } |
DOĞRUSAL OLMAYAN SVM :
Bazen doğrusal SVM yeterli olmaz. Örneğin, pozitif ve negatif örneklerin doğrusal olarak ayrılamayan iki Gaussian’ın karışımı olduğu bir oyuncak veri kümesi oluşturalım.
Bu sorunu çözmek için, bunun yerine doğrusal olmayan bir SVM kullanmalıyız. Bu sadece çekirdek parametresi değiştirilerek elde edilir. Örneğin, = 1 ve C = 1 olan bir Gauss RBF çekirdeği kullanmak için:
#Doğrusal olmayan bir SVM’i eğitelim
1 2 |
# Sonra görselleştirme yapabiliriz. > svp <- ksvm(x,y,type="C-svc",kernel='rbf',kpar=list(sigma=1),C=1) > plot(svp, data = x) |
Gelin Yeni bir örnek daha Yapalım:
En çok bilinen veri setlerinden biri olan IRIS veri seti ile SVM’in performansını deneyelim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#Öncelikle ihtiyaç olan paketleri yükleyelim library(e1071) #İris veriseti R içerisinde olduğu için direkt kullanabiliriz. > data("iris") > head(iris, 5) Sepal.Length Sepal.Width 1 5.1 3.5 2 4.9 3.0 3 4.7 3.2 4 4.6 3.1 5 5.0 3.6 Petal.Length Petal.Width Species 1 1.4 0.2 setosa 2 1.4 0.2 setosa 3 1.3 0.2 setosa 4 1.5 0.2 setosa 5 1.4 0.2 setosa |
1 2 3 4 5 6 7 8 9 10 11 12 |
#Iris veriseti R içerisinde olduğu için direkt kullanabiliriz. > attach(iris) #Tekrar kullanılabilir değerleri ayarlayalım set.seed(42) #Eğitim ve test verileri olarak verimizi bölelim >iris[,"train"] <- ifelse(runif(nrow(iris))<0.8,1,0) > trainset <- iris[iris$train==1,] > testset <- iris[iris$train==0,] #Eğitim verisetindeki özellikler sutunlarını kontrol edelim > trainColNum <- grep("train",names(trainset)) > trainset <- trainset[,-trainColNum] > testset <- testset[,-trainColNum] #veri kümesinde öngörülen değişkenin sütun dizinini alalım > typeColNum <- grep("Species",names(iris)) |
#Modelimizi oluşturalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#Model > svm_model <- svm(Species~ ., data=trainset, method="C-classification", kernel="linear") > > svm_model Call: svm(formula = Species ~ ., data = trainset, method = "C-classification", kernel = "linear") Parameters: SVM-Type: C-classification SVM-Kernel: linear cost: 1 Number of Support Vectors: 24 |
#Eğitim verileri üzerinde tahminlerimizi yapalım
1 2 |
> tahmin_egitim <- predict(svm_model, trainset) > mean(tahmin_egitim == trainset$Species) [1] 0.9826087 #%98 lik bir tahmin oranımız var... |
#Test verileri üzerinde modelimiz ile tahmin yapalım
1 2 |
> test_tahmin <- predict(svm_model, testset) > mean(test_tahmin == testset$Species) [1] 0.9142857 #Test verileri üzerinde de tahmin oranımız fena değil % 91 |
#Sonra Modelimizin bir çıktısını görselleştirelim:
1 2 |
> plot(svm_model, iris, Petal.Width~Petal.Length, slice = list(Sepal.Width=5, Sepal.Length=7)) |
Evet iki örnekle birlikte SVM algoritmasını anlamaya çalıştık, umarım katkı sağlayacak bir çalışma olmuştur. Makine öğrenmesi alanındaki temel algoritmalar serimize devam edeceğiz, diğer algoritmalara yazının başlangıcında verdiğim linklerden ve diğer tim yazılarada website üzerinden ulaşabilirsiniz.
Sağlıkla kalın… Veriden değer üretmeye devam edelim…
Kaynaklar;
https://cs.adelaide.edu.au/~chhshen/teaching/ML_SVR.pdf
https://jakevdp.github.io/PythonDataScienceHandbook/05.07-support-vector-machines.html
https://stackabuse.com/implementing-svm-and-kernel-svm-with-pythons-scikit-learn/
https://scikit-learn.org/stable/modules/svm.html