Pazar, Temmuz 08, 2018

EKG Kalp Atışı Sınıflandırması 6

Sonuçların Analizi ;


Kalp atışı sinyalinin sınıflandırılması amacıyla bu yazımıza kadar 9 metodu kullandık. Yukarıda gördüğünüz grafiği bu sonuçları kullanarak oluşturduk.
Tabloyu da görelim sayılar daha net gözüksün


Tablodan görüldüğü üzere, Derin öğrenme için uyguladığımız 3 ağ tipinden, Conv1d ve LSTM sırayla ilk iki sıraya yerleştiler.  İlk sıradaki Evrişimli yapay sinir ağı, her 3 ölçüt e  - precision,     recall, f1-score - görede  en iyi sonuca ulaştı. Derin öğrenmenin  bu iki modelini Boosting metodları takip ediyor. Sırayla Light GBM, Xgboost, CatBoost , üçüncü , dördüncü ve beşinciliğe yerleşiyorlar. Hemde pratik anlamda ulaştıkları sonuçlar bir birlerinden pek farklı değil. Üstelik 'F' tipi sinyal için derin öğrenme metodlarından daha iyi bir sonuca ulaşmış. Sinyal sınıflarının f1-skor değerlerine göre grafiğine bakalım















Bu bize gösteriyorki, illa derin öğrenme gibi bir müşkülata girmeye gerek yok. Boosting metodlarıda pek güzel işimizi görebilir.

Son olarak En başarılı iki metod olan Conv1D ve LSTM sonuçlarını birleştirince - Ensemble -, bir gıdım daha iyileşme oluyor.

 Classification Report
             precision    recall  f1-score   support

          N      0.990     0.997     0.993     18118
          S      0.933     0.804     0.864       556
          V      0.973     0.954     0.963      1448
          F      0.856     0.735     0.791       162
          Q      0.997     0.987     0.992      1608

avg / total      0.987     0.987     0.987     21892
Elbette bunlar bizim ulaşabildiğimiz sonuçlar.  3. yazımızda geçen metodolojiyi çok daha sistematik ve derinlemesine uygulanırsa sonuçların bir nebze daha iyi olabileceğini düşünüyorum. İlk yazılarımızda bahsetmiştik veri kümemiz sınıf  bazında dengesiz. Buna dair sınıf bazında ağırlıklar yada özel hata fonksiyonları - loss - denenebilir.

Karşılaştırma ;


Veri setini hazırlayanların, yazdığı makalede paylaşılan , sonuç tablosu şöyle ;

Görüldüğü gibi , makaleye göre daha başarılı  sonuçlara ulaşmışız.  Tabloda geçen diğer çalışmaların aynı veri seti üzerinde yapılmadığından karşılaştırmanın çok sağlıklı olmayacağını düşünüyorum.

Son olarak "müşteri her zaman haklıdır" düsturunca.

"Bir çalışma yaptık , Doktorlardan daha iyi kalp rahatsızlığını tespit ediyor !!! "  
mealinde gaflet içinde bir cümle ASLA kurmuyoruz.
Doğrusunun, çalışmanın uygulanabilirliğini, konunun UZMANLARIYLA - yani doktorlarla - görüşerek yapılması gerektiğini söylüyoruz.

Bunca Yazıyı sabırla okuduysanız tebrik ediyoruz. Her türlü eleştiri , görüş ve önerilerinizi bekleriz.


Cumartesi, Temmuz 07, 2018

EKG Kalp Atışı Sınıflandırması 5

Derin Öğrenme

Evet son olarak günümüzün en popüler ve en güçlü yapay öğrenme metodu olan derin öğrenmeye geldi sıra. Malumunuz biz keras kütüphanesini kullanıyoruz. Bu problemi çözmek için 3 tane ağ tasarladık.  Hepsi için ortak kullanıdğımız parameterler şöyle
  • batch_size :  128
  • epochs :  120
  • optimizer :  adam

 Dense ;

İlki klasik yapay sinir ağı diyebileceğimiz, keras daki "Dense" katmanlarıyla oluşturulmuş bir ağ. Sklearn deki MLP nin benzeri bir çözüm diyebiliriz. Farklılığına gelirsek burda biz bunu keras kütüphanesini kullanarak uyguladık, ve 'Dropout' denen katmanlarda ilave ettik.


Eğitim grafiğimiz


Sonucumuz
  Classification Report
             precision    recall  f1-score   support

          N      0.983     0.995     0.989     18118
          S      0.916     0.664     0.770       556
          V      0.951     0.941     0.946      1448
          F      0.911     0.698     0.790       162
          Q      0.986     0.978     0.982      1608

avg / total      0.979     0.980     0.979     21892

Conv1D;

İkinci olarak Tek boyutlu evrişim katmanlarının kullanıldığı VGG tipi bir ağ tasarladık. Kısaca iki evrişim katmanı sonrasında boyut küçültme - bakınız pooling -  şeklinde tarif edilebilecek bir yapı.
Ağ yapımız böyle



Eğitim Grafiğimiz



 Sonucumuz
 Classification Report
             precision    recall  f1-score   support

          N      0.990     0.996     0.993     18118
          S      0.895     0.809     0.850       556
          V      0.971     0.950     0.960      1448
          F      0.826     0.735     0.778       162
          Q      0.998     0.986     0.992      1608

avg / total      0.985     0.986     0.986     21892

LSTM;

Son olarak Özyinelemeli Sinir Ağları - RNN - denen ağ yapısının en bilinen tipi olan LSTM  kullanıldı.  Bu tip ağlarda vectörel biri giriş değil, zaman da değişen değerler öğrenilir. Dizilimden bir sonuca ulaşma tipine "many to one"  diyorlar.

The Unreasonable Effectiveness of Recurrent Neural Networks
 Andrej Karpathy nin yukardaki yazısından detaylara ulaşabilirsiniz. Konuyu dağıtmadan devam edelim

Ağ yapımız şöyle



Eğitim Grafiğimiz



Sonucumuz
 Classification Report
             precision    recall  f1-score   support

          N      0.986     0.997     0.991     18118
          S      0.915     0.755     0.828       556
          V      0.964     0.938     0.951      1448
          F      0.813     0.673     0.736       162
          Q      0.996     0.980     0.988      1608

avg / total      0.982     0.983     0.982     21892

Sonuçlar hakkındaki görüşlerimizi bir sonraki yazıya bırakıyoruz. Sadece bu yazımıza kadar denediğimiz metodlardan en başarılısı evrişimli yapay sinir ağını uyguladığımız oldu deyip bitiriyoruz. Her türlü görüş ve önerilerinizi bekleriz.

Çarşamba, Temmuz 04, 2018

EKG Kalp Atışı Sınıflandırması 4

Gradient Boosting Kütüphaneleri ile Sınıflandırma

Boosting ve gradient boosting genel algoritmalar. Yaygın olarak bilinen hali karar ağaçlarıyla çalışanı. Çok kaba bir özet geçersek. Zayıf sınıflandırıcılar olan küçük karar ağaçlarının birleştirilmesiyle  oluşturulmuş güçlü bir sınıflandırıcı oluşturulmaya çalışılıyor.



Gradient Boost 'un sklearnin içinde de var. Fakat biz harici kütüphaneler olana XGBoost, Light GBM ve CatBoost 'u burada kulanacağız

XGBoost :  İlk çıkan ve popüler olan kütüphane. Özellikle Kaggle yarışmalarında çok kullanılıyordu.
Tantım yazısı ;
XGBoost is an optimized distributed gradient boosting library designed to be highly efficient, flexible and portable. It implements machine learning algorithms under the Gradient Boosting framework. XGBoost provides a parallel tree boosting (also known as GBDT, GBM) that solve many data science problems in a fast and accurate way. The same code runs on major distributed environment (Hadoop, SGE, MPI) and can solve problems beyond billions of examples.

LightGBM : Microsoft 'un geliştirdiği açık kaynak kodlu bir kütüphane, Epey güçlü ve yaygınlaşmaya başladı.
Tanıtım yazısı;
 A fast, distributed, high performance gradient boosting (GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.

CatBoost : Yandex'in geliştirdiği açık kaynak kodlu bir kütüphane, Nispeten çok daha az biliniyor ama en az rakipleri kadar güçlü. Yaygınlaşmaya çalışıyor.
Tanıtım yazısı;
 CatBoost is an open-source gradient boosting on decision trees library with categorical features support out of the box for Python, R

 Konunun detayları hakkında bir kaç bağlantı verip geçiyoruz.

 Kullanımları 

 Sklearn tipi bir kullanımları var.  Sınıflandırıcı nesnenizi oluşturuyorsunuz. "fit" fonksiyonu ile eğitim , "predict" fonskisyonu ile tahmin yapıyorsunuz.

XGboost için   :  "XGBClassifier" sınıfı kullanılıyor


Sonuç :
             precision    recall  f1-score   support

          N      0.981     0.999     0.989     18118
          S      0.966     0.667     0.789       556
          V      0.977     0.921     0.948      1448
          F      0.894     0.728     0.803       162
          Q      0.994     0.965     0.979      1608

avg / total      0.980     0.981     0.980     21892


LightGBM  için : "LGBMClassifier" sınıfı kullanılıyor


Sonuç:
              precision    recall  f1-score   support

          N      0.982     0.999     0.990     18118
          S      0.974     0.683     0.803       556
          V      0.980     0.927     0.953      1448
          F      0.876     0.741     0.803       162
          Q      0.995     0.973     0.984      1608

avg / total      0.982     0.982     0.981     21892

CatBoost için : "CatBoostClassifier" sınıfı kullanılıyor.



Sonuç :
              precision    recall  f1-score   support

          N      0.982     0.997     0.989     18118
          S      0.931     0.680     0.786       556
          V      0.973     0.918     0.945      1448
          F      0.848     0.722     0.780       162
          Q      0.987     0.972     0.980      1608

avg / total      0.979     0.980     0.979     21892

Sonuçlar çok büyük farklılık göstermiyor.
Boosting kütüphaneleri ile yaptığımız denemelerin sonuçları böyl. Bir sonraki yazımızda kısmetse derin öğrenme ile aynı probleme çözüm bulmaya çalışacağız. Her türlü görüş ve önerilerinizi bekleriz.

Salı, Temmuz 03, 2018

EKG Kalp Atışı Sınıflandırması 3

Scikit-Learn ile Sınıflandırma

Scikit-Learn  Python 'un standart Yapay Öğrenme kütüphanesidir.  Kalp atışı sınıflandırma problemi için bu kütüphane ile başlayacağız. Bu kütüphane devasa bir kütüphane aklınıza gelen hemen her tür metod için sınıflar, fonksiyonlar eklenmiştir. Pek çok sınıflandırıcıda hali hazırda emrinize amade beklemedektedir


Yukardaki resim sınıflandırıcı metdolarını karşılaştırmak için yazılmış örnek kodun çıktısıdır.

Sınıflandırıcı için alt sınırımızdan bahsetmiştik geçenki yazımızda. Bütün örneklere normal dersek %82 başarılı çıkıyordu. Önce onu deneyelim


Bu basit ve sade tahmin sistemi bizim alt çizgimiz bu yöntemle ulaştığımız sonuçlardan daha iyi sonuca ulaşamayan, sınıflandırcı metodlarını bu problem için kullanmanın anlamı yok.

Verimiz hazır, sklearn 'ün bir sürü sınıflandırıcısı da elimizin altında. Bundan sonra izleyeceğimiz metodloji şöyle
  1. Sınıflandırıcı Nesnesini oluştur.
  2. Eğitim verisi ile modeli eğit - fit fonksiyonu -
  3. Eğitilmiş model ile doğrulama  verisinden tahmin yaptır - predict -
  4. Tahmin edilmiş değerlerle gerçek değerleri karşılaştır - classification_report fonksiyonu -
  5. Karşılaştırılımış sonuçlar yeterince iyi ise 8. maddeye git
  6. Karşılaştırılımış sonuçları daha iyi hale getirmesni umduğumuz parametre değişikliklerini yap
  7. Yeni parametrelerle 1. maddeye dön
  8. Eğitilmiş model ile test verisinden tahmin yaptır - predict -
  9.  Tahmin edilmiş değerlerle gerçek değerleri karşılaştır - classification_report fonksiyonu -
bu admlardan en muğlak olan 6. olan  daha iyi sonuca ulaştıracak parametre değişikliği.  Bunu yapabilmek için ilk etapta Sınıflandırıcı nasıl çalışır , parametreler ne anlama gelir, bilgi sahibi olmamız lazım. Bunlara ek olarak hangi tür verilerde hangi tip değişiklikler olumlu etkiliyor  gibi tecrübe de gerekiyor. İlki İçin okuyup araştıracaksınız. İkincisi için tecrübe edeceksiniz.

Başlayalım denemelere 3 tip sınıflandırıcı deneyeceğiz.

KNN -  K-En Yakın Komşuluk

 Genellikle KNN olan kısaltılmış adıyla bilinir. KNN genel anlamda hem sınıflandırma hem de regresyon için kullanılabilir. Sklearn de sınıflandırıcı olarak kullanmak için "KNeighborsClassifier" kullanılır. Metodda veriler vektörel olarak ifade edilir. Tahmin işlemi için verilen vektör K adet en yakın komşusunun durumuna göre cevaplanır. Eğer Sınıflandırma problemi ise, K adet komşunun sınıflarının oy çokluğudur. Eğer regresyon ise En Yakın K adet komşusunun değerlerinin ortalamasıdır.
Mesela aşağıdaki grafikte rengi belli olmayan noktanın sınıfı, kendisine en yakın K = 3 komşusunun
rengine göre seçilir.


2 komşusu kırmızı, bir komşusu mavi, sonuç kırmızıdır.


SVM – Destekleyici Vektör Makinesi

Support Vector Machines; Destekçi Vektör Makinesi diye tercüme edilse de Türkçe kaynakların pek çoğunda kısaltma ismiyle SVM olarak geçer. Çekirdek -kernel- fonksiyonu ile veriler hiper uzaya aktarılır, guruplar arası hiper düzlemler hesaplanır. Bu düzleme en yakın veriler - ki destek vektörleri denir - kullanılarak, düzlem guruplar arası en optimum konuma yerleştirilir.
Sınıflandırma  aşamasında da veri hiper uzaya aktarılır ve eğitim verisiyle oluşturulmuş hiper düzleme olan konumuna göre değerlendirilir.






Grafikle kafanızda canlandırmaya çalışalım. Kırmızı ve mavi iki ayrı sınıfa ait veriler ve uzayda şekildeki gibi görünsün. Bu iki gurubu ayrıştıran bir doğru bulalım. Fakat şöyle bir durum var; bu iki gurubu ayrıştıran sonsuz sayıda doğru bulunabilir. Bir kaç tanesini kesik çizgili olarak çizdik. SVM eğitimi ile doğrumuzu guruplar arası en optimum yere taşıyoruz. Grafikteki yeşil çizgi gibi. Doğru bir kez tespit edildikten sonra kullanımı kolaydır. Bulduğumuz doğrunun solunda kalanlar mavi, sağında kalanlar kırmızıdır.
Sklearn de  sınıflandırıcı olarak kullanmak için  "SVC" kullanılır.

Yapay Sinir Ağı

Klasik çok katmanlı Yapay Sinir Ağı. Sklearn de "Multi-layer Perceptron" diye geçiyor. Hem regresyon hem sınıflandırma için kullanılabiliyor. Sınıflandırma problemi için "MLPClassifier" kullanılıyor. Metodun çalışma sistemi için açıklama yazmayacağım, Çünkü eski yazılarımızda çok fazla işlediğimiz bir konu. Biraz zahmet olacak ama kusura bakmayın...

Sonuçlar

KNN

             precision    recall  f1-score   support

          N      0.979     0.995     0.987     18118
          S      0.882     0.671     0.762       556
          V      0.946     0.906     0.926      1448
          F      0.791     0.679     0.731       162
          Q      0.994     0.954     0.973      1608

avg / total      0.974     0.975     0.974     21892

SVM

             precision    recall  f1-score   support

          N      0.961     1.000     0.980     18118
          S      0.984     0.570     0.722       556
          V      0.987     0.772     0.866      1448
          F      0.854     0.648     0.737       162
          Q      0.999     0.917     0.957      1608

avg / total      0.966     0.965     0.962     21892

YSA

             precision    recall  f1-score   support

          N      0.980     0.995     0.987     18118
          S      0.886     0.631     0.737       556
          V      0.966     0.901     0.932      1448
          F      0.815     0.654     0.726       162
          Q      0.979     0.979     0.979      1608

avg / total      0.975     0.976     0.975     21892

Sklearn ile yaptığımız denemelerin sonuçları böyle bundan sonraki  aynı konulu yazılarımızda, Başka kütüphaneler  ve metodlarla denemeler yapmaya çalışacağız. Her türlü görüş ve önerilerinizi bekleriz.

Pazar, Temmuz 01, 2018

EKG Kalp Atışı Sınıflandırması 2

Veri kümesini okuma

Indirdiğimiz sıkıştırılmış dosyayı açtığımızda 4 tane csv  dosya çıkıyor. Bu dosyalardan ikis bizim kullanacağımız "MIT-BIH Arrhythmia" isimli veri kümesine ait. csv uzantılı dosyalar  metin tipinde ve değerler arasında genellikle 'virgülle ayrılmış dosyalardır. 
"mitbih_train.csv"  : 188 sutunlu son sutun etiket değeri ve 87554  örnek içeriyor
"mitbih_test.csv"  : 188 sutunlu son sutun etiket değeri ve 21892  örnek içeriyor
Veriler hazırda eğitim ve test için ayrılmış durumda ama biz ilave bir ayrım daha getireceğiz. Doğrulama - validation -  denen bu ayrılmış veri tıpkı test verisi gibi doğrudan eğitmde kullanılmaz. Fakat eğitim algoritmalarının hemen hemen her türünde ayarlamanız gereken parametreler vardır.  Hiper parametre denen bu değişkenlerin  değişimi ile aynı model aynı veri kümesi için çok değişik sonuçlar verebilir. Değişkenlerin en doğru değerlerinin tespiti için teorik bir formül yoktur. En iyi sonuca ulaşmak için genellikle denemeler yapılır. Deneme sonucunun iyi yada kötü olduğuna ancak eğitim de kullanılmamış verilere nasıl sonuçlar verdiğine bakarak karar verilir. İşte Doğrulama verisi diye geçen kısmın amacı budur.  Test verisiyle Doğrulama verisi aynı olamazmı. Olur hatta genelliklede öyle yapılır. Eğer yeterince fazla veriniz varsa ayrı ayrı olması daha doğru olur. Çünkü peyder pey hiperparametrelerle modelimizin performansını yükseltiriz. Ama farkında olmadan eğitim için kullanmadığımız veriden gelen bilgilerle düzeltmeler yapmış olabiliriz. Bu durumda test için ulaştığımız sonuçlara güvenemeyebiliriz.  Biz bu çalışmada bunu uygulamak amaçlı  3 e ayıracağız.
Eğitim verisinin %20 sini doğrulama verisi olarak ayırıyoruz. İlk aşamada kullanmayacağız ama sonra hiper parametre ayarlarında kullanmak üzere ayıracağız.

csv uzantılı dosyaları okumanın pek çok yolu vardır.  Biz numpy nin loadtxt fonksiyonunu kullanıyoruz ve sklearn 'ün train_test_split fonksiyonuyla doğrulama - validation  - kısmını ayırıyoruz.



Dataların dağılımlarına bakıyoruz. Hangi sınıfdan  ne kadar örnek var bunu görmek önemli.


Örnek verelim. Eğitim verimizdeki Normal örneklerin sayısı, eğitim veri sayımızın %82 kusuruna denk geliyor. Yani her örneğe doğru diyen bir sınıflandırma modeli toplamda %82 doğrulukta başarılıymış gibi görünür. Bunun ana sebebi veri kümesindeki dengesiz veri dağılımıdır. Ama gerçek hayatta da çoğunlukla bu tip dengesiz verilerle uğraşmak gerekiyor. Dengesiz veri kümesi problemi çok geniş burda geçiştirmenin anlamı yok. Eğer kısmet olursa bir başka yazıda yazarız inşallah.

Bu dağılımla tek başına doğruluk - accuracy -  değerinin bir şey ifade etmediğini başka ölçüm -metric - kıstaslarına bakmak gerektiğini anlıyoruz.



Çok sınıflı bir tahmin yapmaya çalışıyoruz. Yukardaki resim örneğindeki gibi İki hata durumumuz var;
"Hamile olmayana hamilesin" diyebiliriz.
Yada tersi "hamile olana hamile değilsin" denebilir.
Bunun dışındaki iki doğru seçenek var ;
"hamileye hamile"
"hamile olmayana hamile değilsin"
demek
Bu ana tanımlar sonrası bunlardan hesaplanan recall (duyarlılık) , precision (kesinlik) ve f1 skoru denen ölçütler var.  Bunları sklearn ün classification_report ile hesaplattırabiliyoruz. Teferruatlarına bakmak isterseniz internette, Ölçüt çeşitleri ve nasıl hesaplandıklar iyi ve kötü  yanları ile ilgili pek çok kaynak bulabilirsiniz.  Mesela bakınız;  "Sınıflandırma Modellerinde Başarı Kriterleri"


Yazı uzunluğu okunabilirlik limitini aşmak üzere,
Veri kümesi üzerinde çeşitli  Yapay Öğrenme metodlarının denenmesini bir dahaki yazımıza bırakıyoruz. Buraya kadar sabırla okuğunuz için teşekkürler.
Her türlü görüş ve önerilerinizi bekleriz.

Cumartesi, Haziran 30, 2018

EKG Kalp Atışı Sınıflandırması 1

Giriş :


Malumunuz Kalp en hayati organlarımızdan biri.  Ölüm sebeplerinin başlıcalarından biride kalp krizi. EKG de kalbin gidişatını doktorlara gösteren temel bir test. Hatta kardiyolojiye gidip selam verseniz. EKG çektir derler. Konuyu dağıtmadan, teferruatlı bilgi için konunun uzmanlarına ulaşın. deyip geçelim.

Bizim konuyla ilgimiz, EKG verileri ile sınıflandırma çalışması yapılması konusunda. Çok popüler bir test ve önemli olması sebebiyle, internette pek çok veriye ulaşmanız mümkün. Biz burdaki çalışmamızda, Kaggle da Shayan Fazeli tarafından yayınlanmış olan "HeartBeat" veri kümesini kullanacağız.

Bu veri kümesi;
"ECG Heartbeat Classification: A Deep Transferable Representation"
Mohammad Kachuee, Shayan Fazeli, Majid Sarrafzadeh
University of California, Los Angeles (UCLA)
Los Angeles, USA
arXiv preprint arXiv:1805.00794 (2018)

çalışmada kullanılmıştır.
Normalde Bir EKG test sonucu

şeklinde görnür.  Bu makalede Bu tip EKG ölçümü alınıp, Temizlenip, kalp atımlarına ayrılıp standartlaştırılmıştır.

 
Bölünmüş ve normalize edilmiş kalp atım siyaline gerekiyorsa sonuna sıfırlar doldurularak - padding- stanart bir uzuluğa - 187 - getirilmiştir.
Bu kalp atım siyalinin etiket değeri olarak 5 seçenek var
['N', 'S', 'V', 'F', 'Q']

yukarda bahsettiğimiz makalenin tablo 1 de bu sınıfların açıklaması olarak



yazılmıştır.  Aslında bu verileri  the MIT-BIH Arrhythmia Dataset alıp dönüştürmüşler.  Biz hazır temizlenmiş ve düzenlenmiş olduğu için tercih ettik. Sağlık alanında pek çok değişik veriye bu siteden ulaşabilirsiniz.
https://physionet.org/physiobank/database/
Eğer sağlık alanındaki çalışmalara ilgi duyuyorsanız. Uygulama yapmak istiyor ve veri kümesi arıyorsanız. Yukardaki siteyi inceleminizi tavsiye ederiz.

Verimize geri dönersek, 187 lik bir vectör şeklinde kalp atım sinyalimiz var. Bu sinyalin 5 sınıf içinden hangisine ait olduğunu tahmin edecek bir sistem geliştirmemiz gerekiyor.

Kaggle dan veri dosyasını indirip bir dizine açıyoruz. Veri kümesinde iki farklı veri kümesi var. Biz mitbih ile başlayan 5 sınıflı "MIT-BIH Arrhythmia" isimli veri kümesini  kullanacağız.
"mitbih_train.csv"  : 188 sutunlu son sutun etiket değeri ve 87554  örnek içeriyor
"mitbih_test.csv"  : 188 sutunlu son sutun etiket değeri ve 21892  örnek içeriyor
Elimizdeki veri kümesi üzerinde değişik metodlarla çalışma yapmak istiyoruz. Bu çalışmaları takip eden yazılarımıza bırakıyoruz.
Şimdilik anlatacaklarımız bu kadar. Bayda uzamış, buraya kadar sabırla okuğunuz için teşekkürler . Her türlü görüş ve önerilerinizi bekleriz.

Pazartesi, Haziran 18, 2018

Keloğlanın Optimizasyonla imtihanı

Zeka Hakkında Kıssalı Yazılar - 6 *

 
Evvel zaman içinde kalbur saman içinde. Develer tellal iken, pireler berber iken, ben annemim beşiğini tıngır mıngır sallar iken, bir varmış bir yokmuş.





Diyarın birinde bir garip keloğlan varmış. Sevdiceği Aykız ile mutlu mesut yaşarmış. Mutlu mesut yeknesaklığından sıkılan YZ Cadısı, Aykızın zihnini çalıvermiş. Aykız keloğlanı, tanımaz, bilmez olmuş. Aykızın zihninide "Optimizasyon" namlı diyarda bir kuyuya saklamış. YZ cadısı bütün bütün kötüde değilmiş, sadece macera seyretmek istermiş. Bu yüzden Keloğlana Aykızın zihnini bulabilmesi için çeşitli alet edavat bırakmış.

Keloğlan önce afallamış, bu alet edavatlar nedir, ne işe yarar. Optimizasyon diyarı nerdedir, nasıl gidilir, üzerinde nasıl gezilir ?  Kel kafacığında deli sorular dolanırken, aklına "Tarihteki ilk YZ projesini"  yürüten Nasrettin Hoca gelir. YZ cadısının bıraktıklarını toparlayıp, çalar hocanın kapısını.

Hoca keloğlanın anllattıklarını dinler. Bırakılan alet edavatları inceler. Sonra başlar anlatmaya;

Evlat optimizasyon denen diyar, büyülü bir diyardır. YZ Cadısı Aykızın zihnini billur bir şişede su olarak o diyarda bir kuyuda saklamış. O diyara dünyevi araçlarla uğraşamazsın şu bırakılan sihirli halılardan birini seçmen lazım. Halı seni her halükarda o diyara götürüp bırakır. Bırakacağı yeri sen seçemezsin ama  Halının köşelerinde ecnebi lisanı ile yazılmış ;"glorot , lecun , xavier , gaussian" diye geçen tılsımlar var. Bu tılsımlardan bazısının bazısından daha uygun noktaya inmeni sağlayacağına inanılıyor. Denemeden bilinmez.

İndikten sonra karayolu ile ilerlemen lazım.  Karayolunda seyahat etmek için şu çizmeleri kullanacaksın. Bu çizmeyi giyerek 1 arşından 100 bin arşınlık mesafeye kadar değişen " learning rate " uzaklıklara zıplaya bilirsin. Uzaklık ayarını çizmenin bağcığıyla ayarlıyabiliyorsun.

Son olarak bu çok gözlü heybe var. İçlerinde milyonlarca minyatür kristal kürecikler var. Optimizasyon diyarında sayısız kuyu ve kuyularda sayısız billur şişeler varmış. Doğru kuyu ve elbette doğru billur şişeyi bulabilmek için bu kristal kürecikleri kullanacaksın. Bu kristal kürecikler sana gideceğin yön ve uzaklığa dair bilgicik verir. Her kürecik sana kısmen doğru kısmende yalan söyler. Bu yüzden tek birinin göstergesine güvenemezsin.  Sen bir seferde  aklında tutabileceğin kadar küreyi çıkar sonuçları birleştir ve ortalamasını al ve o yönde hareket et. Her hareketin öncesinde bu işlemi farklı küreciklerle yap. Küreckler bazen yalan söylüyor dedikya. Seni  yanlış bir kuyuyada götürebilirler. Bu yüzden En başta küreckler den bir kısmını - Test Verisi - ayır. ve Hareket için asla kullanma. Kalanların hepsini gurup gurup kullanıp hepsi bitince. Bu ayırdığın küreckiklerle ulaştığın noktanın sonucunu test edebilirsin.

Hocadan gereken taktikleri alan keloğlan, halıya binip çıkmış yola. İlk indiği noktada hedefine hızlıca varacağını umarak çizmesinin hızını en yükseğe çıkarmış. Ama görmüşki bir o yana bir bu yana tutarsızca zıplayıp durmuş. Keza zıplamalar sırasında pek çok vadinin üzerinden geçdiği görmüş. O zaman farkına varmış ki çok yavaş giderse  hedefine ulaşması çoook uzun sürecek, çok hızlı giderse kontrol edemediği pek çok alanı geçecek. Böylece ilk optimzasyonunu çizme hızını düzgün seçmek olduğunu anlamış. Hızını orta dereceye alıp birazda böyle devam etmeye başlamış. Yaklaştığımı anladıkça biraz dahada yavaşlarım demiş.
Her seferinde seçtiği küreciklerden çıkan sonuca göre yön belirleyip giderken, farketmiş ki kısmi de olsa her seferde yalpalar yapmaktaymış. Bu yaplalamaları azaltıp daha hızlı yol alabilmek için önceki seferlerde küreciklerin söylediklerinide kısmen hesaba katayım demiş - momentum - Böylece daha düzgün bir yol almay başlamış.
Derken güzel bir konuma ulaşmış. Ulaşmış ama ulaştığı yerde hareket için kullanmadığı kürecikler - Test Verisi  -  doğru yerde olmadığını gösteriyormuş. Hareket için kullandığı kürecikler hedefe ulaştık diyorlarkerken, diğerleri ulaştığımız yerin yanlış olduğunu söylüyormuş - Local Minimum -
 Ne yapacağını şaşırmış kalmış. Düşünürken, farkına varmış ki  kürecikler yalan üzerinde ittifaka varıyor. Sonra, Küreciklerin yeterli olacağını düşünüp sadece birazını aldığını, çoğunu boşuna yük olur deyip bıraktığını hatırlamış. Geri dönüp bütün kürecikleri yüklenmiş ve baştan başlamış.
Küre sayısının artması sebebiyle, ilerlemesi çok daha uzun sürmüş ama Küreciklerde yalan üzerinde ittifak edememişler. Peyder pey gerçek hedefe doğru ilerleyebildiğini  hareket için kullanmadığı küreciklerden görmüş.  Uzun bir yolculuktan sonra hedefine varmış Billur şişeyi bulup Aykıza götürmüş. Billur şişedeki suyu içen Aykız eski haline dönmüş...

Gökten üç elma düşmüş biri Hinton'un biri Lecun'un biride Ng nin başına ...

* Zeka Hakkında Kıssalı Yazılar Serisi - 1 2 3 4 5

Salı, Mayıs 01, 2018

b-sequence - 1

 
 
Nedir bu sayılardaki  düzen ?

1 2 3 5 7 10 11 12 14 16 19 20 21 23 25 28 29 30 32 34 
37 38 39 41 43 46 47 48 50 52 55 56 57 59 61 64 65 66 
68 70 73 74 75 77 79 82 83 84 86 88 91 92 93 95 97 100 
101 102 104 106 109 110 111 113 115 118 119 120 122 124 
127 128 129 131 133 136 137 138 140 142 145 146 147 149 
151 154 155 156 158 160 163 164 165 167 169 172 173 174 
176 178 181 182 183 185 187 190 191 192 194 196 199 200 
201 203 205 208 209 210 212 214 217 218 219 221 223 226 
227 228 230 232 235 236 237 239 241 244 245 246 248 250 
253 254 255 257 259 262 263 264 266 268 271 272 273 275 
277 280 281 282 284 286 289 290 291 293 295 298 299 300 
302 304 307 308 309 311 313 316 317 318 320 322 325 326 
327 329 331 334 335 336 338 340 343 344 345 347 349 352 
353 354 356 358 361 362 363 365 367 370 371 372 374 376 
379 380 381 383 385 388 389 390 392 394 397 398 399 401 
403 406 407 408 410 412 415 416 417 419 421 424 425 426 
428 430 433 434 435 437 439 442 443 444 446 448 451 452 
453 455 457 460 461 462 464 466 469 470 471 473 475 478 
479 480 482 484 487 488 489 491 493 496 497 498 500 502 
505 506 507 509 511 514 515 516 518 520 523 524 525 527 
529 532 533 534 536 538 541 542 543 545 547 550 551 552 
554 556 559 560 561 563 565 568 569 570 572 574 577 578 
579 581 583 586 587 588 590 592 595 596 597 599 601 604 
605 606 608 610 613 614 615 617 619 622 623 624 626 628 
631 632 633 635 637 640 641 642 644 646 649 650 651 653 
655 658 659 660 662 664 667 668 669 671 673 676 677 678 
680 682 685 686 687 689 691 694 695 696 698 700 703 704 
705 707 709 712 713 714 716 718 721 722 723 725 727 730 
731 732 734 736 739 740 741 743 745 748 749 750 752 754 
757 758 759 761 763 766 767 768 770 772 775 776 777 779 
781 784 785 786 788 790 793 794 795 797 799 802 803 804 
806 808 811 812 813 815 817 820 821 822 824 826 829 830 
831 833 835 838 839 840 842 844 847 848 849 851 853 856 
857 858 860 862 865 866 867 869 871 874 875 876 878 880 
883 884 885 887 889 892 893 894 896 898 901 902 903 905 
907 910 911 912 914 916 919 920 921 923 925 928 929 930 
932 934 937 938 939 941 943 946 947 948 950 952 955 956 
957 959 961 964 965 966 968 970 973 974 975 977 979 982 
983 984 986 988 991 992 993 995 997 1000 1001 1002 1004 
1006 1009 1010 1011 1013 1015 1018 1019 1020 1022 1024 
1027 1028 1029 1031 1033 1036 1037 1038 1040 1042 1045 
1046 1047 1049 1051 1054 1055 1056 1058 1060 1063 1064 
1065 1067 1069 1072 1073 1074 1076 1078 1081 1082 1083 
1085 1087 1090 1091 1092 1094 1096 1099 1100 1101 1103 
1105 1108 1109 1110 1112 1114 1117 1118 1119 1121 1123 
1126 1127 1128 1130 1132 1135 1136 1137 1139 1141 1144 
1145 1146 1148 1150 1153 1154 1155 1157 1159 1162 1163 
1164 1166 1168 1171 1172 1173 1175 1177 1180 1181 1182 
1184 1186 1189 1190 1191 1193 1195 1198 1199 1200 1202 
1204 1207 1208 1209 1211 1213 1216 1217 1218 1220 1222 
1225 1226 1227 1229 1231 1234 1235 1236 1238 1240 1243 
1244 1245 1247 1249 1252 1253 1254 1256 1258 1261 1262 
1263 1265 1267 1270 1271 1272 1274 1276 1279 1280 1281 
1283 1285 1288 1289 1290 1292 1294 1297 1298 1299 1301 
1303 1306 1307 1308 1310 1312 1315 1316 1317 1319 1321 
1324 1325 1326 1328 1330 1333 1334 1335 1337 1339 1342 
1343 1344 1346 1348 1351 1352 1353 1355 1357 1360 1361 
1362 1364 1366 1369 1370 1371 1373 1375 1378 1379 1380 
1382 1384 1387 1388 1389 1391 1393 1396 1397 1398 1400 
1402 1405 1406 1407 1409 1411 1414 1415 1416 1418 1420 
1423 1424 1425 1427 1429 1432 1433 1434 1436 1438 1441 
1442 1443 1445 1447 1450 1451 1452 1454 1456 1459 1460 
1461 1463 1465 1468 1469 1470 1472 1474 1477 1478 1479 
1481 1483 1486 1487 1488 1490 1492 1495 1496 1497 1499 
1501 1504 1505 1506 1508 1510 1513 1514 1515 1517 1519 
1522 1523 1524 1526 1528 1531 1532 1533 1535 1537 1540 
1541 1542 1544 1546 1549 1550 1551 1553 1555 1558 1559 
1560 1562 1564 1567 1568 1569 1571 1573 1576 1577 1578 
1580 1582 1585 1586 1587 1589 1591 1594 1595 1596 1598 
1600 1603 1604 1605 1607 1609 1612 1613 1614 1616 1618 
1621 1622 1623 1625 1627 1630 1631 1632 1634 1636 1639 
1640 1641 1643 1645 1648 1649 1650 1652 1654 1657 1658 
1659 1661 1663 1666 1667 1668 1670 1672 1675 1676 1677 
1679 1681 1684 1685 1686 1688 1690 1693 1694 1695 1697 
1699 1702 1703 1704 1706 1708 1711 1712 1713 1715 1717 
1720 1721 1722 1724 1726 1729 1730 1731 1733 1735 1738 
1739 1740 1742 1744 1747 1748 1749 1751 1753 1756 1757 
1758 1760 1762 1765 1766 1767 1769 1771 1774 1775 1776 
1778 1780 1783 1784 1785 1787 1789 1792 1793 1794 1796 
1798 1801 1802 1803 1805 1807 1810 1811 1812 1814 1816 
1819 1820 1821 1823 1825 1828 1829 1830 1832 1834 1837 
1838 1839 1841 1843 1846 1847 1848 1850 1852 1855 1856 
1857 1859 1861 1864 1865 1866 1868 1870 1873 1874 1875 
1877 1879 1882 1883 1884 1886 1888 1891 1892 1893 1895 
1897 1900 1901 1902 1904 1906 1909 1910 1911 1913 1915 
1918 1919 1920 1922 1924 1927 1928 1929 1931 1933 1936 
1937 1938 1940 1942 1945 1946 1947 1949 1951 1954 1955 
1956 1958 1960 1963 1964 1965 1967 1969 1972 1973 1974 
1976 1978 1981 1982 1983 1985 1987 1990 1991 1992 1994 
1996 1999 2000 2001 2003 2005 2008 2009 2010 2012 2014 
2017 2018 2019 2021 2023 2026 2027 2028 2030 2032 2035 
2036 2037 2039 2041 2044 2045 2046 2048 2050 2053 2054

Pazartesi, Nisan 02, 2018

Kelime Kök Ayırıcı



Artık Yapay Sinir Ağları Doğal Dil İşleme  ( NLP )  alanında da kendini gösteriyor. Yoğun olarak derin öğrenme algoritmalarının kullanıldığı yeni çözümler boy gösteriyor.
Yabancı kaynaklarda  Doğal Dil İşleme ile ilgilendiğinizde elinizdeki metin verisinin  temel temizleme yaklaşımı şu şekildedir.
  1. Kelimleri  ayır
  2. Kelimelrin kökünü bul  - stem -
  3. Anlama etki etmeyen genel kelimeleri at  - stop words -
Bu şekilde bir temizleme ile yapılmak istenen şey  Anlamı bozmadan Kelime sayısını azaltmaktır.  Böyle temizleme faliyetine girişmeksizin yapılan bir modellemede kelime sayısının astronomik boyutlara fırlamasına ve modelin çok kompleksleşip, öğrenememesine sebep olabiliyor.

İngilizce gibi bir dilde kök bulmanın genellikle pek bir ters etkisi olmuyor  Fakat,  Türkçede yapısı gereği sondan eklerle bazen fazlasıyla anlam değişikliği oluyor. Bu yüzden yapılacak çalışmada buna dikkat etmek gerekiyor.

bir örnek verelim

gözüm ağrıyordu. göz doktoruna gitttim.  gözlük numaram değişmiş. 
gözlüğümün çerçeveside eskimişti.  gözlükçüye gidince,  yeni bir gözlük çerçevesi de aldım.

göz, gözüm ,gözlük,, gözlüğümün gözlükçüye, gözlük ... diye geçen kelimelrin hepsinin köküne göz demek anlamı bozar.
gözüm => göz
gözlüğümün => gözlük
gözlükçüye => gözlükçü
daha doğru bir yaklaşım gibi. Elbette bir anlam kaybı var ama nispeten daha doğru gibi geliyor bana. Elbette farklı anlamlı , yazılışlı aynı kelimeler için  bir çözüm değil bu.
 
Ortada çözümü olmayan genel bir optimizasyon problemi var. Eğer sadece kökü kullansanız, bazı anlamları kaybetme ,htimaliniz var. Tamamını kullandığınızda kelime sayınız astronomik sayılar çıkıyor.

Kelime vektörleri bu işi çözmezmi  ? ,  Kelime vectörleri dediğimiz sistemde Kelimeler sabit uzunlukta vektörler olarak ifade ediliyor.  Temelindeki  fikir şudur. Aynı anlamı ifade eden kelimeler aynı bağlamda - context - de kullanılır. Büyük derlemde - corpus  - kelimeler birlikte kullanıldıkları kelimelere göre optimize edilerek her birisi için sabit bir vektöre ulaşılıyor. Yakın anlamlı kelimeler kelime vektör uzayında bir birine yakın konumlarda oluyorlar.  Burda şöyle bir problem var her kelimenin her türlü ekiyle birlikte yeterli miktarda kullanım metnin olması pek mümkün değil.

Çok sıkıcı bir girizgah oldu kusuruma bakmayınız.  Ama sebebi var.
Bizim bir çalışmamız oldu. Kök bulma işlemini seq2seq bir modele öğretmeye çalıştık. Sağolsun Ahmet Aksoy beyin yayınladığı bir veriyi kullanarak eğittik. Bu haliyle bırakmadık Yavuz Kömeçoğlu kardeş bu model için etkileşimli bir web sayfası hazırladı.

nlp-kokbulma.herokuapp.com/

Şimdiki haliyle kullanıcının vereceği kelime için model çalıştırıp bir cevap dönüyor. Kullanıcı Cevabın doğru yada yanlış olup olmadığını ve  doğrusunu bildirebiliyor.

* Bu projenin özelliği ne peki. Yukardaki girizgahdan anlayabileceğiniz gibi çok zor bir  problemi çözdük  gibi bir iddiamız yok. Bu projenin ana özelliği klasik yaklaşımın dışında bir çözüm getirmesi
Klasik yaklaşımda şöyle olursa nasıl yaparım böyle olursa nasıl yaparım diye kurlallar silsilesi kurgulamanız lazım.  Hatta karşımıza kurguladığımız hiç bir kurala uymayan bir kelime çıkarsa.
 if kelime BU ise kök ŞU dur.  
demek zorunda kalıyorsunuz.

Modern yaklaşımlarda Olabildiğince çok veri bularak , Bir birini takip eden bir yapının diziliminden örüntüler çıkarıp istenen sonuca ulaşılmaya çalışılır. Biz bu projede bunu yapmaya çalıştık. Verimizi sağlıklı bir şekilde büyütebilirsek, modelin  başarısı artacağını umuyoruz.

* Bir başka büyük özelliği etkileşimli bir şekilde sunuluyor olması.  Günümüzde Türkçede Doğal Dil İşleme üzerine çalışma yapacak kişin, ilk toslayacağı duvar, elde hazırda verinin olmayışıdır. Sağ olsunlar Yıldız Üniversitesinden Kemik gurubunun yıllar önce yaptıkları dışında açık şekilde ulaşılabilir bir veri malesef yok. Bu çalışmayla gönüllülerin girdiği yeni kelimeler ve düzeltmelerle çok daha geniş bir verisetine ulaşabilme imkanını sunuyor.

Bu proje bir rol model olarak düşünülüp çok daha kompleks DDİ ( NLP ) problemleri için çözüm ve veriseti toplama sistemleri düşünülebilir.

Elbette bunu özel sektörde çalışan ben ve Master tezini vermeye uğraşan Yavuz tek başımıza yapamayız. Kullananlar olması lazım. Kullanıcaların yazdıklarının toparlanıp ayıklanması lazım. Sistemin yeniden eğitilmesi lazım. Epey bir emek gerekiyor.  Hatta bence bu bu tip bir proje ve elbette daha gelişmişleri, Akademik olarak sahiplenilmesi gereken projelerden.  Biz projeyi çalıştırdık. Kodumuzuda deeplearningturkiye  gurubunun github hesabında  yayınladık

github.com/deeplearningturkiye/kelime_kok_ayirici

Bundan sonra Proje sahiplerini bekliyor.

Derin Öğrenme Kısmı:


Gelelim işin teknik kısmına Modelimiz Seq2Seq denen yapıda bir ağ.  Keras kullanıldı. Kelimeler harf bazlı kodlandı. Harf çeşit sayımız 34. Yani bir harfi 34 uzunluğunda vektör olarak kodluyoruz. Maksimum kelime uzunluğu eldeki veri setine göre 22 olarak belirlendi.
RNN ağ katmanı veriyi zaman bazında istiyor. Bizim durumumuzda kelime uzunluğu 22 olduğundan
22 seferde  34 uzunluklu vektörler. Ağın çıkışıda  aynı şekilde kodlanmış olarak sadece Kök kımı üretiliyor.

Ağın genel yapısına bakalım


çok sade bir çoklu girişden çoklu çıkış -seq2seq-  üreten RNN li bir model . Fazladan diyebileceğimiz  sadece başta Dikkat - Attention - kısmı var. Giriş deki verilerin önem derecesini öğrenmesi için bir YSA katmanı yerleştiriyoruz ve katmanın çıkışını veri için bir önek katsayısı olarak kullanıyoruz.

Modeli sade tuttuk çünkü eğitim eğrisi gayet güzel test verisi başarısıda epey yüksek.



Elbette Verilerin çoğalması ile Modelede ilaveler gerekebilir. Kodda kerasın çeşitli callback fonksiyonları kullanıldı. Onlardanda bahsedelim.

  • EarlyStopping : Eğitim esnasında takip ettiğiniz  değerde belirleyeceğiniz adım -epoch - boyunca iyileşme yoksa eğitim veridiğiniz adım sayısından önce durduruluyor. Bizim kodumuzda 9 adım boyunca test verisi başarımında bir iyileşme olmuyorsa duryor.
  • ReduceLROnPlateau : Eğitim esnasında takip ettiğiniz  değerde belirleyeceğiniz adım -epoch - boyunca iyileşme yoksa Öğrenme hızını sizin belirleyeceğiniz bir katsayıyla çarparak küçültüyor. Bizim kodumuzda 2 adım boyunca test verisi başarımında bir iyileşme olmuyorsa Öğrenme hızı 0.5 çarpılarak yarıya indiriliyor.
  • ModelCheckpoint : Eğitim esnasında her adım sonunda belirleyeceğiniz şartlara göre modelin komple yada sadece ağırlıklarının kaydedilmesi işini yapar. Bizim kodumuzda test verisi başarım değerinde bir yükselme olmuşsa kaydediyor.
  • CSVLogger : Eğitim esnasında her adım sonunda , hem eğitim hem test verisi için , Hata değeri - loss - başarım değeri - acc - . Ve  öğrenme hızı - learning rate -  değerlerini kaydeder.

Bizim anlatacaklarımız bu kadar. Bayda uzamız buraya kadar sabırla okuğunuz için teşekkürler . Her türlü görüş ve önerilerinizi bekleriz.