Sayfalar

6 Ocak 2013 Pazar

RapidMiner'da K-Means İle Kümeleme Çalışması

Merhaba arkadaşlar!

RapidMiner ile alakalı iki yazı paylaştım ve gördüm ki konu ile ilgilenen fazlaca insan var. Bunun başlıca sebebi sanırım Türkçe kaynak sıkıntısı çekilmesi ve irili ufaklı  şirketlerin yavaş yavaş veri madenciliği çalışmalarına ağırlık vermesi olsa gerek. Bunları göz önünde bulundurarak konu ile ilgili bir konuyu daha işlemek istiyorum: Kümeleme algoritması olan K-Means'ın RapidMiner'da uygulanması.

Bunu yaparken kendi çabalarımla öğrendiğim bir iki mevzuyu daha paylaşmaya çalışacağım. Neden kendi çabalarımla diyorum çünkü sizin de gördüğünüz üzere RapidMiner'ı dolu dolu açıklayan ne bir blog ne de bir kaynak mevcut. Bunu sadece Türkçe kaynaklar için söylemiyorum. RapidMiner'ın ingilizce kaynakları var ama bu kaynaklar da bir yerden sonra yetersiz kalabiliyor.

Konuya başlayalım...
Veri madenciliği(yazının diğer kısımlarında VM diye bahsedeceğim) çalışmalarını kolaylaştırmayı amaçlayan bir yazılım olan RapidMiner bu amaçlar doğrultusunda VM çalışmaları için geliştirilen algoritmaların pek çoğuna cevap verebilmektedir. Bunlardan sınıflandırma grubundaki karar ağacı algoritmasının kullanılışına değinmiştik. VM çalışmalarının gözdesi olan bir diğer metot ise Kümeleme(Clustering) olup, sadece VM çalışmalarında değil görüntü işleme, veritabanı gibi pek çok sektörde de kendini göstermektedir. Hemen kısaca sınıflandırmayı hatırlayıp kümelemeden bahsedelim:

Sınıflandırmayı hatırlarsak;
Sınıflandırma "label" değeri olarak sınıflandırmak istediğimiz sütunu sözel olan sütunlardan belirlememiz gerekiyordu. Tabi diğer sütunların sayısal olması hesaplamaların yapılması için gerekliydi. Ayrıca sınıflandırma algoritması iki aşamadan oluşmaktaydı. Bunlardan ilki "öğrenme" yani örnek veri seti üzerinde algoritmanın çalıştırılarak bir ağacın ortaya çıkarılması. Diğeri de gelen yeni verilerin bu ağaçta hangi düğüme yerleşeceğinin tespit edilmesi aşamasıydı. Yani sınıflandırma algoritması öğrenmeye dayalı bir algoritmadır. Ayrıca bu metot veriler arasındaki ortak özelliklere göre verileri sınıflandıran bir metottur. Neden sınıflandırmanın temel özelliklerini hatırlattığımızı söylersek; sınıflandırma ve kümeleme ayrımının yapılması VM çalışmalarında çok sık kullanılan bu iki metot için çok önemlidir. Şimdi kümelemedeki temel unsurlara aşağıda değinelim ve sizler buradan aradaki farkları çıkarın.

Kümeleme Metodu
Kümeleme algoritması sayısal veriler üzerinde çalışan bir algoritmadır. Burada amaç; veri setindeki kümelerin keşfedilmesidir. Kümelerden maksat; doğal olarak birbirlerine çok benzer olan elemanları aynı kümede toplanması ve bu kümelerin birbiri ile olan mesafesinin de maksimum yapılmasıdır. Öğrenme algoritması değildir! Kümeleme algoritmasının en ilkel örneklerinden olan "K-En Yakın Komşuluğu" algoritmasında üzerinde çalışılacak verilerin sınıflarının önceden bilinmesi gerekmektedir. Yani sınıflandırmada olduğu gibi "hangi veri hangi sınıfa ait?" kısmının keşfi yapılmaz. Tek yapılan "gelen yeni veri bizim veri setimizde hangi sınıfa aittir?" sorusuna cevap aranır. Algoritmanın adındaki K değeri, bize verilen veri setindeki verilerle, elimizdeki sınıfı belli olmayan yeni gelen verinin karşılaştırılacağı komşu sayısıdır. K-Means algoritması da temel bir yaklaşımı ele aldığı için bunu burada anlatmayı uygun gördüm.

K-En Yakın Komşuluğu algoritmasında verilerin uzaklıkları Öklid Bağıntısı yararlanılarak hesaplanır. Hesaplamalar gelen verinin sayısal değerleri ile tablodaki tüm veriler arasında yapılmalı ve ardından bulunan değerlerden en küçük olanlardan K tanesi seçilmelidir. Seçilen bu verilerin hangi sınıfa ait olduğuna bakılarak yeni veri de o sınıfa dahil edilmelidir. Bununla ilgili aşağıdaki örnek tablo üzerinde bir uygulama yaparak hem kümelemeyi ve K-En Yakın Komşuluğu algoritmasını anlayalım, hem de K-Means için temel oluşturmuş olalım. Aşağıdaki tablo bize önceden bilinen gözlem değerlerini içeren ve bu değerlerin hangi sınıfa ait olduğunu gösteren basit bir veri setini ifade etmektedir:
Şimdi yeni gelen değerin A=8, B=4 öznitelik değerlerine sahip olduğunu düşünelim. Ayrıca K değeri de 4 olarak verilsin. Tablodaki A, B sütunlarındaki sayısal değerlerle gelen verideki A, B değerleri arasında öklid bağıntısını uygulayalım:
Bütün hesaplamalar yapıldıktan sonra tabloya bu verileri ekleyelim:
Sonuçta bulunan tablo değerlerin en küçüğünün 1 ile numaralandırılması ile eklenen Küçük Değer sütununun da eklenmesi ile yukarıdaki gibi olur. K değeri 4 verildiği için bulunan değerlerden en küçük 4 tanesi alınır. Gözlem değerlerinin verildiği ilk tabloda verilerin hangi sınıflara ait olduğuna bakarsak; sırasıyla Pozitif, Negatif, Negatif, Negatif olduğu görülür. En basit mantıkla 3 negatif, 1 pozitif olmasından dolayı gelen A=8, B=4 verisinin negatif sınıfına ait olacağı anlaşılır. 

Yukarıdaki basit örnek aslında kümeleme mantığını pek çok yönden yansıtmış oldu. Biraz da K-Means algoritmasına ve RapidMiner'da bu operatörün ne olduğuna bakalım:

K-Means ve RapidMiner Operatörü
Bu algoritmada da yine K yani küme sayısı bilinmek zorundadır. K değerinin ne olacağına gözlemci kümelerin doğal oluşumuna bakarak karar verir ki eğer hatalı karar verirse sonuçlar da buna göre şekillenir. Aşamalandırırsak;

  • K belirlenir
  • Veriler üzerinden rastgele olarak küme merkezlerinin keşfi için K adet veri küme merkezi olarak seçilir
  • Diğer veriler ile seçilen rastgele küme merkezleri arasındaki mesafeler bulunur
  • Küme merkezlerine olan en yakın uzaklıktaki veriler saptanır ve aynı kümeye alınır
  • Oluşan kümelerin yeni merkezi (orta noktası) hesaplanır
  • Orta noktalar sabitleninceye kadar bu işlem sürer
Mantık genel olarak bu yapıyı içermekte. Daha fazla ayrıntıya inersek konu amacından sapacak gibi :) 
RapidMiner'da kümeleme operatörleri Modeling başlığı altında Clustering and Segmentation olarak 13 adet olmak üzere toplanmıştır. Bunların çoğu da K-Means mantığı ile çalışmaktadır. Bu operatörü kullanırken K sayısını elbette bilmemiz gerekmektedir. Bunu bu operatöre ait parametreleri Parameters kısmından belirlersiniz. Max Optimization Steps ile K-Means algoritmasının bir çalışması esnasında en fazla yapılacak iterasyon sayısı belirlenir ve varsayılan olarak 100'dür. Max Runs ise adından anlaşılacağı gibi algoritmanın maksimum kaç kere döneceğidir ve varsayılan olarak 10'dur. 


Şimdi K-Means algoritmasına ait operatörü RapidMiner'da bir veri seti üzerinde uygulayalım ve sonuçları izleyelim. Burada farklı bir teknik kullanmak istiyorum. Veri setini elde ederken RapidMiner'ın bize sunduğu güzel nimetlerden olan Generate Data isimli operatörü ile veri setimizi internette arayarak vakit kaybetmek yerine kendimiz oluşturacağız. Adımları sıralıyorum:

  1. File->New ile yeni proses başlatın
  2. Operators kısmından Utility->Data Generation->Generate Data isimli opratörü ekrana sürükleyin
  3. Her ihtimale karşı (ki burada sıkıntı olacağını sanmıyorum) Data Transformation->Value Modification->Numerical Value Modification operatörünü şekildeki gibi bağlayın
  4. Modeling->Clustering and Segmentation dan K-Means operatörünü sürükleyin
  5. Evaluation->Clustering->Cluster Distance Performance operatörünü de şekildeki gibi bağlayarak işlemi tamamlayın.
Buradaki operatörlerden bahsedecek olursak; Generate Data isimli operatörün Parameters kısmından arzu ettiğiniz veri seti özelliklerini girerek (sütun sayısı, sütunların veri tipi, veri sayısı v.b.) kendinize ait veri setini kolaylıkla oluşturabilirsiniz. Hatta bu da zor geliyorsa, zaten hazır olarak RapidMiner ile sunulan pek çok örnek veri seti mevcut. Repositories menüsü altında bulunan bu içerikleri yine sürükle-bırak metodu ile kullanabilirsiniz.

Normalize ise adından da anlaşılacağı gibi veriyi normalize ederek uygulanan kümeleme algoritması için sıkıntı oluşturabilecek değerleri ortadan kaldırır. Bu yüzden Generate Data'dan oluşan veri setimizin normalize edilmesi için bu iki operatörü birbirine bağladım. Hemen ardına asıl amacımızı yansıtan K-Means operatörünü bıraktım. Ben burada K=3 aldım. Muhtemelen alakasız bir sonuç gözükecektir.Varsayılan olarak K=2 gelir. Hemen sonrasına çapraz bir şekilde (bağlantılara resmi büyütp bakın.) Performance (Clustering için) operatörünü ekleyerek çıktı üzerinde şekillendirme sağladık. Bu operatörü koymasaydık çıktı yine oluşacaktı fakat çıktıyı istediğimiz gibi göremeyecektik. Son olarak Performance operatöründeki 3 adet output bağlantısını çıktıların yansıtıldığı sağdaki bölmeyle bağlıyoruz. Nihayet RUN butonuyla sonuçları izleyebiliriz.

Anlayacağınız üzere sağ kısma 3 adet çıktı bağlantısı ekledik. Dolayısıyla çıktımız 3 sekmeden ibaret olmalıdır:

  • Cluster Model (Clustering): Bizim aradığımız çıktının kendisidir. Zira kümeleme sonuçları bu ekrandan takip edilir.Bununla ilgili grafiksel sonuçlar buradan izlenir. Hangi veri hangi kümeye dahil edilmiş sorusunun cevabı buradadır. Aşağıda grafiksel gösterime ait ekran görüntüsü vardır:

    Bu ekranı Cendroid Plot View menüsünden görürsünüz. Folder View ve Graph View veri setinin kümelere ayrılmış yapısını verir.
  • Example Set (Normalize): Çalışan algoritmanın veri setine uygulanmasıyla ilgili sonuçların tablo olarak karşınıza çıktığı kısımdır. Burada ayrıca Generate Data'nın sizin için ne tür veriler oluşturduğunu görürsünüz. Generate Data'nın oluşturmadığı sonradan eklenen; cluster sütununda verilerin hangi kümeye ait olduğunu takip edebilirsiniz. Yine ID sütununun da sonradan eklendiğini görebilirsiniz. Asıl önemli kısım ise Plot View seçeneğidir. Plot Viewden bir görüntü:

    Soldaki değerleri (x, y, renklendirme değerleri) oynayarak veri setinizin kümeleri hakkında görsel sonuçları takip edebilirsiniz. Burada veri setinin dağınık görünümünden K olayını tutturamadığımız görülüyor :)
  • Example Set (Execute Process): Bu kısım ise veri setinin orjinal halini ifade etmektedir. Data Generator'ün oluşturduğu ilk verilerdir. 
Bu kadarlık yeter diye düşünüyorum :) Umarım faydalı olur. İlgilenenlere kolay gelsin!

4 yorum:

  1. Merhaba acaba cleaning işlemi için ne yapmam gerekiyor ? Ve clustering için uygun bir data bulamıyorum , lütfen yardımcı olur musunuz ?

    YanıtlaSil
  2. Merhaba Ayşegül.

    RapidMiner'da veri temizleme için pek çok araç mevcut. Tek yapmanız gereken ekrana sürükleyip gerekli parametreleri ayarlamak. Eğer çok spesifik bir işlem yapmayacaksanız bu komponentleri kullanabilirsiniz.Bu komponentler Data Transformation sekmesinde bulunmakta. Örneğin Replace Missing Values aracını kullanarak kayıp değerler yerine değer hesaplanmasını sağlayabilirsiniz. Ayrıca aşağıdaki adresten Clustering kısmını seçerek uygun veri setleri bulabilirsiniz:
    http://archive.ics.uci.edu/ml/datasets.html
    Kolay gelsin.

    YanıtlaSil
  3. Çok teşekkür ederim , peki mail adresinizi alabilir miyim ? Yaptığım projede eksik olup olmadığından emin değilim , size mail atıp fikrinizi almak istiyorum.Tabi zamanınız varsa

    YanıtlaSil
  4. Rica ederim. Profil kısmından mail adresime ulaşabilirsiniz.

    YanıtlaSil