Pazartesi, Ekim 08, 2018

DeepCon'18 payment anomaly workshop

DeepCon'18 geçtiğimiz cuma ve cumartesi günü yapıldı. Yoğun bir katılım vardı. Emeği geçen herkese burdan teşekkür etmek isteriz. Pek çok konu konuşuldu. Bence çok daha önemlisi ilgili insanlar bir araya geldi. İletişim pek çok zaman gelişmedeki temel motor işlevini görür. İnsanların bir şeyler yapma ve öğrenme gayretini görmek, Yada yaptıklarınızın takip edildiğini öğrenmek gayretinizin artmasına vesile oluyor.

SefaMerve.com ArGe Merkezinin çalışmalarından bahsettiğimiz, "Eticarette yapay Zeka Uygulamaları" başlıklı  bir sunumumuz oldu. Sunumu Cüneyt bey yaptı. Sunumun ilk kısmında "Payment Anomaly" başlıklı bir kısım sonrasında genel yapılanlar anlatıldı. Ben burada İlk kısım için biraz daha teferruatlı bir açıklma yazmak istiyorum. İnşallah birilerine Faydalı olur.

Bir E-Ticaret firmasının helede Uluslararası satışı varsa pek çok kaynakdan ve çeşitli kurlarda tahsilat yapması gerekmektedir. Pek çok banka, değişik ödeme türleri ( paypal, paybyme vs... ) gibi Değişik ülkelerde çalışmaktadır. Yani sistemin sağlıklı yürüyebilmesi için pek çok tahsilat sisteminide sağlıklı yürüyor olması lazımdır.

Biz tahsilat sistemindeki olası anormalliklerin tespiti için, her türdeki alt sistem için yapılan saatlik tahsilatların toplamlarını bir zaman serisine dönüştürdük. Sonra 24 saatlik veri ile 25. saat deki değeri tahmin edecek bir model kurduk.  Tahmin ve gerçek değer arasındaki belli eşik edeğerinden fazla farklılık ve bu farklılığın belli saat boyunca devam etmesinin bir anomaly olacağını varsaydık.




Çalışmamız bu anlamda klasik bir zaman serisi tahmini modeline benzetilebilir. Bir kaç özelliği var ; çok girişli, çembersel normalizsayon, gurup normalizasyonu.

Circular Normalization:

Genelde İnsan davranışları için elebtte burda bizim ana ilgimiz olan satın alma için  zamanın önemi büyük. Zamanın dönügüleri var.  Gün içinde bazı saatlerde satışlar artarken bazı saatlerde çok düşe biliyor. Haftanın günlerine görede bu değişimi gözlemleye biliriz, hafta içi ile hafta sonu davranış farkları olması gibi. Normalde bu döngüsel zaman değerlerinin girişi klasik kategorik veri gibi yapılmaktadır. yani mesela haftanın günleri için.
Pazartesi : 0 0 0 0 0 0 1
Salı         : 0 0 0 0 0 1 0
 ...
Pazar      : 1 0 0 0 0 0 0
 gibi Bu durumda her bir günün bir birine uzaklığı eşit olmaktadır.  Oysa Cumartesi gününün Pazar gününe uzaklığı ile Çarşamba gününe uzaklığı farklıdır.


Biz bu tip döngüsel kategorik değişkenler için Birim çember üzerinde eşit aralıklı  noktalar olarak Normalize etmeyi kullandık. Üstteki grafikde olduğu gibi.  Pazar Günü pazartesi ve Cumartesi gününe yakındır.  Bu şekilde bir dönüşümün bir faydasıda girdi büyüklüğünün küçülmesidir. Kasik metodla kodladığımızda 7 lik vektör olarak kodlayabilirken. Çembersel  Normalizasyonla 2 lik vektöre dönüştürmüş oluyoruz. Bu sayede günün hangi saati olduğunuda 24 yerine 2 lik vektör olarak kodluyoruz. Yada Ayın hangi günü olduğunuda 31 lik vektör yerine 2 lik vektör olarak kodlamış oluyoruz. Bu tip bi kodlamanın daha önce uygulandığına dair bir bilgimiz yok. İşin akademik yönünüde klasik metodlarla karşılaştırıp teferruatlı test etme imkanımız olmadı malesef.  Tecrübi bir yöntem olarak bahsetmiş oluyoruz.

Grup Normalization :

Zaman serisinde tedrici genel - belki mevsimsel - bir değişim olabilmektedir. Zaman serisinin normalizasyonunda komple bütün serinin maksimum değerine göre yapılması bizce kısmen problem olabilir. Hele bu genel değeşim çok büyükse. Genel maksimuma göre normalizasyon yerine biz bu çalışmamızda giriş olarak aldığımız 24 saatlik gurubun maksimum değerine göre bir normalizasyon yapmayı tercih ettik.

Multiple Input Model :


Çok girişli bir ağ yapısını kullandık.  Çünkü ; Zaman serisi dışında tahmin etmememiz gereken saatin zaman döngüsünde nerede olduğunun da tahmin ile ilgili olduğunu düşündük ve onuda kattık.
İlk girdimiz zaman serisi ve 24 saatlik bir birini takip eden tahsilat değerleri  LSTM ile işleniyor.
İkinci girdimiz  Zaman ile ilgili verimiz 8 lik bir vektör . ( haftanın günü, saat, ayın günü, ay )  kalsik YSA katmanı - Dense layer -  ile işleniyor. Sonrasında bu iki kısım birleştiriliyor.



Sonuç olarak sıradışı bir anormallik tespiti yaklaşımı üzerine bir çalışma yapmış olduk. Koda ve verilere ve sunuma şağıdaki github sayfamızdan ulaşabilirsiniz

github.com/birolkuyumcu/deep_con18_payment_anomaly_workshop

Her türlü görüş ve önerilerinizi bekleriz.


Pazartesi, Eylül 10, 2018

Ses ile Kalp Atışı Sınıflandırma

Evet başlığından da anlaşılacağı üzere yine sağlık alanında bir yazımız var. Bu seferek verimizi ses olarak alıyoruz.



Verimizin kaynağı yine Kaggle 
https://www.kaggle.com/kinguistics/heartbeat-sounds

Biz kaggle dan ulaşmış olsakda asıl verinin kaynağı 2011 tarihli bir yarışmadan geliyorumuş
http://www.peterjbentley.com/heartchallenge/index.html 
İki ayrı şekilde kaydedilmiş ses dosyaları var
ilki "iStethoscope Pro" isimli bir iphone uygulaması kullanılarak kaydedilmiş sesler


Kalanlar  "DigiScope" marka bir dijital steteskop ile alınmış



Ses dosyalarının uzunlukları farklı tahmin edeceğiniz gibi ses dosyalarının çoğuda Normal seslerden oluşuyor.
Önce ses dosyalarımızı test ve eğitim olarak iki guruba ayırıyoruz.
Eğitim %80
Test %20

 Bu ayrımdan sonra ses dosyalarımızı 0.5 saniyelik kaydırmayla 2 saniyelik kısımlara bölüyoruz. ve giriş verisi olarak bunu kullanıyoruz.Yani giriş verimiz 2 saniyelik ses sinyali. Elimizdeki ses dosyalarına göre konuşursak  ( sample rate 22050 )  44100 lük vektörü giriş olarak kullanıyoruz.


Veri dosyalarımızı oluşturduktan sonra tek boyutlu evrişim katmanları kullanan bir ağ tasarladık ve bir sınıflandırıcı eğittik.

  • Opimizasyon metodu : Adam
  • Toplam parametre sayısı :  1,366,865
  • Eğitim Epoch sayısı : 29 - earlystop ile -
 Eğitim grafiği


Modelin başarısı  eğitim için kullandığımız datalarla %95 in üzerinde

Eğitim için kullanmadığımız datalarla yaptığımız  test ve sonuçlarıda şöyle gösterelim


ortalama %73 -75 arası bir başarı görünüyor.

Başarının düşük olması ve  artımamız gerektiği bir gerçek elbette. Ama sadece ham ses sinyali vererek. Bir dönüşüm -fft mel vs gibi - yapmadan bir sınıflandırıcı eğitilebilmeside zannımca çok önemli bir özellik.

Fırsat bulabilirde bu çalışmaya tekrar dönebilirmiyiz bilemiyorum ama. Bu çalışmaya devam isteyenlere ilk önce ses sinyalinde kalp atış kısımlarının ayrıştırılması sonrasında bu çalışmanın yapılmasının başarıyı oldukça yükselteceğini düşünüyoruz.

Her türlü görüş ve önerilerinizi bekleriz.

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.