Yapay Sinir Ağları (YSA) hakkında bilgi edinmek ve bunların R'daki uygulamaları ile ilgili kişisel bir projedir. İstatistiksel öğrenme çalışmaları için tüm kodları github depomda bulabilirsiniz. Lütfen "Yapay Sinir Ağları Uygulamaları" adlı dosyalara bir göz atmak için tıklayınız.
Daha önce yayınlamış olduğum "Yapay Sinir Ağları - Artificial Neural Network" adlı yazımı okumak için tıklayınız.
Yapay sinir ağları, algılayıcı (ptron) adı verilen birimlerden oluşur. Ptronların bir veya daha fazla girişi, bir aktivasyon fonksiyonu ve bir çıkışı vardır. Bir YSA modeli, ptronları yapılandırılmış katmanlarda birleştirerek oluşturulur. Belirli bir katmandaki ptronlar birbirlerinden bağımsızdır, ancak her biri bir sonraki katmandaki tüm ptronlara bağlanır.
Ptron İlişkisi;
***
Giriş katmanı, her yordayıcı değişkeni için bir ptron içerir.
Bir veya daha fazla gizli katman, kullanıcının tanımladığı sayıda ptron içerir.
Birinci gizli katmandaki her ptron, giriş katmanındaki her ptrondan bir girdi alır.
İkinci bir gizli katman varsa, bu katmandaki her ptron ilk gizli katmandaki her bir ptrondan bir girdi alır ve böylece ek katmanlarla devam eder.
Çıkış katmanı, her cevap değişkeni için bir ptron içerir. (genellikle bir, bazen çok değişkenli yanıt durumlarında daha fazla ptron içerebilir.)
Her çıkış ptron, son gizli katmandaki her ptrondan bir girdi alır.
Ptronlar, girdilerinin değerlerine dayanarak çıktı değerlerini belirleyen doğrusal olmayan bir aktivasyon fonksiyonuna (örneğin herhangi bir lojistik fonksiyona) sahiptir.
Ptronlar arasındaki bağlantılar ağırlıklıdır.
Ağırlığın büyüklüğü, bu girişin alıcı ptron üzerindeki etkisinin gücünü kontrol eder.
Ağırlık işareti, etkinin bir sonraki tabakaya sinyalin uyarıp uyarmadığını kontrol eder.
Ağırlıklar, doğrusal bir modelin katsayılarına biraz benzemektedir.
Ayrıca, bir ptronun temel değerini temsil eden ve doğrusal bir modelde engellemeye benzer bir önyargı ayarı da vardır.
Girişler sıfıra yakınsa, önyargı, çıkışın ortalamaya yakın olmasını sağlar.
Ancak, YSA'nın ağ benzeri doğası nedeniyle durum çok daha karmaşık olabilir.
Bu, yordayıcılar ve yanıt arasındaki karmaşıklık doğrusal olmayan ilişkilere yol açabilir.
***
Bu kütüphane çok esnektir ve analistin bir dizi algoritma, aktivasyon işlevi ve hata işlevi ve tümünü kapsayacak şekilde birden fazla gizli katman içeren YSA'lar oluşturmasına izin verir. Tamamen diğer model uydurma kütüphaneleriyle aynı hizada olmayan sözdizimi vardır ve bu nedenle ortak modelleme işlevlerine kıyaslamaya yapmayınız.
Bu örnek, Boston, MA, ABD banliyölerinde bir dizi medyan özellik değerlerini içeren MASS paketindeki Boston verilerini kullanılarak yapılmıştır. Sinir ağımız için gerekli kütüphane paketlerini indirip, yüklemelerini yapalım. Daha fazla bilgi için R terminalinden help(Boston) yazarak veri işlevlerine bakınız.
# Kullanılan Kütüphaneler ( Pokemonlar )
install.packages(c("MASS","neuralnet","nnet","NeuralNetTools","boot","caret","corrplot","DataExplorer"))
library(MASS)
library(neuralnet)
library(nnet)
library(NeuralNetTools)
library(boot)
library(caret)
library(corrplot)
library(DataExplorer)
Amacımız, sahip olunan tüm diğer sürekli değişkenleri kullanarak sahiplenmiş evlerin (medv) medyan değerini belirlemektir.
Kütüphanelerimizi indirip, yüklediysek Boston verimizi yükleyelim ve R-studio üstünde tanıtalım.
Boston
veri <- Boston
introduce(veri)
Veri setinde gerektiği durumda veri setinin sınıfını değiştirmek istenildiğinde ya da sınıfını görmek istenildiğinde plot_str() fonksiyonu ile tüm parametrelerin kategorileri görülebilir.
plot_str(veri)
Bu görseli istemiyorsanız eğer str() fonksiyonu ile de parametrelerin kategorilerini görebilirsiniz.
str(veri)
Görüldüğü gibi veri seti 506 gözlem ve 14 parametreden oluşmaktadır ve 12 tanesi numerik, 2 tanesi ise integer haldedir.
Eksik Veri Konrolü
eksik_veri <- apply(veri, 2,function(x) sum(is.na(x)))
eksik_veri
Eksik gözlemlere bakıldığında eksik veri görülmemiştir. Bu işlemi yaparken apply fonksinoyu kullanılmıştır.
Eğer görsel bir tablo içerisinde eksik verileri görmek istersek.
plot_missing(veri)
Korelasyon İnceleme
Verimiz üzerinde korelasyonlar incelenmek istenildiğinde corrplot kütüphanesindeki corrplot fonksiyonu ile korelasyonlar görselleştirilmiştir.
corrplot(cor(veri))
Keşifçi veri analizlerinden birkaç tanesine bakıldıktan sonra uygulamaya başlayalım. Veri setinde ölçümler farklı olduğu için bu değerlerin aynı baremde birleşebilmesi için veri setinin normalize edilmesi gerekmektedir. Bunun için “scale” formulü kullanılır.
Bu normalizasyon işlemini yaparken veri setinde her bir parametrenin maksimum ve minimum değerleri üzerine hesaplanarak gerçekleştirilmiştir.
“Scale” fonksiyonu veri setinin karakterini bozmadan ortalaması sıfır, standart sapmasını bir üzerine merkezileştirerek veri setini günceller.
maxValue <- apply(veri, 2, max)
minValue <- apply(veri, 2, min)
veri <- as.data.frame(scale(veri, center = minValue, scale = maxValue - minValue))
Veri setimizdeki veri dönüşümü ve analize hazır hale getirdikten sonra veri setimizden Test-Eğitim verisini belirleyelim. Literatürde veri setinin % 70 Eğitim, % 30 Test ya da % 80 Eğitim, % 20 Test verisi olarak bölmek kabul görmüştür. Bu uygulamayı yaparken veri setini % 80 Eğitim ve % 20 Test verisi olarak bölündüğünde oluşan güncel veri setimizde 400 Eğitim, 106 Test verisi bulunmaktadır.
Rasgele örneklem seçerken “sample” fonksiyonu kullanılır. Eksik gözlem bulunmadığı için ve yanlı bir seçim olmaması için rasgele örneklem seçilmiştir. Belli bir sayı değil de belli bir oran üzerine bölmek isteseydik eğer şu kodu kullanmamız gerekirdi, “sample(1:nrow(data),round(0.80*nrow(data)))” böyle rasgele olarak % 80 veri seti seçilmiş olurdu.
orneklem <- sample(1:nrow(veri), 400)
egitim_verisi <- veri[orneklem, ]
test_verisi <- veri[-orneklem, ]
Seçilen test ve eğitim veri setlerinin uzunluk ve derinliğine bakaldığında toplam 14 parametre görülmektedir. Bunlardan medv parametresi bağımlı değişkenimizken diğerleri bağımsız değişkenlerdir.
dim(test_verisi)
dim(egitim_verisi)
Amacımız medv bağımlı değişkeni tahmin etmektir. Bunun için ihtiyacımız olan formul ise: “medv ~ crim + zn + indus + chas + nox + rm + age + dis + rad + tax + ptratio + black + lstat” olacaktır.
Bu fonksiyon ile parametreler arasına otomatik olarak “+” eklenerek modele eklenecektir.
parametre_birlestirme <- function(resp, dt) {
nms <- names(dt)
fmla <- as.formula(paste(resp, "~", paste(nms[!nms %in% resp], collapse = " + ")))
fmla
}
duzeltilmis_veri <- parametre_birlestirme("medv", Boston)
Sinir ağı argümanı, her bir gizli katman için nöronların sayısını içeren bir vektörü kabul ederken, “lineer.output” regresyon yapmak isteyip istemediğimizi belirtmek için kullanılır, "hidden" kısmında ise gizli katmanların kaçar tane olacağı belirlenir.
ysa_model <- neuralnet(duzeltilmis_veri
, data = egitim_verisi
, hidden = c(4,2)
, linear.output = T)
#Sinir ağımızı görselleştirelim.
plot(ysa_model)
Yapay sinir ağı modelimiz görüldüğü gibidir.
Yapay Sinir Ağı Modeli
Sinir ağı nesnesi için bir sinirsel yorumlama diyagramını oluşturalım.
plotnet(ysa
_model)
Sinirsel Yorumlama Diyagramı
Modelimiz yani iki gizli katmandan oluşan modelimiz için üretilen hata değeri için bu kodu kullanabiliriz.
pr.nn <- compute(ysa_model,test_verisi[,1:13])
pr.nn <- pr.nn$net.result*(max(veri$medv)-min(veri$medv))+min(veri$medv)
test.cv.r <- (test_verisi$medv)*(max(veri$medv)-min(veri$medv))+min(veri$medv)
MSE <- sum((test.cv.r - pr.nn)^2)/nrow(test_verisi)
print(MSE)
#Hata değeri =0.006387037 çıkacaktır.
Sabırla okuyan herkese teşekkürlerimi sunar, esenlikler dilerim.
Saygılarımla. by #MS
Yorumlar
Yorum Gönder
Please do not enter any spam link in the comment box.