MAKİNE ÖĞRENMESİ NEDİR?

 

MAKİNE ÖĞRENMESİNE GİRİŞ

Makine öğrenmesi açık şekilde programlanmadığı halde deneyimlerden otomatik şekilde öğrenen ve öğrendiklerini pekiştiren sistemler geliştirmeye odaklanmış bir yapay zekâ alt alanıdır. Makine öğrenmesi veriye erişen ve kendi kendine öğrenen bilgisayar programları geliştirme ile ilgilidir. Yoğun olarak  denetimli ve denetimsiz öğrenme yöntemleri şeklinde karşımıza çıkan makine öğrenmesinin dört farklı öğrenme türü vardır:

·  Denetimli öğrenme (supervised learning): Bugün ve gelecek hakkında tahminler üretmek üzere etiketli veri yardımıyla geçmiş verilerden öğrenen ve bunu daha önce hiç görnediği verilere uygulayarak sonuçlar elde eden öğrenme şeklidir. Öğrenim verisinden elde edilen modellerin yeni verilere uygulanması sıklıkla sınıflandırma olarak bilinir. Sınıflandırma görevini yerine getiren fonksiyona ise sınıflandırma denklemi adı verilir. Öğrenim verisinden model öğreniminde öğrenme eğrileri kullanılır ve model yeteri kadar veri ile eğitildikten sonra öğrenme sona erdirilir. Hangi miktarda veri ile öğrenim yapılacağı öğrenme verisinin miktarı ve model performansı arasındaki ilişkiden elde edilir. Öğrenim eğrisi üzerinde öğrenim verisi arttığı halde model performansı artmadığında öğrenme verisi boyutu sabitlenir. 

·   Denetimsiz öğrenme (unsupervised learning): Denetimli öğrenmenin aksine etiketli eğitim verisi bulunmaz. Bu yöntemin amacı veri içerisinde gizli bulunan örüntülerin açığa çıkarılmasıdır. Veri etiketler yerine bizzat kendi özellikleriyle açıklanır. İşlemin başında hangi veri bileşeninin hangi grupta olacağı bilinmezken işlem sonunda her bir veri bileşeni kendiyle ilgili bir gruba atanır. En bilinen denetimsiz öğrenme tekniği kümeleme olup işlem başında hangi kümeye ait olacağı bilinmeyen veri elemanları benzerlik ve uzaklık yöntemleri yardımıyla kendi kümelerini bulurlar. 

·    Yarı denetimli öğrenme (semi-supervised learning): Model eğitimi için etiketli ve etiketsiz veriler birlikte kullanılır. Az miktardaki etiketli veri yardımıyla önce veriler kümelere ayrılır daha sonra küme bilgisi yardımıyla elde edilen sınıf etiketleri sınıflandırma için kullanılır. Verilerin az olan kısmıı etiketli daha büyük kısmı ise etiketsiz veridir. Bu türden sistemler genel olarak öğrenim oranlarını artırmaktadır.

· Takviyeli öğrenme algoritmaları (reinforcement learning) eylemler üreterek çevresi ile etkileşime giren ve hataları veya ödülleri keşfeden bir öğrenme yöntemidir. [1]

1.1.       Öğrenme ve öğrenme türleri

1.1.1.  Denetimli öğrenme

Denetimli öğrenme, bir öğretmen eşliğinde hangi girdilerin hangi çıktılarla eşleşeceğini ifade eden bir makine öğrenmesi görevidir. Sistemdeki öğretmen fonksiyonu eğitim verisindeki etiketler ile sağlanır. Böylece geçmiş örnekler yardımıyla gelecek için tahmin yapma imkanı doğar. Eğitim verileri yardımıyla öğrenen sistem öğrendiklerini test verisi üzerinde uygular. Bu işleme sınıflandırma adı verilir. Dolayısıyla sınıflandırma; sınıfı bilinmeyen bir kaydın daha önceden eğitilmiş kategorilerden birine atanması görevi olarak tarif edilebilir. Ayrıca eğitim verileri yardımıyla öğrenmeye tümevarım (induction) öğrendiklerini test verisi üzerinde uygulamaya da tümdengelim (deduction) adı verilir.  
 
Denetimli öğrenim verilerin bir kümesine ihtiyaç duyar. Veri kümesinde x(i), giriş değişkenini veya özellik değerlerini, y(i) ise çıktı veya hedef değişkeni ifade etmektedir. Bu noktada bir eğitim verisi örneği (x(i),y(i)) şeklinde sunulur. N adet eğitim örneği {(x(i),y(i)); i=1,2,…,N} ise eğitim kümesi olarak isimlendirilir. Denetimli öğrenim için hedef; eğitim seti yardımıyla h:x->y ilişkisini sağlayan h(x) fonksiyonunun elde edilmesidir. Tarihsel veri ile ilişkisinden dolayı (historical) denetimli öğrenim fonksiyonu olarak h seçilmiştir. Daha anlaşılır bir form olarak sunulmak istendiğinde sınıflandırma modeli şu şekildedir:

y=h(x)

Denetimli öğrenimde tahmin etmeye çalıştığımız hedef değişken eğer sürekli bir değişken ise bu bir regresyon problemine, ayrık bir değişkense o zaman da sınıflandırma problemine dönmektedir.

1.1.2.  Denetimsiz öğrenme

Denetimsiz öğrenme, etiketsiz veri üzerinde önceden bilinmeyen kalıpları bulmaya yardımcı olan ve kendi kendine organize olan bir öğrenim türüdür. Makine öğrenmesinde önemli yöntemlerden biridir. İlk kez meydana gelmiş olayların anlamlandırılmasında, daha önceden örneği olmayan durumların modellenmesinde etkili bir yöntemdir. Denetimli öğrenme yöntemine göre daha karmaşık kıyaslama görevlerini yerine getirir. 

Denetimsiz öğrenme için örneklerden birisi daha önceden örneğini hiç görmediğimiz bir canlı türünü sınıflayabilmektir. Örneğin daha önce hiç “atmaca” görmemiş birisi diğer kuş türleri hakkındaki bilgilerini kullanarak atmacanın da bir kuş olduğunu söyleyebilir. Veya bir çocuk ayakları, gözleri, yürüme şekline bakarak daha önce tanımadığı canlıları tanıdıklarına benzeterek bir yorumda bulunabilir.

İnsanların bir öğretmen olmaksızın kendi kendine öğrenmeye başlaması da aslında denetimsiz öğrenimin bir örneğini teşkil eder.

Denetimsiz öğrenme, bir model inşa etmeye ihtiyaç duymayan bir makine öğrenmesi tekniğidir. Öğrenmenin bu türü yardımıyla verilerdeki bilinmeyen her türlü örüntünün tespit edilmesi imkânı vardır.

Denetimsiz tekniklerden öne çıkan ikisi Kümeleme ve Birliktelik Kuralları Analizidir. Kümeleme daha önceden hangi grubua düşeceği bilinmeyen verilerin birbirlerine yakınlık veya uzaklıklarına dayalı olarak bir gruba atanması şeklinde meydana gelir.

Denetimsiz öğrenme teknikleri yardımıyla yapılabilecek önemli işlemlerden birisi anormallik tespitidir. Anormallik tespiti, veri kümesindeki olağandışı işlemleri bulmak için yararlı kullanılır ve böylece önemli veri noktalarını keşfedebilir.

Gözetimsiz öğrenmenin en büyük dezavantajı, veri sıralama hakkında kesin bilgi alamamanızdır.

1.1.3.  Yarı denetimli öğrenme

Öğrenme algoritmalarında takviyeli öğrenme tekniği de bulunmasına rağmen temel iki öğrenme tekniği her zaman denetimli öğrenme ve denetimsiz öğrenme şeklinde iki sınıfa ayrılır. Bununla birlikte gerek denetimli öğrenme tekniğinin gerekse denetimsiz öğrenme tekniğinin kendine has dezavantajları bulunmaktadır. Örneğin, denetimli öğrenme algoritmalarının en önemli dezavantajı veri kümelerinin konu uzmanı yardımıyla etiketlenmesi ihtiyacıdır. Bu durum büyük boyutlu veriler için büyük sorun demektir. Denetimsiz öğrenme algoritmalarında ise en önemli sorun uygulama sepktrumunun sınırlı olmasıdır.

Bu dezavantajlarla baş edebilmek için yarı denetimli öğrenme kavramı ortaya atılmıştır. Bu türden öğrenmede öncelikle etiketsiz veri etiketli veriler yardımıyla etiketlenir. Bu işlem etiketli verilerle aynı kümede yer alan etiketsiz verilere etiket atanması şeklinde meydana gelir. Yarı denetimli öğrenmede temel prosedür denetimsiz öğrenme algoritmaları yardımıyla etiketsiz benzer verilerin kümelenmesidir. Böylece kümeleme yardımıyla etiketsiz veriden etiketli veri elde edilir ve bu veriler diğer etiketsiz verileri sınıflandırmada kullanılır. 

1.1.4.  Takviyeli öğrenme

Takviyeli öğrenme hedef odaklı öğrenme olup maksat en iyi sonuçları elde edecek eylemlerin yapılmasının teşvik edilmesidir. Bu türden öğrenim bi nevi deneme-yanılma yöntemine benzemektedir.

Takviyeli öğrenme mevcut durumda en iyi sonucu veren yerine ileride daha iyi sonuçlar verecek tercihleri önceler. Yani günü kurtaran değil yarınları kurtaran çözümleri size sunar. Kısa süreli karlı olan bir yatırım yerine size uzun planda kazandıracak şeyleri önerir.

Takviyeli öğrenme kapsamında öğrenen sisteme ajan (agent) adı verilir. Ajanın amacı çevresel faktörler yardımıyla en iyi sonucu elde etmektir. Çoğu zaman denetimli öğrenme iyi bir öğrenme yöntemi olmasına ragmen elimizde etiketli veri yoksa ve ajan kendi bilgileri haricinde bir bilgiye sahip değilse o zaman takviyeli öğrenme öne çıkacaktır.

Takviyeli öğrenme için en iyi örnek markow karar süreci olarak bilinir. Takviyeli öğrenme geçmişte verdiği kararlardan yararlanır ve münkün olan en iyi bilgiyi yakalamaya çalışır.

1.2.       Makine öğrenmesi algoritmaları

Yapay zekânın alt dallarından birisi olan makine öğrenmesi farklı öğrenim türleriyle ilişkili çok sayıda makine öğrenme algoritmasıyla çalışır. Her bir algoritma gerçek hayatta bir problemin çözümüne yardımcı olur. Makine öğrenmesi algoritmaları veri madenciliği süreci veya veri analitiği süreci dediğimiz sürecin kalbini oluşturur. Veri madenciliği ve makine öğrenmesi birbiriyle ayrılmaz ikili olup aralarındaki ilişki araç ve amaç ilişkisidir. Amaç veri madenciliği araç ise makine öğrenme algoritmalarıdır.

Makine öğrenmesi algoritmaları ile alışık olduğumuz algoritmalar arasında da aslında bir fark bulunur. Klasik algoritmaların en önemli özelliklerinden birisi açık, net, sonlu olması iken makine öğrenmesi algoritmalarında her zaman problemlerin çözümü için net ve sonlu çözümler olmayabilir. O nedenle klasik programlama yetenekleri ile çözülemeyen problemler, sıklıkla makine öğrenmesi algoritmaları olarak karşımıza çıkar. 

Klasik programlama ve algoritmaların yetersiz kaldığı durumda karşımıza sezgisel algoritmalar çıkmaktadır. Dolayısıyla makine öğrenme algoritmalarının önemli bir kısmı sezgisel algoritmalar olarak karşımıza çıkmaktadır.

Makine öğrenme algoritmaları başlığında elbette çok fazla sayıda algoritma vardır fakat bu yazıda sık kullanılan makine öğrenme algoritmaları kabaca açıklanacaktır.

1.2.1.  Doğrusal regresyon

Regresyon analizinin amacı, bağımsız değişkenlerdeki (x) değişime dayalı olarak bağımlı değişkendeki (y) değişimin açıklanmasıdır. Amacı giriş ve çıkış değişkenleri arasındaki ilişkiyi yakalamak olan regresyon analizi için nedenselliği (sebep-sonuç ilişkisi) açıklayan bir algoritmadır denebilir. Giriş ve çıkış değişkenleri arasında bir ilişki her halükarda bulunabilir fakat eğer bağımsız değişken(ler) bağımlı değişkendeki değişimi yeteri kadar açıklayabilirse ancak o zaman elde edilen model tahmin için kullanılabilir.

Regresyon analizinini tek giriş değişkeni ile tek çıkış değişkeni arasındaki ilişkiyi ifade eden sürümüne basit doğrusal regresyon (simple linear regression) adı verilir. Eğer giriş değişkeni birden fazla çıkış değikeni tek ise ona da çoklu doğrusal regresyon (multiple linear regression) adı verilir.

Regresyon analizi yardımıyla aşağıdaki türden bilgiler elde edilebilir.

·       Öğrencinin derse katılımıyla dönem sonu başarısı arasındaki ilişkinin elde edilmesi.

·       Demografik özellikler ile suç arasındaki ilişkinin elde edilmesi.

·       Beslenme ile kanser arasındaki ilişkinin ölçülmesi.

Basit doğrusal regresyon aşağıdaki şekilde ifade edilebilir.

y = b0 + b1x ± є

Burada y, tahmin edilen çıktı değerini vermek üzere b0 başlangıç değerini, b1 giriş değişkeni katsayısını, x giriş değerini, epsilon ise hata miktarını vermektedir.

Bağımlı değişken ile bağımsız değişken arasında çok sayıda regresyon modeli ortaya konabilir. Bunların en iyisinin hangisi olduğunu seçmede en küçük kareler yöntemi kullanılır. Gözlem değerleri (gerçek değerler) ile tahmin değerleri arasındaki farkların karesi toplamı hangi modelde en küçük ise o model seçilir. En küçük kareler yönteminin esası hatayı minimize eden modelin seçimidir. 

Çoklu doğrusal regresyon ise aşağıdaki denklem ile sunulur.

y = b0 + b1x1 + b2x2 + … + bnxn ± є

Basit doğrusal regresyon ile aradaki tek fark artan giriş değişkenlerinin sayıdır. Ayrıca basit doğrusal regresyon tek bir giriş değişkeni ile tek bir çıkış değişkeni arasındaki ilişkiye odaklanmışken çoklu doğrusal regresyon birden çok giriş değişkeni ile tek bir çıkış değişkeni arasındaki ilişkiye odaklanmıştır.   

1.2.2.  Lojistik regresyon

Doğrusal regresyon gibi amacı bir veya birden çok bağımsız değişken ile bir bağımlı değişken arasındaki ilişkiyi modellemektir. Lojistik regresyonun doğrusal regresyondan farkı ise bağımlı değişkeninin sürekli değil kategorik türde olmasıdır.

Lojistik modelin parametreleri kolaylıkla yorumlanabilir ve matematiksel olarak kullanımı kolay fonksiyonlar üretilebilir. Lojistik modele dayalı analizleri yapabilmeyi sağlayan çok sayıda bilgisayar paket programı (SPSS, SAS, Tanagra vb.) mevcuttur.

Doğrusal regresyon bağımsız değişken(ler) ile bağımlı değişken arasında doğrusal bir ilişkinin bilindiği durumlar için uygundur. Lojistik regresyon ise bağımlı değişken ile bağımsız değişken(ler) arasındaki ilişkinin doğrusal olmadığı durumlar için uygundur. Doğrusal regresyon denkleminde hedef bağımlı değişkenin değerinin tahminidir. Lojistik regresyonda ise hedef bağımlı değişkenin olasılığıdır.

Doğrusal regresyon ile lojistik regresyon arasındaki formül açısından farklılık ise doğrusal regresyon formülünün sigmoid fonksiyonundan geçirilmesi sonucu lojistik regresyon denkleminin elde edilmiş olmasıdır.

1.2.3.  Karar ağacı

Ham verilerden bir ağacın elde edildiği (ağaç tümevarımı yardımıyla) ve bu ağaca dayalı olarak yeni kayıtların sınıflara atandığı makine öğrenmesi algoritmasıdır. Bir karar ağacı, kararları ve karar almayı görsel ve açık bir şekilde temsil etmek için kullanılır.

Karar ağacı algoritmasında tahminci değişkenler düğümleri, hedef değişkenler yaprakları oluşturur ve model ağaç veri yapısı ile sunulur. Kökten yapraklara kadar bilgi kazancı metriğine dayalı olarak bölümleme yapılarak ağaç meydana getirilir.

Karar ağaçlarında kökten yapraklara kadar bölünmenin geri planında ağaç tümevarımı vardır. Ağaç tümevarımının ise en önemli dayanak noktası bilgi kazancı metriğidir. Bilgi kazancı bir düğümün bölünme kararıyla ilgilidir. N adet nitelikten oluşan bir veri setinde kth sıradaki düğünden (k+1)th sıradaki düğüme geçip geçmeme kararı aşağıdaki mantığa göre bilgi kazancı ile ölçülür.

Bilgi kazancı = (kth düğümün homojenlik değeri) – ((k+1)th düğümlerin toplam homojenlik değeri)

Bilgi kazancı eğer pozitif bir değerse ağaç yeni düğümlere bölünür, aksi takdirde ağaç yeni düğümlere bölünmez.

Homojenlik ölçümünde de gini index, entropy ve missclassification error gibi değerlere göre karar verilir.

1.2.4.  Destek vektör makineleri

İleri seviye veri analizlerini bünyesinde toplayan veri madenciliği kendi içerisinde temelde iki gruba ayrılır. Bu gruplardan birisi açıklamalı modelleri diğeri ise tahmini modellerdir. Bu gruplama içerisinde destek vektör makineleri tahmini modeller grubuna girer. Her ne kadar sınıflandırma için de regresyon analizi için de teknikler içerse bile sıklıkla sınıflandırma maksadıyla kullanılır.

İlk olarak 1963 yılında Vladimir Vapnik ve Alexey Chervonenkis tarafından temelleri atılan algoritmanın gelişimi 1995 yılında Vladimir Vapnik, Berhard Boser ve Isabelle Guyon tarafından yapılan çalışma sayesinde olmuştur. Temel olarak doğrusal ayrılabilir uzayda sınıflandırma için geliştirilen algoritmanın amacı; iki boyutlu uzayda verileri ayıracak çizgileri, çok boyutlu doğrusal uzayda ise verileri ayıracak düzlemleri bulmaya çalışır. Asıl amacı doğrusal ayrılabilir uzaylar olsa da doğrusal olmayan verileri de ayıran algoritma bu amaçla kernel fonksiyonlarını kullanır.

Destek vektör makineleri parametrik olmayan sınıflayıcılardır. Bu nedenle; dağılım hakkında herhangi bir ön bilgiye sahip olmadığımız veri setlerinde de yüksek başarımlar elde etme olanağı sunar. Girdi verisi doğrusal olarak ayrılabildiğinde; verileri ayırabilecek sonsuz sayıdaki doğru içerisinden marjini en yüksek yapacak olan doğru seçimi yapmaya çalışılır. Eğer bütün verileri eksiksiz şekilde iki farklı sınıfa ayıran bir marjin elde edilebildiyse bunun adı Hard Marjin aksi takdirde Soft Marjin’dir. Girdi verileri doğrusal olarak ayrılamadığında ise orijinal çalışma verisini yüksek boyuta dönüştürmek için doğrusal olmayan haritalama kullanılır. Verinin taşındığı yeni boyutta marjini en büyük ayrıcı düzlem bulunmaya çalışılır.

Algoritmanın destek vektör makinesi adını almasının sebebi şudur. Karar yüzeyi adını verdiğimiz iki sınıfı birbirinden ayıran düzlemin iki tarafında farklı sınıflara ait veriler bulunur. Bu veriler üzerinden geçen vektörlere destek vektörleri, destek vektörlerini ayıran çizgi veya düzleme de destek vektör makineleri adı verilir.

Destek vektör makinesi için karar sınırı veya destek vektör makinesi wx+b=0 denklemi ile ifade edilebilir. Bu durumda destek vektörleri; wx+b=+1 ve wx+b=-1 olacaktır. Burada destek vektörleri arasındaki marjin genişliği 2/|w| olarak elde edilir. Destek vektör makineleri için birçok seçenek olmasına rağmen maksat marjinin maksimize edilmesi diğer ifadeyle w değerini minimize ve 2/|w| değerini maksimize etmedir.

1.2.5.  Naïve Bayes algoritması

Makine öğrenmesi algoritmaları arasında olasılığa dayalı modeller kullanmak istediğimizde karşımıza naive bayes algoritması çıkar. Naive bayes algoritması bayes teoremine dayanır. Algoritma bir model öğrenmek yerine eğitim verileri yardımıyla olasılıklar öğrenir. Bu yönüyle k en yakın komşu algoritması gibi tembel öğrenici kategorisine girmektedi. Önemli özelliklerinden birisi ise diğer birçok algoritmasının aksine balans olmamış (dengesiz) veri kümelerinde de başarılı sonuçlar verebilmektedir.

Algoritmanın temel fikri sınıflandırılacak bir kaydın bütün sınıflar için olasılığının hesap edilmesi ve en yüksek olasılığı veren sıfına kaydın atanmasıdır. Algoritmanın en sorunlu olduğu durum test verileri içerisinde daha önce hiç meydana gelmemiş bir durum olduğunda meydana gelir. Sıfır frekans sorunu olarak da bilinen bu durumda test sınıfı için bayes değeri sıfır olarak hesap edilir ve atama gerçekleşmez.

Bugüne kadar başta istenmeyen postaların ayıklanması olmak üzere birçok problemde başarıyla kullanılmıştır. Az miktarda veriyle bile iyi sonuçlar verdiği de bilinmektedir. Bayes algoritmasının performansı yüksektir ve bunun nedeni sınıflandırma işlemlerinde yapılan işlemlerin karmaşıklık derecesinin düşük olmasıdır.

1.2.6.  K en yakın komşu algoritması

Öncelikle k-NN algoritmasının ana felsefesi nedir kısmından başlamak gerekirse; k-NN (k en yakın komşu algoritması - k-nearest neighbor algorithm) bir nesnenin sınıfını o nesnenin en yakınındaki k nesneye bakarak tespit eden bir makine öğrenmesi algoritmasıdır. Peki bu yakınlık nasıl ifade ediliyor? Yakınlık geometrik bir yöntem olan öklidyen uzaklığı (euclidian distance) ile ifade ediliyor. Uzaklık ile yakınlık madem birbirinin tersidir o zaman en yakını bulmak için uzaklık değeri en düşük olan elemanlara bakacağız. En yakındaki k adet komşu bulunduktan sonra ise bulunan k tane komşunun sınıfına bakılır. Sınıf sayma yaparak komşular en çok hangi sınıftan ise test elemanın sınıfı da odur diyeceğiz.

k-NN algoritması diğer makine öğrenme algoritmalarından farklı olarak eğitim ve test aşamalarından oluşmaz. Bu durum naïve bayes algoritması için de geçerlidir. Yani bu algoritmada model inşa etme veya model öğrenme yoktur. O nedenle tembel öğrenici (lazy learner) olarak bilinir. Her seferinde yeniden ve doğrudan veri ile çalışıyor bu algoritmamız. Konunun anlaşılabilmesi için C dilinde örnek bir kodlama verilecektir. Kodlama anlaşılabilir olsun diye de adımlar şeklinde ele alınmıştır.

Adım 1. Kullanacağımız kütüphaneleri ekleriz

Uygulamamız C ile yazılacağı için #include bildirimi ile kütüphane ekleme yapacağız.

#include<stdio.h>

#include<conio.h>

#include<string.h>

#include<stdlib.h>

#include<math.h>

<stdio.h> kütüphanesi standart kütüphane olup printf(“mesaj”) gibi ifadeleri kullanabilmek için eklenmiştir.

<conio.h> klavyeden karakter değer alma, ekranı bekletme gibi fonksiyonları vardır. Sonuçları görene kadar ekran bekletme için kullanılmıştır.

<string.h> metinsel işlemler yapabilmek için eklenmiştir.

<stdlib.h> ve <math.h> ise matematiksel işlemler gibi diğer işlemler için eklenmiştir.  

Adım 2. Bildirimleri ve değişken tanımlarını yaparız.

struct trainData

{

     int k;

     float SL;

     float SW;

     float PL;

     float PW;

     char label[15];

     float sim;

};

struct trainData egitim[150];

struct trainData test;

trainData isimli structure yardımıyla kullanacağımız veri setinin (iris data) yapısı tanımlanır. Veri setinde yer alan satırlar aynı türde veriler içermediği için dizi yerine struct yapısı tercih edilmiştir. Tanımlanan tipten türetilmiş eğitim[] isimli struct dizisi elimizdeki 150 adet veriyi, test isimli struct yapısı ise sınıfını bulacağımız veriyi temsil etmek üzere tanımlanmıştır. 

long double fark(float, float);

long double kare(float);

float similarity(struct trainData, struct trainData);

fark, kare, similarity gibi fonksiyonlar euclidian distance için kullanılacaktır.

FILE *oku;

FILE türünde tanımlanan oku isimli işaretçi ise dosyamız için mantıksal bir karşılık sağlayacaktır. İşlemler fiziksel dosya ile değil onun mantıksal sunumu olan oku üzerinden yapılacaktır.

Ayrıca;

int i,k,c,z;

// indis ve geri dönüş değerleri için tanımlanmıştır.

float attr[150][5];

// 4 tanesi özellik değerleri 1 tanesi sınıf olmak üzere

char str[15];

// dosyadan verileri parça parça okumak için

gibi değişken tanımlama ifadeleri yardımıyla da ihtiyaç duyulan diğer değişkenler tanımlanmıştır.

Adım 3. Dosya okuma ve diziye veri aktarmalarını yaparız.

oku=fopen("iris.txt","r");

if (oku!=NULL)

     {

     k=0;

     do

     {

              egitim[k].k=k;

              c=fscanf(oku,"%s",str);printf("%s\t",str);      

              egitim[k].SL=atof(str);

              c=fscanf(oku,"%s",str);printf("%s\t",str);      

              egitim[k].SW=atof(str);

              c=fscanf(oku,"%s",str);printf("%s\t",str);     

              egitim[k].PL=atof(str);

              c=fscanf(oku,"%s",str);printf("%s\t",str);      

              egitim[k].PW=atof(str);

              c=fscanf(oku,"%s",str);printf("%s\t",str);      

              strcpy(egitim[k].label,str);               

              printf("\n");

              k++;

     }

     while (c!=EOF);

}

Atama esnasında egitim[k].k=k; yardımıyla aslında her bir kayıt için kayıt sıra numarası atanmıştır. Bu numaralar daha sonra en yakın komşuların belirlenmesinde kullanılacaktır.

Sınıf etiketi haricinde kalan diğer string değerlerin hepsi float türüne çevrilmiştir. Bu çevirme işlemi atof() isimli fonksiyon yardımıyla yerine getirilmiştir.

Ayrıca bir dosyayı baştan sona okumak için kurulması gereken döngü yapısı do {…} while (c!=EOF) olup, buradaki EOF (end of file) dosya sonu anlamındadır. Yani dosya okuma dosya sonuna gelene kadar yapılmaktadır.

Adım 4. Test verisi girilir ve diğer elemanlarla yakınlıkları ölçülür.

 test.SL=5.0;

test.SW=3.4;

test.PL=1.6;

test.PW=0.4;

strcpy(test.label, "Iris-setosa");

test.sim=0.0;

for(i=0;i<150;i++)

     {   

     egitim[i].sim=similarity(egitim[i],test);

     printf("\n %dth eleman ile test elemanı arasindaki distance=%Lf", i+1, egitim[i].sim);

     }

Adım 5. En yakın komşuları elde edebilmek için kayıtlar sıralanır.

struct trainData temp;

for(i=0;i<149;i++)

     for(int j=i+1;j<150;j++)

     if (egitim[i].sim>egitim[j].sim)

     {

         temp=egitim[i];

         egitim[i]=egitim[j];

         egitim[j]=temp;

     }

Swap işlemlerinde kullanılan temp değişkeni de doğal olarak struct türünde tanımlanmıştır.

Adım 6. En yakın komşularının sayılması ve sınıf tespiti

int setosa=0, virginica=0, versicolor=0;

k=5;

for(i=0;i<k;i++)

{

printf("\n Sira =%d ve Sinif =%s", egitim[i].k, egitim[i].label);

if (!strcmp(egitim[i].label,"Iris-setosa")) setosa++;

if (!strcmp(egitim[i].label,"Iris-versicolor")) versicolor++;

if (!strcmp(egitim[i].label,"Iris-virginica")) virginica++;

}

if ((setosa>versicolor) && (setosa>virginica)) printf("\n TEST ELEMANININ SINIFI IRIS-SETOSA");

if ((versicolor>setosa) && (versicolor>virginica)) printf("\n TEST ELEMANININ SINIFI IRIS-VERSICOLOR");

if ((virginica>versicolor) && (virginica>setosa)) printf("\n TEST ELEMANININ SINIFI IRIS-VIRGINICA");

Örneğimizde komşu sayısı olarak k değeri 5 seçilmiştir. En yakın 5 komşu için sayma yapılmış ve kazanan ilan edilmiştir.

Uygulamamızda kullanılan fonksiyonlar da şöyledir:

long double fark(float A, float B)

{

      return A-B;

}

long double kare(float A)

{

      return A*A;

}

float similarity(struct trainData X, struct trainData Y)

{

      float fark1=X.SL-Y.SL;

      float fark2=X.SW-Y.SW;

      float fark3=X.PL-Y.PL;

      float fark4=X.PW-Y.PW;

     return sqrt(fark1*fark1+fark2*fark2+fark3*fark3+fark4*fark4);  

}

K en yakın komşu algoritması önemli bir algoritma olduğu için kodlarıyla birlikte sunulmuştur.

1.2.7.  Centroid algoritması

Centroid sınıflayıcı algoritması; hızlı ve oldukça başarılı doğru tanıma sonuçları veren bir makine öğrenmesi algoritmasıdır. Diğer sınıflandırma algoritmalarında olduğu gibi centroid sınıflayıcı algoritmasında da temel iki adım eğitim ve test olup eğitim aşamasında eğitim (train) verilerinden model inşa edilir test aşamasında ise test verileri sınıflandırılarak sınıflayıcının başarısı ortaya konur. Model inşası sırasında her bir sınıf için adına Centroid denen vektörler elde edilir. Test aşamasında ise Cosine benzerlik kullanılarak sınıflandırma sonuçları elde edilir. 

Ben bu yazımda centroid sınıflayıcı için her iki aşamaya ait C kodlarını paylaşacak ve Meme Kanseri verilerinin nasıl sınıflandırılacağını kod üzerinden anlatacağım. 

MODEL EĞİTİMİ

#include<stdio.h>

#include<conio.h>

#include<string.h>

#include<stdlib.h>

#define featureSetSize 9

#define instanceSize 701

#define classSize 2

#define classOrder 10

FILE *oku,*yaz;

int main()

{

int i,k,c,z, goodSize=0, badSize=0, attr[instanceSize][featureSetSize+2];

float centroid[classSize][featureSetSize]; 

int toplam[classSize][featureSetSize]; 

char str[featureSetSize+2][8];

for(z=1;z<featureSetSize+1;z++)

{

  toplam[0][z]=0.0;

  toplam[1][z]=0.0; 

}

oku=fopen("wisconsin-train.txt","r");

yaz=fopen("wisconsin-model.txt","w");

if (oku!=NULL) 

{

k=0;

do

{

for(i=0;i<featureSetSize+2;i++) 

   {

   c=fscanf(oku,"%s",str[i]);

   if (c==EOF) break; 

   attr[k][i]=atoi(str[i]);

   printf("%s\t",str[i]);

   }

  if (strcmp(str[classOrder],"good")==0) 

   {

    goodSize++;

    for(z=1;z<featureSetSize+1;z++)

    toplam[1][z]=toplam[1][z]+attr[k][z];

   }

  else

   {

   badSize++;

   for(z=1;z<featureSetSize+1;z++)

   toplam[0][z]=toplam[0][z]+attr[k][z];

   }

   printf("\n");

   k++;

 }

 while (c!=EOF);

 for(z=1;z<10;z++)

 fprintf(yaz,"%f\t",toplam[1][z]*1.0/goodSize);

 fprintf(yaz,"\n");

 for(z=1;z<10;z++)

 fprintf(yaz,"%f\t",toplam[0][z]*1.0/badSize);

 } 

 else printf("DOSYA ACILMADI!!!");

fclose(oku);

fclose(yaz);

getch();

return 0;

}

Yukarıda verilen kod parçasından görüleceği üzere; meme kanseri verileri "wisconsin-train.txt" dosyasından alınmakta ve elde edilen veriler "wisconsin-model.txt" isimli dosyaya yazılmaktadır. Peki wisconsin-model dosyasındaki veriler alınarak sınıflandırma nasıl yapılmaktadır. 

MODEL TEST veya SINIFLANDIRMA

#include<stdio.h>

#include<conio.h>

#include<string.h>

#include<stdlib.h>

#include<math.h>

#define featureSetSize 9

#define instanceSize 701

#define classSize 2

#define classOrder 10

float vektor_boyu(float [], int);

float vektor_carpimi(float [], float [], int);

FILE *oku,*yaz;

int main()

{

float testData[featureSetSize]={4,5,6,4,5,6,3,1,3};

int i,k,c,z, goodSize=0, badSize=0, attr[instanceSize][featureSetSize];

float centroid_good[featureSetSize],centroid_bad[featureSetSize];

float centroid_boyu=0.0, kayit_boyu=0.0;

float centroid[classSize][featureSetSize]; 

int toplam[classSize][featureSetSize]; 

char str[featureSetSize+2][8];

oku=fopen("wisconsin-model.txt","r");

if (oku!=NULL) 

{

k=0;

do

{

 for(i=0;i<featureSetSize;i++) 

  {

  c=fscanf(oku,"%s\t",str[i]);

  if (c==EOF) break; 

  attr[k][i]=atoi(str[i]);

  printf("%s\t",str[i]);

  if (k==0) centroid_good[i]=attr[k][i];

  else centroid_bad[i]=attr[k][i];

  }  

  printf("\n");

  k++;

}

while (c!=EOF);

} 

else printf("DOSYA ACILMADI!!!");

float goodScore=vektor_carpimi(centroid_good, testData, featureSetSize)/((vektor_boyu(centroid_good, featureSetSize))*vektor_boyu(testData, featureSetSize));

float badScore=vektor_carpimi(centroid_bad, testData, featureSetSize)/((vektor_boyu(centroid_bad, featureSetSize))*vektor_boyu(testData, featureSetSize));

if (goodScore>badScore) printf("\n *** TEST VERISININ SINIFI GOOD *** ");

else printf("\n *** TEST VERISININ SINIFI BAD ***");

fclose(oku);

getch();

return 0;

}

float vektor_boyu(float dizi[], int m)

{

float sonuc=0.0;

for(int i=0;i<m;i++)

sonuc=sonuc+dizi[i]*dizi[i];

return sqrt(sonuc);

}

float vektor_carpimi(float centroid[], float test[], int m)

{

float sonuc=0.0;

for(int i=0;i<m;i++)

sonuc=sonuc+centroid[i]*test[i];

return sonuc;

}

Öncelikle bir önceki dosyada "wisconsin-model.txt" dosyasına kaydedilmiş olan model verileri burada okunmakta ve daha sonra testData ile aradaki Cosine benzerlik hesap edilerek testData ile verilen durumun hangi sınıftan olduğu tespit edilmektedir. Kod parçasında vektör boyu ve vektör çarpımı için fonksiyonlar kullanılmış olup her iki fonksiyonda Cosine benzerliği için kullanılan fonksiyonlardır. 

Yukarıda sunulan veri UCI veri deposundan elde edilmiş olup hem good sınıfı için hem de bad sınıfı için verinin %70'lik kısmı eğitim verisi olarak alınmıştır. 

1.2.8.  K-ortalama algoritması

k-ortalama algoritması denetimsiz öğrenme kuralına göre çalışan bir kümeleme algoritması türüdür. Kümeleme analizinin amaçlarına uygun olarak benzer özellikteki kayıtları aynı kümeye farklı özelliklerdeki kayıtları farklı kümelere atama görevi vardır. Hiyerarşik kümelemeden farklı olarak kayıtlar kümelerden birinde olmak zorundadır.

Algoritma adının k ortalama olmasının sebebi kayıtları k adet kümeye ayrılacak olması ve her bir kümenin orta değer ile ifade edileek olmasıdır. Algoritma mantığı basittir. Sırayla aşağıdaki adımlar uygulanır.

  1. n adet kayıt içerisinde rastgele k adet noktayı küme merkezi olarak seç
  2. küme merkezi seçilenler haricinde geri kalanları sırayla küme merkezi seçilenlerle kıyasla. Yer değiştirme olduğu müddetçe aşağıdaki işlemleri tekrarla. 
    1. her bir kaydı kendine en yakın (veya en benzer) küme merkezinin olduğu gruba ata
    2. atama sonrası elemanların ortalamasından yeni küme merkezini bul
    3. 2 numaralı adıma dön
  3. Kümeleme işlemini tamamla

k-means algoritması geliştirilmesi ve yorumlanması kolay bir algoritma olduğu için sık kullanılan algoritmalardan birisidir. K-means algoritması yardımıyla bugüne kadar yapılmış çalışmalardan bazıları şunlardır:

Müşteri bölümleme

Özellikle hedefli reklamcılık sayesinde pazarlamacılar doğru kişiler üzerinde doğru stratejiler geliştirmeye başlamıştır. Bu çalışmalarda önemli işlerden birisi müşteri bölümlemedir. Müşteri bölümleme başta demografik özellikler ve daha sonar ekonomik durum göstergeleri gibi göstergeler yardımıyla kişileri gruplara ayırmaya dayalıdır. Böylece doğru bölgelerde doğru ürünlerin pazarlanması mümkün hale gelmiştir.

Dokümanları kategorilere ayırma

Doküman tasnifi geleneksel olarak tasnif elemanlarının ve kütüphanecilerin işidir. Bununla birlikte web 2.0 gibi teknolojiler yardımıyla artık herkesin içerik geliştirdiği bir dünyada doküman sayısı artmış ve bunları insan gücüyle kategorilere ayırmak imkansız hale gelmiştir. Bu ihtiyaca karşılık olarak dokümanlar artık makineler yardımıyla tasnif edilmeye başlanmıştır. Doküman kategorizasyonu işlemi bir kümeleme işlemi olup her bir doküman terim uzayında temsil edilmekte ve daha sonra dokümanlar benzerliklerine göre gruplara ayrılmaktadır. Dokümanlar üzerinde kümeleme işleminin çalışabilmesi için yapılması gereken ön işlem ise muhakkak doküman ön işleme çalışmalarıdır. Ileriki bölümlerde detayları sunulacaktır.  

Dolandırıcılık tespiti

Kullanıcı davranışları eğer iki kümeye ayrılmak istenseydi o iki küme yasal kullanıcılar ve dolandırıcılar olurdu. Küme sayısının iki olduğu, veri özelliklerinin kullanıcı harcama verileri olduğu bir düzlemde yapılan kümeleme analizi dolandırıcılık tespiti olarak karşımıza çıkıyor. Önce her bir kullanıcının kendi profiline göre normal harcaması kayıt ediliyor. Daha sonra da profilden belirgin şekilde sapma gösterenler şüpheli durum olarak etiketleniyor. Bazen hatalı alarmlar alınsa bile çoğu zaman dolandırıcılığın yakalanması bu sayede münkün olabiliyor. 

Suç analizi

Suç analizi de yine kümeleme algoritmalarıyla çözülebilecek bir problemdir. Bu türden çalışmalarda sınıflandırma algoritmaları gibi denetimli öğrenme yöntemleri kullananlar da bulunmakta fakat suç gibi faaliyetler için uygun yöntem kümeleme analizidir. En önemli sebebi ise ilk kez meydana gelen suçlar ancak kümeleme analizi gibi denetimsiz tekniklerle yerine getirilebilir. 

1.2.9.  Rastgele orman algoritması

Rasgele orman algoritması da diğer birçok algoritma gibi denetimli öğrenme ilkelerine göre çalışan bir algoritmadır. Diğerlerinden bir farkı hem kategorik çıkış değeri veren sınıflandırma algoritması olarak hem de nümerik çıkış değeri veren regresyon algoritması olarak fonksiyon icra edebilmesidir.

Rasgele orman algoritması ile karar ağacı algoritması arasındaki en önemli fark kök düğümün seçimi ve bölünmelerin rasgele yapılıyor olmasıdır. Ayrıca karar ağacında karşımıza çıkabilen model overfit problem rasgele orman algoritmasında karşımıza çıkmamaktadır.   

Atıf vererek kullanılabilir. Atıf Bilgisi:

Takcı, Hidayet, "Teori ve Uygulamada Veri Madenciliği", Nobel Akademik Yayıncılık, Ankara, Aralık 2020 

 

Bu blogdaki popüler yayınlar

VERİ MADENCİLİĞİ NEDİR?

Python Temelleri