23 Ocak 2017 Pazartesi

PYTHON İLE BASİT BİR YSA UYGULAMASI

Gelişen teknolojiyle beraber dijitalleşen hayatlar sonucunda her geçen saniye binlerce veri kayıt altına alınmaktadır. Bu veriler; açık veya kapalı devre kameralardan alınan veriler, bir sunucu veya data centerın log kayıtları, bir gsm şireketinin ses kayıtları, bir sosyal medyadaki veriler diye uzayıp giden devasa veri yığınlarının da dahil olduğu uzunca bir liste. Dijital sahada bu kadar veri dururken bunların insan gücüyle analiz edilmesi neredeyse imkansız hale gelmiştir. Çünkü bu büyük veri yığının içerisinde gerekli olan anlamlı verileri çıkarmak yada bu verileri kullanarak anlamlı bir sonuç çıkarsama birçok insanın bile yapabileceği bir iş değildir. Bu problemlere çözüm olacak yöntem ise makinelerin de kendilerine özgü karar verme ve çıkarım yapabilme yeteneklerine sahip olmasıdır. Bu kadar veriler içerisinde anlamlı olan verileri ayıklamak veya bu verileri kullanarak bir çıkarsama yapabilmesi artık çağımızın bir zorunluluğu haline gelmiştir.

İşte bu noktadan sonra biyolojik olarak insan zekasının çalışma mantalitesinden esinlenerek yapay zeka tekniği geliştirilmeye başlandı ve hala ciddi çalışmalar ile devam etmektedir. Bu yazımızda yapay zekanın öğrenme tekniklerden biri olan yapay sinir ağı(YSA) mimarisini kullanarak python ile basit bir uygulama yapacağız. Bildiğiniz üzere python veri madenciliğinden, bilimsel çalışmalara, yapay zekadan siber güvenliğe kadar yelpazesi çok geniş olan bir dildir. Yapay sinir ağı konusunda çok ciddi kütüphaneleri de bulunmaktadır. Bunlardan bazıları coffe, theano, tensorflow, scikit, panda ve torch kütüphaneleridir.

Keras ise arkada tensorflow veya theano kütüphanesini kullanan bir arabirimdir. Biz ise keras ile arkada tensorflow kullanarak bir uygulama yapacağız. Tensorflow, google tarafından geliştirilmiş ve 2015 yılında bir kısmı public hale getirilen makina öğreniminde kullanılan ciddi bir kütüphanedir.

Ancak örnek uygulamamızı yazmaya geçmeden önce yapacağımız uygulamayı anlamak için yapay sinir ağı mimarisinin nasıl çalıştığını bilmemiz ve bu konudaki terminolojiye biraz hakim olmamız gerekmektedir. Bu sebeble kısa bir şekilde biraz değineceğiz. Ancak bu yazıyı konuya biraz hakim olduğunuzu ve yazacaklarımı hatırlamanız amacıyla yazdığımı belirtmek isterim.

Aşağıdaki resimde giriş ve ara katmanlar(hidden layers) olmak üzere üç katmanlı yapıya sahip bir yapay sinir ağı modeli görmektesiniz.


Yukarıdaki gördüğünüz her bir düğüm aslında bir yapay sinir hücresini temsil etmektedir. Ve bunlara perceptron denmektedir. Perceptronlar arasındaki çizgiler ise ağırlıkları temsil etmektedir. Ve bir perceptronun değeri; kendisinden bir önceki katmanda bulunan bütün perceptronlardaki değerin ilgili ağırlıklarıyla çarpıldıktan sonra bir toplam fonksiyonundan geçtikten sonra bulunan değerin bir aktivasyon fonksiyonundan geçmesi sonucu bir değere sahip olacaktır. Bu bulunan sonuç, bir sonraki katmana girdi olarak verilmektedir Anlatmak istediğimizi aşağıdaki resim açıkça izah etmektedir. Aşağıdaki resim, yukarıda gördüğünüz her düğüm içerisinde olan işlemleri göstermektedir.

Yandaki resimde Xi’ler bizim girdi değerlerimiz, Wi’ler ise ağırlıklarımızı ifade etmektedir. Her girdi kendi ağırlığıyla çarpıldıktan sonra çıkan değeri bir sonraki katmandaki bulunan perceptronlara aktarmaktadır ve bu perceptronda toplam fonksiyonundan geçtikten sonra çıkan değer aktivasyon fonksiyonuna göndererek ortaya nihai bir değer çıkacaktır. Ve varsa bu değer bir sonraki katmana aktarılarak bu döngü çıkışa varıncaya kadar böyle devam edecektir. Bu her değer için bu iterasyon yapılacaktır. Ve her iterasyonda uygun bir sonuç bulmak için ağırlıklar yeniden düzenlenecektir. Bu olaya epoch denilmektedir. Çünkü sonuçları etkileyen en önemli etkenlerden biri de ağırlık değerlerimizdir. En basit haliyle bir ysa modeli bu şekildedir. Şimdi ise verilerin bu model içerisinde nasıl işlenildiğine kısaca değinelim;

Elimizde bir dataset(veri kümesi) olur. Bu dataset bizim kullanacağımız teknik gereği birden fazla girdinin ama bir çıktının olacağı bir yapıya sahip olmalıdır. Örneğin; bir kullanıcının mouse hareketlerini, tıklama sayıları, girdiği siteleri, bu sitelerde kaldığı süre gibi çevresel değişkenleri alıp bu değerler sonunda bu kişinin bot mu? Insan mı? Değerini saklayan bir dataset düşünelim.

10 bin kullanıcıdan alınan değerler sonucunda bu kişilerin bot mu? Insan mı? Olduğu değerini tutan böyle bir datasetimizin olduğunu varsayalım. Bu değerlerimiz gerçek değerlerdir. Yani herhangi bir lab ortamında bot davranışlarını tuttuklarını ve binlerce insanın bilgisayar kullanırken ki aktivitelerini kayıt altına aldıklarını düşünelim. Çünkü bizim ysa modelimiz bu örneklerden bir çıkarım yaparak kendisine daha önce hiç gösterilmemiş bir örnek gösterildiğinde bunun bot mu? Insan mı? Olduğunu bu gerçek değerlerle kendisini eğiterek bulacaktır. Ama öncesinde tabi ki de sistemimizin öğrenme eğitimini tamamlaması gerekir.

Biz bu 10 bin veriden 9 bin tanesini ysa modelimize eğitim verisi olarak vereceğiz. Eğitim verileri, bir ysa modelini eğitmek için verilen verilerdir. Bizim bu örneğimizde ise girdi ve çıktı değerlerinin olduğu veriye verilen isimdir. Çünkü modelimiz girdi değerleri ile çıktı arasında bir matematiksel model oluşturmaya çalışacak. Bu model oluştururken ağırlıklar, aktivasyon fonksiyonu, ara katmanlar, katmanlardaki perceptron sayıları gibi değişkenler değiştirilip en uygun değer bulunmaya çalışılır. Ve modelimiz belirlediğimiz bir eşik değerine vardığında öğrenme sona erer. Öğrenme bitmesi ysa modelimizin girdi ve çıktılarımız arasında bir matematiksel model bulduğu anlamına gelmektedir. Sistem eğitimi tamamladıktan sonra test etmemiz gerekmektedir. Testi ise 10 bin veriden bir köşeye ayırdğımız bin adet veriyle yapacağız. Ancak burda önemli olan nokta şudur; Test verilerimizi verdiğimiz de sadece girdi değişkenlerimizi vereceğiz. Yani o kişinin bot mu? Insan mı? Olduğu değerini vermeyeceğiz aksine modelimiz bu değeri kendisi bulacak. Ve bulacağı bu değeri gerçek değer ile mukayese ederek sistemimizin yüzde kaç başarılı olduğunu hesaplayacağız. Örneğin yüzde 90 ve üzeri bir başarı bizim için kabul edilebilir bir değer ise modelimiz başarılı olmuştur demektir. Zaten hiçbir ysa modeli size %100 kesin sonuçla bir değer veremez. Her zaman bir hata payı vardır ve olmak zorundadır. Çünkü sistem kendisi verilen değerlerden bir sonuç çıkarmaktadır. Eğer yüzde 100 doğru cevap veriyorsa bir sistem o sistem öğrenmemiş ezber yapmıştır. Bu duruma overfitting de denilmektedir.

Ayrıca dikkat ettiyseniz tabloları kullanıyoruz bu da YSA’da özellikle matrisleri çok yoğun kullanacağımız anlamına gelir. Zaten uygulamamızı yaptığımızda numpy kütüphanesini de kullanacağımızı göreceksiniz. Unutmadan aslında yaptığımız anlatığımız bunca şeyin arkada nasıl çalıştığını ve öğrenme dediğimiz o olayın nasıl gerçekleştirildiğini çok güzel simüle eden tensorflow’un bu web uygulamasına kesinlikle bakınız. Parametrelerle oynayın, kurcalayın biraz işte ;)

Şimdi bir ysa modeli için bir kaç önemli hususu maddeler halinde verelim.
  • Herşeyden önce sistemimizi eğiteceğimiz bir datasetine sahip olmalıyız. Bunun için belli başlı dataset repoları var. Şu ve şu adreslere bakabilirsiniz.
  • Datasetinde bir sistemin öğrenmesi için yeterli sayıda veri bulunmalıdır. Az veri olursa sistem ezbere düşecektir.
  • Datasetimizdeki veriler makul olmalıdır. Çünkü sistem o verileri kullanarak öğrenme yapmaktadır.
  • Eksik ve yanlış verilerin olması sistemin öğrenmesini çok ciddi bir şekilde etkilemese de sistem belli bir seviyeden sonra öğrenemez.
  • Eğitim verilerinizi aynı zamanda test verisi olarak hiçbir zaman kullanmayınız. Alacağınız sonuçlar sağlıklı olmayacaktır. Sistemin daha önce hiç görmediği veriler ile test ediniz.

Bu kadar cümleden sonra işin hikaye kısmını bitirdik ve artık teknik kısma geçmek için hazırız. Bizim kullanacağımız dataset yaklaşık 800 insanın vucudundan alınmış yaklaşık 8 değer var yani girdiler. Bunlar; hamilelik sayısı, plazma glukoz konsantrasyonu, diastolic kan basıncı, deri kalınlığı, kullanılan insulin miktarı, vucut kitle indexi, diyabet soyağacı ve yaş değerleridir. Ve son sutunda ise 1 veya 0 değeri yer almakta. Eğer 1 ise kişinin şeker hastası(diabet) olduğu, 0 ise diabet hastası olmadığı anlamına gelmektedir. Buradan ufak bir parantez açayım. Datasetimizdeki her verinin numerik olması gerekmektedir. Çünkü bu değerler üzerinde matematiksel işlemler yapılmaktadır. Çıkışlar bile numerik olmalıdır en azından o şekilde ifade edilmelidir.
Öncellikle kullanacağımız kütüphaneleri varsa diğer projelerde kullandığımız kütüphaneleri etkilememesi için bir virtual environment kullanarak uygulamamızı diğer python kütüphanelerinde izole hale getireceğiz. Bunun için;
$sudo pip3 install virtualenv
Kurulum bitince ardından ;
$sudo virtualenv keras
diyerek keras adından bir izola ortam oluşturup;
source /bin/activate
diyerek izole ortamımızı aktif hale getirelim. Şimdi ihtiyaç duyacağımız kütüphanleri yükleyelim.
$sudo pip3 install numpy $sudo pip3 install tensorflow $sudo pip3 install keras

İşlem bittiğinde uygulamamız için gerekli herşey hazır demektedir. Artık python kodumuzu yazmaya başlayabiliriz. Öncellikle kullanacağımız paketleri import edelim.
#Kullanacağımız ysa modeli için.
from keras.models import Sequential

#YSA modelimizde katmanlar oluşturabilmek için.
from keras.layers import Dense

#Çıktımızı terminalden aldığımızda sonuçları renklendiriyoruz. Yanlışlar kırmızı, doğrular yeşil. Bunu kullanmasanızda olur yani.
from termcolor import cprint

#YSA matrislerle çalıştığı için numpy olmazsa olmaz.
import numpy
Datasetimizi yüklüyoruz.
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
numpy kütüphanesindeki loadtxt() metodumuz verilen ilk parametredeki dosya/string I delimiter(ayırıcı) ile split ederek bir matrise atamaktadır. Datesetimizi ayrıştırıyoruz. X, 8 adet girdimiz. Yani 600 satır ve 8 sutun. Y ise çıkışımız 600 satır 1 sutundan oluşmaktadır. Eğer bu parçalamayı anlamadıysanız lütfen şu konuya bakınız.
X = dataset[:600,0:8]
Y = dataset[:600,8]
Şimdi modelimizi oluşturup katmanlarımızı yerleştirelim. Modelimizden model adında bir nesne türettik.
model = Sequential()
Ve ilk katmanımızı modelimize add metodu ile dense tipindeki katmanımızı ekliyoruz. Parametrelerden 12 olanı ilk katmandaki perceptron sayısı. İnput dim bizim girdi değer sayımız. Hatırlarsanız 8 değerimiz vardı. Init parametremiz yapay sinir hücrelerimiz arasındaki ağırlıklarımızın rastgele verilmesi yerine belli bir algoritmaya göre vermektedir. Aktivation ise o katmanda kullandığımız aktivasyon fonksiyonumuz.
model.add(Dense(20, input_dim=8, init='uniform', activation='relu'))
#İkinci katmanımızda 12 yapay sinir hücresi. 
model.add(Dense(12, init='uniform', activation='relu'))

#Üçüncü katmanımızda 8 yapay hücremiz var.
model.add(Dense(8, init='uniform', activation='sigmoid'))

#Dördüncü katmanımızda 1 yapay hücremiz var. Yani çıkışımız.
model.add(Dense(1, init='uniform', activation='sigmoid')) 

#Modelimizi derliyoruz.
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Modelimizi çalıştırıyoruz. İlk parametre girdilerimiz, ikincic parametre çıktığımız. 3. paramtre epoch değerimiz. Yani ağırlıkların yeniden düzenleyerek çözüme en yakın değeri buluncaya kadar yapacağı deneme sayısı. Batch size tek seferde alınacak veri sayısını ifade etmektedir. Verbose ise herhangi bir hata oluşması durumunda göstermemeisini istedik.
model.fit(X, Y, nb_epoch=150, batch_size=10,  verbose=2)
Modelimizin başarı yüzdesini hesaplıyoruz.
scores = model.evaluate(X, Y)
Ve son olarak modelimizin sonucunu ekrana basıyoruz.
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
Evet buraya kadar modelimiz verdiğimiz örnekleri kullanarak girdi ve çıktılar arasında ilişkisel olarak bir model buldu ve eğitim sona erdi. Bundan sonra sisteme test verilerimizi vererek ne kadar başarılı bir sonuç bulduğunu hesaplayacağız. Şimdi köşeye ayırdığımız 1000 değeri sistemimize vereceğiz ve ysa modelimizin bulduğu sonuçlar ile gerçek sonuçları karşılaştırıp ne kadar başarılı olduğunu görelim. Aşağıdaki kodlarıda yine aynı python dosyasına yazarak devam edelim.
#96 adet test verimizin sadece 8 girdisini sisteme veriyoruz.
test_verisi = dataset[600:696, 0:8]

#Sistemin verdiğimiz değerlerden yola çıkarak kişinin diyabet hastası olup olmadığını tahmin ediyor.
predictions = model.predict(test_verisi)
Buradan sonrası ise sonuçları ekrana basma olayı.
dogru = 0
yanlis = 0
toplam_veri = len(dataset[600:696,8])

for x, y in zip(predictions, dataset[600:696,8]):    
    x = int(numpy.round(x[0]))
    if int(x) == y:
        cprint("Tahmin: "+str(x)+" - Gerçek Değer: "+str(int(y)), "white", "on_green", attrs=['bold'])
        dogru += 1
    else:
        cprint("Tahmin: "+str(x)+" - Gerçek Değer: "+str(int(y)), "white", "on_red", attrs=['bold'])
        yanlis += 1

print("\n", "-"*150, "\nISTATISTIK:\nToplam ", toplam_veri, " Veri içersinde;\nDoğru Bilme Sayısı: ", dogru, "\nYanlış Bilme Sayısı: ",yanlis,
      "\nBaşarı Yüzdesi: ", str(int(100*dogru/toplam_veri))+"%", sep="") 

Eğer herhangi bir hata ile karşılaşmadan buraya kadar geldiyseniz artık python dosyanızı çalıştırabilirsiniz. Çalıştırdığınızda arkada tensorflow kütüphanesinin çalıştığına dair bir bilgilendirme mesajı da görebilirsiniz. Bendeki eğitim öğrenme yüzdesi:


Test verilerindeki başarı değeri ise;
Sonuç olarak; yapay zeka kendi başına çok derin ve ayrı bir yetkinlik isteyen konu. Daha değinmediğim birçok şey var. Ancak yazının başında da belirtiğim gibi zaten bu konuya en azından çalışma mantalitesi hakkında bilgi sahibi olduğunuzu varsayarak yazdım. Ağırlıkların neye göre hesaplandığı, eşik değerlerinin belirlenmesi, neye göre hangi aktivasyon fonksiyonunun kullanılacağı, regresyon, sınıflandırma baya birçok anlatılacak nokta var gördüğünüz üzere ancak benim burda yaptığım konuya yeteri kadar hakim olan birinin pythonda keras yardımıyla tensorflow kullanarak nasıl uygulama yapabileceğine dair giriş mahiyetinde bir örnekti. Artık her olasılık için bir kural tanımlama günümüz dünyasında yetersiz bir durumdur bu nedenle dev veriler karşısında kısmen de olsa mantıklı çıkarımlar yapacak sistemlere ihtiyacımız var. Geleceğin burda yattığı şüphesiz doğrudur. Hatta günümüzde bile farkında olmadan kullanmaya başladık bile. Karakter tanıma, yüz ve parmak izi tanıma, ses tanıma, dudak okuma diye gider. Anlamadığınız veya hatalı noktalar varsa lütfen yorum kısmında belirtiniz.
Sağlıcakla kalın.

Bu uygulamada kullandığımız bütün kodlara buradan erişebilirsiniz.
KAYNAKLAR:
https://archive.ics.uci.edu/ml/index.html
https://keras.io/
https://www.tensorflow.org/
http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/

0 yorum :

Yorum Gönder