Sayfalar

Cumartesi, Ağustos 31, 2019

FastText ile hızlı metin sınıflandırma - 3

Bir önceki yazımızda veri kümemimiz ile FastTextGUI kullanarak eğitim işlemini yapmıştık. Eğitim sonucunda uzantısı .bin  olan bir models dosyası oluşturuldu. Bu yazımızda eğittiğmiz modeli nasıl kullanacağımızı göreceğiz.

Eğtilmiş modeli kullanmanın iki yolu var. Birincisi FastText in komut satırı çalıştırılabilir programını kullanarak. İkinci yolu FastText i python kütüphanesi olarak yükleyerek.

İlkinden başlıyalım. FastText programının kullanım parametrelerine bakalım


Bu seçeneklerden  tahmin için "predict" yada "predict-prob" sçeneğini kullanabiliriz. aralarındaki fark ikincisinde tahmin ile birlikte tahin kesinlik ihtimalinide veriyor.  Tahmin yapılmasını istediğiniz metinleri her biri bir satır olacak şekilde bir metin dosyasına kaydetmemiz gerekmekdedir. Her tahmin için geçici bir metin dosyası yazdırıp FastText programıyla çalıştırmamız gerekiyor. Bu işlem için bir fonksiyon yazdık


Kullanım için test için hazırladığımız dosyayı yüklüyoruz. Burdaki gerçek sonuçları da ayırıp sorgumuz yapıyoruz sonuçlarıda gerçek sonuçlarla karşılaştırmak için sckit-learn kütüphanesinin , confusion_matrix, classification_report  fonksiyonlarını kullanıyoruz.
confusion_matrix : Karşılaştırma matrisi  tahmin edilen ile gerçek değerelri karşılaştırmanıza yarar matrisin bir ekseni gerçek değerler diğer ekseni tahmin edilen değerleri gösterir.

 her satır gerçek değerleri gösterir her sutunda tahminleri gösteriyor. Eğer modelimiz %100 başarılı olsaydı satır ve sutun indeksi aynı olan yerlerde her sını için örnek sayısı olan 5 bin dğerini göremiz gerekirdi.  Örnek vermek gerekirse ilk sınıfımız olan Şirket sınıfındaki  5 bin örnekden 4767 tanesi Doğru tahmin edilmiş. 39 tanesi  2. sınıf olan Eğitim kurumu olarak Yanlış tahmin edilmiş.
Bir güzelliğide bir birine karıştırılan sınıfların kolaylıkla görülebilmesidir.

classification_report : fonksiyonu ise  sınıf bazında recall: duyarlılık , precision: kesinlik ve bu ikisinin karışımı bir ölçüt olan f1 skorlarını hesaplayıp listler. Adıyla müsemma Sınıflandırıcı raporu düzenler



 İkinci metodumuz FastText python pakedini yüklemek. Tahmin edebilecğiniz gibi
pip install fasttext


şeklinde yapıyorsunuz. 

import fasttext
 model = fasttext.load_model('models/dbpedia_1.bin')

ile yüklüyoruz
tahmin için sorgu listemizi bir yere kaydetmemize gerek yok artık direk çağırıyoruz
model.predict(qlist)
sonuçları yine ilk örneğimizdeki gibi hesaplattırıyoruz. Aşağı yukarı aynı sonuçlara ulaşıyoruz. Toplamda  98.3 lük başarı değerine ulaşıyor modelimiz. Eğitim aşamasına geri dönüp değişik parametre ayarlarıyla daha iyi sonuçlara ulaşmaya çalışabilirsiniz. Yada ilk aşamaya dönüp Veri kümesi üzerinde değişik ön işlemeler yapıp sonuçlar üzerindeki etkisini gözlemleyebilirisiz . gerisi size kalmış

 FastText hakındaki bu seri yazımızı bitiriyoruz.  Üç yazı boyunca yaptıklarımızı github hesabımızdan paylaşıyoruz.  Kimbilir belki taş üstüne taş koyan çıkar.

Bu yazımızdaki kullanım ile ilgili kodlar,  "example"  dizininde "evaluation_with_executable" ve  "evaluation_with_python_binding" isimli ipython dosyalar olarak bulunuyor.
Veri kümesini FastText 'in kullandığı şekle çeviren kod  yine "example" dizininde "prepare_data" isminde

FastTextGUI nin kodlarına ise gui dizinin içinde ulaşabilirsiniz

Projenin github adressi ;

  https://github.com/birolkuyumcu/fasttext_gui
 Her türlü görüş ve önerilerinizi bekleriz.

Cuma, Ağustos 30, 2019

FastText ile hızlı metin sınıflandırma - 2

Metin sınıflandırma için öncelikle bir veri seti bulmamız gerekiyor biz bu yazımız için dbpedia veri kümesini kullanacağız. Sizde uygulama istiyorsanız aşağıdaki linkden indirebilirsiniz


Veri Kümesinin açıklamasını okuyoruz.
...
The DBpedia ontology classification dataset is constructed by picking 14 non-overlapping classes from DBpedia 2014. They are listed in classes.txt. From each of thse 14 ontology classes, we randomly choose 40,000 training samples and 5,000 testing samples. Therefore, the total size of the training dataset is 560,000 and testing dataset 70,000.
...
Yani DBpedia 2014 den çekilmiş  14 değişik sınıfa ait yazılar başlık + içerik olarak toplanmış.  Her sınıf için eğitimde 40 bin  test veri seti için 5 bin örnek kaydedilmiş. DBpedia  wikipedia da üretilmiş içeriklerin yapısal bir şekilde derlenip torpalanmış halidir diyelim. DBpedia hakkında daha fazla bilgi için sitesine gidebilirsiniz. Belkide size lazım olan veri kümesini bu şekilde temin edebilirsiniz...


Açıklamanın tamamını veri kümesini indirip açtığınızda "readme" belgesinden okuyabilirsiniz

veri kümemiz sıkıştırılmış dosya olarak geliyor bulunduğumuz dizine açınca  "dbpedia_csv" isimli bir dizine açılıyor

Sınıf isimlerimizi okuyoruz



Şirket , eğitim kurumu, vs diye başlayan 14 başlık var. Başlıkları ayrı yazmışlar çünkü veri kümelerinde  yani "dbpedia_csv/train.csv" ve "dbpedia_csv/test.csv" de sınıf isimleri 1 den başlayan sayı olarak yazılmış



FastText eğitim için veri kümesinin bir metin dosyası halinde verilmesini istiyor. İstediği Format ise  her satırda bir veri birimi  başta  "__label__" a hangi sınıf sa onu yazıyoruz sonrasında boşluk ve  virgül  ile ayrıp satırın devamında  o sınıfa ait bir metin yazıyoruz.  Bizim metin kısmı başlık ve açıklamda olarak iki parçalı geldiğinden birleştiriyoruz.  Etiket olarak yukarıda okuduğumuz sınıf isimlerini kullanıyoruz. Metin verisinde yaptığımız tek işlem ise küçük harfe çevirmek. Veriler sıralı şekilde verilmiş, bizde karışmadan aynı şekilde FastTextin istediği formata çevirip yazıyoruz



aynı işlemi test verisi içinde yapıyoruz.


Evet artık 'dbpedia.train' ve 'dbpedia.test' diye 2 dosyamız oldu içine bakıyoruz



Bu aşamadan sonra sıra geliyor FastText'e.  İki şekilde kullanmak mümkün FastText'i derleyip komut satırından çağırmak , yada Python paketi olarak kurup onu kullanmak. FastText ilk çıktığında python paketi yoktu ve bizde bu eğitim işinde parametere ayarlarını kolay yapabilmek için bir GUI yazdık. Ve halende kullanıyoruz. Fakat malesef kod python2 de kaldı python3 e taşımaya fırsat ve gerek bulamadık daha kullanmak için python2 , pyside , pygal, paketleri gerekiyor. 
Görünümü şu şekilde ;



FastText i kullandığından kelime vektörü  hesabı içinde kullanılabilir elbette ama bizim şu anki önreğimiz metin sınıflandırma olduğundan command kısmında "supervised" seçeneğine ayarlıyoruz. TextFile kısmına eğitim veri kümemiz için hazırladığımız dosyayı seçiyoruz.   
Model File kısmında Eğitim sonrası eğitilen modelin ismini belirliyorsunuz. 
Sağ üstteki Play tuşu ile eğitimi başlatabiliyorsunuz. En sağdaki Dur işaretide durdurmak için
Altta Learning Rate  ile başlangıç öğrenme hızını belirliyorsunuz
Epoch Diğer makina öğrenme metodlarından bildiğiniz gibi eğitim kaç adım yapılacağı
En az kaç defa geçen kelimenin alınacağı, karekter ngramlarında hangi aralığın kullanılacağı, kelime ngramı kaçlık kullanılacağı vs gibi pek çok seçenek var. Ayarlı seçenekler ile başlayıp denemeler yapmak gerekiyor.

Eğitim bitince eğitim veri kümesinin ismi aynı uzantısı .test olan bir dosya varsa eğitilmiş model ile bu test dosyası çalıştırılıp sonuçda veriyor







Resimden de göreceğiniz üzere
  • precision: kesinlik    0.983
  • recall: duyarlılık   0.983
değerlerine ulaşttık ki gayet güzel sonuçlar

Eğitim sonunda  Loss  değerinin düşüşünüde grafik olarak alabiliyorsunuz.




Eğitim sonucunda uzantısı bizim belirlediğimiz isimde
uzantısı .bin  olarak model dosyası
uzantısı .vec  olarak kelime vektörelrinin tutulduğu dosya oluşturulur
FastTextGUI de bunlara ilaveten
uzantısı .log olan eğitim serencamını tutan dosya
uzantısı .svg olan  loss düşüş grafiğinin dosyasını oluşturur.


Eğittiğimiz modeli kullanmak için sadce uzantısı .bin olan dosya yeterli olmaktadır.

Eğittiğimiz modelin kullanımını bir sonraki yazımıza bırakıyoruz.  Yazı dizimiz bittiğinde bütün kodlar yayınlanacaktır.

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

Perşembe, Ağustos 29, 2019

FastText ile hızlı metin sınıflandırma - 1

 

 

 Girizgah :

Önce bu konuya nerden girdik ondan bahsetmek istiyorum. Blogda duyuru şeklinde yazmamış olsamda Linkedin hesabımdan beni takip edenler biliyor ki artık bir dökümcü değilim. 2016 yılı Temmuz ayın dan beri Sefamerve.com un ArGe kısmında çalışmaktayız. Bu yılın başından beride bölümümüz ArGe merkezi statüsüne kavuştu. "Bir dökümcü ve bir simitçiyle"  başlayan macera bizi nerelere götürecek ? Kısmetimizde ne tür vavlar çizmek var göreceğiz bakalım...

2017 yılında metin sınıflandırma ile ilgili bir ihtiyacımız oldu. Bu konu daha öncesinda tecrübemizin olmadığı bir alandı.  Hızlıca bu problemi nası çözeriz diye araştırır ken FastText'e ulaştık. Çokda beğendik. O zamanlar sadece komut satırından program olarak çalışan hali yayınlanmıştı. Kullanımını kolaylaştırmak için üzerine çala kalem bir GUI yazdık ve kendi işlerimizde kullandık.

FastText i kullanarak makale çalışmasıda yaptık. Deniz Kılınç hocamızın yayınladığı TTC-3600 veri seti üzerinde bir uygulama yaptık. Bu konuda Deniz hocamızın zaten öncesinde yaptığı çalışmalarda vardı. Makalede ismi geçmiyor olsada emekleri büyüktür, teşekkür ederiz. Bu makaleyi biz Japonyada Tokushima üniversitesinde düzenlenen NLPIR 2019 konferansına yolladık ve kabul aldık. Yakın zamanda da makalemiz  ACM (Association for Computing Machinery) Digital Library altında  yayınlandı.

"An automated new approach in fast text classification (fastText): A case study for Turkish text classification without pre-processing"

FastText:

Uzunca girizgahdan sonra esas konumuza dönüyoruz.  Elimizde pek çok Yapay Öğrenme  - Makine Öğrenmesi - algoritması var. Fakat Bu metodların hepsi sayılar üzerinde çalışıyor. Doğal Dil İşleme üzerinde ki ana problem de burda başlıyor. Metin verisini nasıl sayısallaştırabiliriz ?  Kelime bazlı, harf bazlı yada bunların gurupları -ngram-  şeklinde yaklaşımlar olmuştur.  Kategorik dönüşüm şeklinde ilk akla sistemdir. Kelime sayısının çok büyük olmasıyla devasa vektör uzunluklarıyla sonuçlanabilir.

Sonra Kelime vektörü - word2vec - denen bir kavram çıkmış ortaya.  Her kelime için sabit uzunlukta bir vektör kullanmak. "Birlikte geçen kelimeler anlamca yakındır" var sayımından yola çıkılıyor.  Başlangıçda aynı yapay sinir ağlarındaki gibi kelimeler için rastgele seçilmiş vektör değerleri atanıyor. Devasa derlem - corpus - kullanarak danışmansız şekilde - unsupervised - her kelime için birlikte geçtiği kelimelere göre bu vektörler güncelleniyor. Bu öğrenme sürecinin iki ana şekli var. CBOW ve skipgram 

bu iki yapının şematik gösterimi şöyle




cbow da  hedef kelime vektörüne  o kelimenin etrafında geçen kelimelerin vektörlerinin toplamıyla ulaşılmaya çalışıyor ve bu hedef doğrultusunda vektörler güncelleniyor
skipgramda ise tersine hedef kelimeyle birlikte geçebilecek kelime yada kelime ngramlarına ulaşılmaya çalışıyor ve bu hedef doğrultusunda vektörler güncelleniyor


Bir rivayete göre cbow daha hızlı eğitilir ve  sık geçen kelimeleri daha iyi temsil eden vektörlere ulaşabilir. Skipgram  eğitim veriniz az da olsa iyi çalışır, nadir geçen kelimeleri bile yeterince iyi temsil edebilecek vektörlere ulaşabilir.

Eğitim sonucunda vektör uzayında benzer anlamlara gelen kelimeler yakın yerlerde kümelendiği gibi
kelime vektörleri uzayında yapılan işlemler de anlammı sonuçlar verebilmektedir. Meşhur örnekler


Erkek kelimesinin vektöründen Kral keliimesinin vektörünü çıkarıp Kadın kelimesini ilave edine ulaştığımız vektörel değer Kraliçe kelimesinin vektörel kaşılığına ulaşıyor



yada ülkeler ve başkentleri arasında  böyle bir vektörel ilişki görülebiliyor. 

Kelimelerin bu tür anlamsal bağ  içeren vektörel dönüşümleri elbette doğal dil işleme için elbette çok önemlidir.

Word2vect metodu  2013 yılında googleda  Mikolov un liderlik ettiği bir gurup tarafından yapılmıştır. Sonrasında Mikolov  Facebook a geçmiş ve FastText bir anlamda bu metodun daha gelişkin halidir.
Temel üstünlüğü kelimeleri  harf engramları olarakda görebilmesinden gelmektedir. Halen geliştirilmeye devam edilmektedir. FastText in detayları için aşağıdaki makaleleri incelemenizi tavsiye ederiz.


Epeyde teoriden bahsetmişiz gelelim pratiğe.  FastText in "supervised" kısmıyla çok başarılı Metin sınıflandırma işleri yapabiliyorsunuz.  Hemde küçük harfe dönüştürmek dışında hiç bir ön işlem yapmadan mümkün oluyor. GPU istemiyor. GPU nuz olsa bile RNN bazlı sistemlere göre çok çok çok daha hızlı eğitiliyor.

Bu yazıy burada noktalayalım bir sonraki yazımızda örnek  uygulama yapacağız. Her türlü görüş ve önerilerinizi bekleriz.

Salı, Temmuz 02, 2019

Sahibinden Üçkağıtçı Proje




- Abi biz sizi takip ediyoruz, bizim bir projemiz var ortaklaşa yapalım diye rahatsız ediyoruz

- Yapalım tabi kardeş, Nedir projeniz

- Abi projemiz "Görüntü işleme bazlı Yapay Zekalı !  Bahçe rekolte tahmini"

- Yani ne bekliyorsunuz kafanızda ne var ?

- Abi Şimdi malum artık her cepte telefon var. Cep telefonundan Ağaçların fotoğraflarını çekecekler. Bu fotoğraflara göre bizim uygulama bu bahçeden şu kadar ürün çıkar diye tahmin yapacak. Nasıl süper fikir ama değilmi abi ?

- Dabi Dabi süper fikirmiş. Peki kardeş bu fotoğrafların çekimlerini nasıl standartlaştıracaksınız.

- Ne  standardı abi öyle şey mi olur. Alacak vatandaşın biri çekecek. Sistem artık kendisi eline ne gelirse oradan karar verecek.

- Peki proje esas sahibi kim  ?

- Abi büyük şirketler varmış bahçeleri toptan alıyorlarmış, Bizim bir arkadaşın "pek bir yakın tandığı !"  böyle bir şirketlerde çalışıyormuş.  O diyor "yapın projeyi paraya para demezsiniz."

- Anladım baştan size para verecek kişi de yok yani

- Evet abi de ne olacak sanki sen yazarsın görüntü işlemeli ve YZ lı kısımları bizde üzerine bir GUI patlatırız. Oldu bitti işte.

- Peki kardeş verileri nereden alacaksınız. ?

- Yine bizim bir arkadaşın  "pek bir yakın tandığı !" nın tanıdığı bahçe sahipleri varmış. Oralardan çekeriz abi

- Kardeş benim anladığım aslında elinizde para yok , veri de yok, verinin düzgünce çekilebileceği imkanda yok ve  hazır müşteride yok.

- Proje var ya işte abi, sen varsın, biz varız

- Dabi canım, ama unuttun sen  ben yazmış olayım  arkadaşın "pek bir yakın tandığı !" da var

- Sen işleri niye böyle yokuşa sürüyorsun abi, biraz olumlu baksana

- Senin bakdığın gibi kolay bir problem değil bu. Şak diye çözüm bekleyemezsin. Helde giriş verisinin standart bir yapısı olmadığında. Aynı ağacı çok değişik şekillerde çekebilirsin mesela bundan düzgün bir sonuç çıkarabilmek pek mümkün olmaz.

- Ya abi ya okuyoruz hep;
Doktordan daha iyi  teşhis koyan,
İnsandan daha iyi resim tanıyan
İnsandan daha iyi ses tanıyan,
...
çalışmalar var yalan mı bunlar

- Yalan değilde sana aktarıldığı gibi abartılı da değil

- Bir orta yol bulalım abi

- Bak güzel kardeşim tamam anladım ki anlatamayacağım vaz geçiyorum. Sana çok kestirme  bir çözüm sunacağım

- Dinliyorum abi

- Geçmiş yılların hasılatlarını alabilirmisin ?

- Alırız tabi abi

- Şimdi sen bir Cep telefonu uygulaması yapıyorsun

- Evet

- Bu uygulamada ağaç fotoğraflarını çekecekler

- Geçmiş yılların hasılatlarından ve ağaç sayısından  ağaç başına yıllık hasılat miktarlarını gösteren bir zaman serisi oluşturacaksın

- Evet abi

- Sonra bu bu serinin ortalamasını ve standart sapmasını bulacaksın

- Eee abi

- Formülü yazıyorum bak yaz bir kenara
Hasılat  =  Ortalama_Hasılat  +  Random()  * Hasılat_Standart_Sapması

Uygulamada her ağaç fotoğraf geldikçe  bu formülle bir hasılat miktarı hesaplar ve sonuda da hepsini toplarsın bi zahmet.

- Eee abi Görüntü işleme ve yapay zeka neresinde bunun

- Elbette reklamında kardeş

- Süpermiş abi ben hemen çalışmalara ! başlayayım.  Peki sen ne isteyeceksin proje için abi

- Ben bir şey istemiyorum  al sana SAHİBİNDEN ÜÇ KAĞITÇI PROJE hayrını gör.

- Abi peki ucundan kıyısından  Yapay Zeka felan da sokuştursak iyi olurdu

- Şimdi böyle başlayında İlla soran olursa, sonra resimleri az meyveli çok meyveli diye etiketlersen rastgele sayıyı ona göre ayarlarız.

- Süper olur abi biz bununla hemide Innovasyon ödülü  bilem alırız

- Alırsınız elbette neyiniz eksik...

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.

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