Anasayfa / Makine Öğrenmesi / Derin Öğrenme (Deep Learning) / Keras Derin Öğrenme Kütüphanesi ile Sınıflandırma: Iris Veri Seti Üzerinde Uygulama

Keras Derin Öğrenme Kütüphanesi ile Sınıflandırma: Iris Veri Seti Üzerinde Uygulama

Merhaba. Bu yazımızda son yıllarda çok popüler bir konu olan derin öğrenme ile basit bir sınıflandırma uygulaması yapacağız. Derin öğrenmenin temelinde yapay sinir ağları bulunmaktadır. Uygulamamızda veri seti olarak Iris veri setini, sınıflandırıcı olarak da yapay sinir ağını kullanacağız. Programlama dilimiz Python, temel kütüphenelerimiz scikit-learn, tensorflow, keras olacaktır. Iris veri setini bu yazı ile daha yakından tanıyabilirsiniz. Veri setini buradan indirebilirsiniz. Yazının temel amacı yapay sinir ağlarına temel düzeyde uygulamalı giriş yapmaktır. Bu sebeple kodlarda yer alan bazı fonksiyon ve parametrelerin niçin kullanıldığı ve alternatiflerinin neler olduğuna detaylı olarak değinilmemiştir.

Kütüphaneleri İndirme ve Veriyi Yükleme

Veri Seti Keşfi

Veri setinde sütun isimleri yokmuş. Hadi ekleyelim.

Bağımlı ve Bağımsız Değişkenleri Ayırma

Python’da sütunların indeks değeri 0’dan başladığından ve veri setinde 5 sütun olduğundan ilk niteliğin indeksi 0, son niteliğin 4 olacaktır. iloc[] ile sütun seçerken ilk değer dahil ikinci değer hariçtir. Bu sebeple nitelikler matrisini (X) seçerken 0’ı dahil, 4’ü hariç tutacağız. Çünkü son indeks değeri label yani hedef değişkene aittir. iloc[] içindeki İlk iki nokta (:) tüm satırları ifade ederken virgül sonrası, sütunlardan seçilecek filtreyi ifade eder. 0:4 demek 0 dahil 4 hariç indeksli sütunları seç demek, yani 0,1,2,3.

iloc[] ile seçim yaptıktan sonra values eklemeyi unutmayınız aksi halde X pandas.Dataframe y ise pandas.Series türünde kalır.

Kategorik Nitelikleri Dönüştürmek

Veri setimizin nitelikleri tamamen nümerik. Ancak hedef değişkenimiz kategorik. Onu nümerik hale getirmeliyiz. Hatta gölge değişken oluşturmalıyız.

Veri Setini Eğitim ve Test Seti olarak Ayırmak

Veri setini eğitim ve test olarak ayırmanın bazı yolları var. Biz burada scikit learn kütüphanesi model_selection modülünden basit olan train_test_split fonksiyonunu kullanacağız.

Feature Scaling

Yapay Sinir Ağı girdi olarak niteliklerin standardize edilmiş hallerini istiyor. Bunun için nitelikler matrisini (X), scikit learn kütüphanesi preprocessing modülü StandardScaler sınıfını kullanarak standardize edeceğiz. Aslında niteliklerin hepsi aynı türden (cm) alındığı için yapay sinir ağı veri setini standardize etmeden de çalışır ancak bu başarı oranı daha düşük sonuçlar elde ederiz. Ben denedim, arasında ciddi bir fark var.

Yapay Sinir Ağı Başlangıç

Not: Bu aşamadan sonraki uygulamalar için theano, tensorflow ve keras kütüphaneleri bilgisayarınıza kurulmuş olmalıdır. Eğer bilgisayarınızda pip yüklü ise pip install keras gibi basit komutlarla kurabilirsiniz.

Yapay Sinir Ağı Nesnesi Oluşturma

Yapay sinir ağı iki farklı şekilde başlatılabilir: 1. Katmanlar dizilimi (Sequantial layers) olarak. 2. Graph olarak. Bu yazıda ilk yöntem kullanılacaktır. Bu yöntem için sadece yukarıda indirilen Sequantial sınıfından nesne yaratılır. Bu nesne, Karar ağacı, SVM gibi bir Sınıflardan çok da farklı olmayan bir nesne aslında.

Bir Sinir Ağını Stochastic Gradient Descent ile Eğitmenin Aşamaları

  1. Sıfıra yakın rastgele değerler ile ağırlık katsayılarını (W) belirle.
  2. Girdi katmanına (Input Layer) ilk gözlemi(bir satır) her bir düğüme bir nitelik (nitelikler matrisi sütün sayısı kadar) düşecek şekilde ver.
  3. Ağı çalıştır ve ilk tahmin y değerini üret.
  4. Üretilen y ile gerçek y arasındaki hatayı hesapla.
  5. Hesaplanan hatayı geri besleme olarak ağa gönder ve her bir ağırlık katsayısını (W) güncelle.
  6. 1 ve 5 arasını ya her bir satırdan sonra veya belli bir satır sayısından (batch) sonra tekrarla.
  7. Tüm veri setinin bir tur çalışması bir epoch demektir. Bunu defalarca tekrarla.

Yapay Sinir Ağına Girdi ve Gizli Katman Ekleme

classifier nesnesinin add() metodu içine Dense sınıfını nesne yaratarak parametre veriyoruz. Dense içindeki ilk parametre kernel_initializer (eski init): Başlangıç ağırlıklarını belirler. Tensor’ları oluşturmak/başlatmak için uniform dağılımını temsilen uniform parametresini kullanıyoruz. input_dim: Yapay sinir ağı nesnesine ilk katman ekleme işlemi yapılırken mutlaka girdi katmanında kaç düğüm olacağı bildirilir. Aksi halde ilk gizli katman kendisine kaç düğümden bağlantı olacağını bilemez. Bu rakam nitelikler matrisindeki sütun sayısıdır, bu örnekte 4. units (eski:output_dim): Bu sayının nasıl verileceğine dair sağlam bir kural yok. Biraz sanatkarlık ve tecrübe gerektiriyor. Örneğin; girdi ve çıktı düğüm sayısının ortalamasını verebilirsiniz. Bu örnekte (4+3=7/2=3,5 ~ 4). Ya da parametre tuning tekniklerini kullanabilirsiniz. activation: Gizli düğümler için rectifier,  çıktı düğüm için softmax olsun.  Rectifier aktivasyonu kütüphanede relu olarak tanımlıdır. Daha fazla bilgi için keras sitesine bakabilirsiniz.

Çıktı Katmanı (Output Layer) Ekleme

Bu katmanın bir öncekinden farkı düğüm sayısı ve activasyon fonksiyonu olacak. Hedef değişken üç farklı değer aldığı için units=3 veriyoruz.

Ağımızın yapısı aşağıdaki şekilde gibidir.

Yapay Sinir Ağını Derleme

Tüm hazırlıklar tamamlandı. Şimdi yapay sinir ağı nesnemizi (classifier) eğitebiliriz. Ancak bundan önce son olarak onu derlememiz gerekiyor. Bunun için compile() metodunu kullanacağız. Method için kullanılacak parametreleri açıklayalım: optimizer: Stochastic Gradient Descent (SGD)’i temsilen adam. loss: SGD’nin optimizasyonu için kullanılacak loss function. Tahmin y ile gerçek ye değeri arasını hesaplayıp en optimal değeri SGD’ye buldurur. Çok sınıflı bir hedef değişken olduğu için categorical_crossentropy kullanıyoruz. metrics: İlave olarak burada model değerlendirme kriterleri belirlenir. Bir liste halinde verilir. Biz şimdilik sadece accuracy kullanıyoruz.

Yapay Sinir Ağını Eğitme

Yukarıda gördüğümüz gibi % 95 bir başarı ile iris çiçeğinin yaprak uzunluklarından irisin üç türünden hangisine ait olduğunu tahmin etti. Elbette bu değer eğitim seti üzerinden elde edilen değer. Bunu ayrıca test setinde denemeliyiz.

Test Verisi ile Modeli Denemek

Eğitim verisi üzerinde accuracy başarısı % 95.80 olan modelimiz bakalım daha önce hiç görmediği test verisi üzerinde nasıl bir başarı gösterecek. Bunun için classifier nesnemizin predict() metodunu kullanıyoruz. burada elde edeceğimiz değerleri tahmin edilen anlamında y_pred değişkenine atıyoruz.

İkiden çok etiketli sınıflarda accuracy hesaplamak için scikit learn kütüphanesi metrics modülü accuracy_score fonksiyonunu kullanıyoruz.

Tahmin ettiğimiz gibi test seti üzerinde elde edilen accuracy değeri eğitim setinde elde edilenden düşük çıktı.
Kapak resmi kaynak: http://www.webtunix.com/deep-learning-services
Yararlanılan kaynaklar: https://www.udemy.com/deeplearning/learn/v4/overview
https://keras.io/
http://scikit-learn.org/stable/index.html
Kodlar Github:


Hakkında Erkan ŞİRİN

GÖZ ATMAK İSTEYEBİLİRSİNİZ

Python ile Makine Öğrenmesine Giriş Pandas Kütüphanesi

Merhabalar, Makine Öğrenmesine Giriş Serisi’nin İlk kütüphanesi Pandas’tan bahsedeceğim bu gün, serinin devamında numpy, matplotlib, …

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir