Sayfalar

yapay zeka etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
yapay zeka etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Perşembe, Eylül 19, 2019

FastText ile Kelime Vektörü Oluşturma

Bu yazımızda FastText kullanarak nasıl kelime vektörü oluşturabileceğimizi nasıl göreselleştire bileceğimizi göreceğiz.

İlk yazımızda bahsetmiştik

"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. "
Kelimelerin anlamca yakınlıklarına göre orantılı birer vektöre dönüştürülebilmesinin önemi büyük. Doğal dil işleme ile yapılacak hemen her işte işimize yarar bir başlangıç noktası verir. Mesela bir arama algoritmasında sadece yazdığınız kelimeyi ararsınız. Aynı yada yakın anlama gelen kelimelerin geçtiği yerlere ulaşamazsınız. Anlamca yakın kelimeler ile arama yapabilmek için kelime vektörleri çok işinize yarayacktır. Bir başka aklıma gelen örnek; iki metnin anlamca yakınlığının hesaplanmasında kullanılabilir.

FastText 'in sitesinde değişik dillerde Common Crawl ve  Wikipedia dan toplanmış derlemler le eğitilmiş hazır kelime vektör modelleri var. Elbette Türkçe içinde var.
fasttext.cc/docs/en/crawl-vectors.html
 Buradan yayınlanan hazır eğitilmiş kelime vekörleri iki formatta sunuluyor.  Uzatnısı .bin  olan FastText modeli doğrudan yüklüyebiliyorsunuz. Yada uzantısı  .txt olan da her satırda başta kelime devamında vektör olacak şekilde hazırlanmış bir metin dosyası olarak.
Hemen baştan uyarayım dosyalar çok büyük ve devasa kelime sayısına sahip. Bu tip bir modeli her bilgisayarda yüklüyebilmeniz pek mümkün olmaz.

Bu tip genel vektörlerin bir başka handikapıda şudur. Kelimeler çeşitli alanlarda çok farklı anlamlara gelebilmektedir.  Sadece eş anlamlı kelimeler için olan bir durum değil bu.  Mesela bir başkent ismi turizm ile ilgili metinlerde doğal güzellikleri mesire yerleri felanla geçerken. Uluslar arası politika yazılarında o ülkeyi ifade eden özne olarak kullanılabilir.  Böyle durumlarda o kelimenin anlamını yeterince gösterebilen vekötre ulaşamayabiliriz. Bu tip problemlemin kısmen çözümü uygulamanıza has derlem oluşturmak ve eğitimi o derlem üzerinde yapmaktır.

Türkçe için deneme yapmamıza uygun bir derlem buluyoruz. Derlem konusunda eskiden beri çalışmalarıyla bilinen  Ahmet Aksoy 'un  çalışmasını kullanacağız. Bu derlemi Kaggle  da veri kümelerinin yayınlandığı kısımda yayınlamışlar.

www.kaggle.com/ahmetax/hury-dataset

Bizde ordan indirip FastText GUI ile eğitim  yapacağız. Bu derlemde Hürriyet gazetesinden çekilmiş haberler cümlelerine ayrılmış, noktalama işaretleri sayılar ve etkisiz kelimeler - stop words - çıkarılmış. Devam etmeden "stop words" kavramından bahsedelim. Kavram olarak anlamı cümle içlerinde kaldırıldığında anlamı değiştirmeyen kelimeler diyebiliriz.  Değişik tercümelerine denk gelmek mümkün ; gereksiz kelimeler, dolgu kelimeler, etkisiz kelimeler vs ...

Evet elimizde temizlenmiş hazır dermlem var biz bu derlem ile FastText GUI ile gözetimsiz eğitimler yapıp kelime vektörleri oluşturacağız. Elbette  fasttext i komut satırında kullanarak yada python paketindeki fonksiyonlarlada eğitimler yapabilirsiniz. GUI için çalıştıralbilir paket oluşturduk onu da kullanabilirsiniz.

İki ana eğitim metodu var skipgram ve cbow bir her ikisi içinde 100 lük vektörler üretecek şekilde eğitimler yaptık.  Ek olarak fasttext 'in klasik wor2vect in gelişmişi olduğunu söylemiştik.  Başlıca üstünleklerinden biriside kelimeyi harf ngramlar olarakda tutabiliyor olmasıdır. Bu konuyla ilgili eğitimde seçeneklerimiz var. harf ngram kullansın / kullanmasın diye de 2 seçenekli ilave eğitim yaptık. Toplam da 4  eğitim oldu.

GUI kullanımından bahsedelim biraz



Sol en üstte "Command"  kısmındaki açılır listede  4 seçenek var
"skipgram" ve "cbow" gözetimsiz eğitim için kullaınacak seçenekler dir. 
"supervised" seçeneği gözetim li eğitim için
"test" de gözetimli eğitimi yapılmış modeli bir veri seti üzerinde çalıştırıp sonuçları görmek için.

Üstte Ortada "Run Mode" var. burda 2 seçeneğimiz var
"slient" da fasttext arkaplanda  ekrana çıktı vermeyecek şekilde çalıştırılır ve sonuçlar işlem bittiğinde GUI de ekranda gösterilir.
"std output" seçeneğini seçtiğinizde fasttext çalışıtırılır ve komut satırı penceresinde çalışmasını ve yazdıklarını görebilirsiniz. fakat işlem bittiğinde yaptıkları GUI ekranına gelmez.

Harf ngram seçeneğini belirleyen kısım ise altta ortadaki "min char ngram" ve "max char n gram " seçenekleri her ikisinide 0 yaptığınızda harf ngram kullanmayarak eğitimi yapacakdır.
"learning rate" seçeneği başlangıç öğrenme hızıdır. Yapay öğrenme metodlarının çoğundaki anlamda kullanılır en büyük değer 1.0 dır fakat çok büyük olursa  hata  - loss - değeri küçülmek yerine büyümeye başlıyor ve sonra program çakılıyor. ona dikkat edin
"epoch" ise yine eğitim iterasyonunun ne kadar fazla yapılacağına dair bir parametre, Ne kadar büyük verirseniz o kadar uzun süre çalışır.
"word ngram"  için seçenek var. Bir dışında bir seçenekle kelime ngram yapısını kullanmış olursunuz.
"word vector Dimension"  seçeneği kelime için üretilecek vektör büyüklüğünü belirler.


Eğer eğitimi "slient" yaptıysanız eğitim süresince loss değerinin değişimini gösteren bir grafikde çizdiriyoruz gui altta



FastText kendi içinde multi thread bir yapıda olduğundan çalışırken mesaj almakda epey problem yaşadım. Halada tam çözümü olmayan bir sürü kısmı vardır. Ama yinede komut satırı açıp uzun uzun parametereleri yazmayla uğraşmak zorunda kalmıyorsunuz.

 Gelelim sonuçlara. Yukarda belirttiğim gibi 4 eğitim yapıtık.  hepsinde 100 lük vektör oluşturduk.
  1. skipgram + subwords ( char ngram ( 3 - 6) )
  2. skipgram  sadece kelime bazlı
  3. cbow + subwords ( char ngram ( 3 - 6) )
  4. cbow  sadece kelime bazlı



sonuçları nasıl görselleştirebiliriz derseniz kelime vektörlerini  iki boyuta PCA  indirip grafik olarak gösterebiliyoruz. Mesela İlk eğitim sonucu elde edilen vektörlerden rast gele seçilmiş 250 kelime için şöyle bir grafik çıkıyor.



 Bazen ilginç bağlantılar görülsede bu şekilde çoğu yerinde karman karışık bir yapı çıkıyor.  Bizim anlamca ilgisini bildiğimiz kelimelerden oluşturduğumuz bir listeyi aynı şekilde görselleştirerek bakıyoruz.



Burda gayet  şık bir anlamca uygun bir dağılım görüyoruz. altın, gümüş, elmas, zümrüt, platin gibi değerli maden ve metaller sağ üstte toplanmış. Sol üst tarafa doğru ise toplanan kelimeler ise ; Terör, terörist, cinayet, tecavüz, katil, katiller, pkk, deaş,  gibi kelimeler. Hatta "terörizst " diye bir kelime bile var. Biz bu kelimeyi mahsus koyduk aslında böyle bir kelime yok. Ama bu eğitimde harf bazlı ngram kullanıldığından bu kelimenin vektörünü doğru konumlandırabilmiş. Diğer kelimeleride inceleyin benzeri yakınlıklarda konumlandıklarını görebilirsiniz.

Hemen 2. eğitim sonucuna bakıyoruz



burda diğer kelimelerde yine mantıklı ve benzeri sonuçlar görürken  "terörizst " kelimesinin nisbeten olması gereken yerde uzukta ortaya çıktığını görüyoruz. Buda harf bazlı ngramın faydası diyelim.

3. eğitim cbow + subwords sonuç grafiği




4. eğitim cbow kelime bazlı sonuç grafiği


Eğitim sonrası ulaşılan hata değerleride yazalım
  1. skipgram + subwords ( char ngram ( 3 - 6) )  --  Loss : 0.990
  2. skipgram  sadece kelime bazlı --  Loss : 0.961
  3. cbow + subwords ( char ngram ( 3 - 6) ) --  Loss : 1.480
  4. cbow  sadece kelime bazlı --  Loss : 1.352
Evet epey uzun da ols bir yazının daha sonuna geldik. Her türlü görüş ve önerilerinizi bekleriz.

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, 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.