GTech Büyük Veri ve İleri Analitik  uzman ekibimizin hazırladığı Yapay Sinir Ağları yazı serimizin  önceki bölümünde model oluşturulurken sinir ağına hedef değişken verilerek öğrenme gerçekleştirilmişti. Yazı serimizin bu bölümünde ise, denetimsiz öğrenme yöntemlerinden biri olan K-Means algoritması kullanılarak sinir ağına hedefteki çıktılar verilmeden öğrenmenin gerçekleştirilmesine değineceğiz.

Python Kütüphaneleri ve K-Means Algoritmasının Kullanımı

K-means algoritması; denetimsiz öğrenmede kullanılan kümeleme yöntemlerinden biridir. Denetimsiz öğrenme verilerin sınıflandırılması veya kümelenmesini sağlamaktadır. Bunu denetimsiz öğrenmenin önemli özelliği olan çıktı bilgilerine ihtiyaç duymadan yapmaktadır.

Kümeleme, verilerin özellikleri incelenerek birbirine benzeyenlerin bir araya toplanmasıdır. K-means algoritmasının kullanım amacıda, verilerin en doğru şekilde kümelenmesiyle doğru sonuca veya tahminlere ulaşmaktır. Kullanıcı tarafından veya bu çalışmada da ele alınan farklı yardımcı metodlar ile k adet küme merkezi belirlenir. Kullanılacak veri setindeki her bir veri kendisine en yakın merkez noktasına yani kümeye atanır.  Bu işlemi merkez noktaları arasındaki uzaklığı hesaplayarak yapmaktadır. Buradaki uzaklık hesaplaması için bir çok farklı yöntem mevcuttur. Son olarak her bir kümenin ortalaması alınıp, verilerin merkeze uzaklıkları yeni küme merkezlerinin oluşturulması için incelenir. Tüm bu işlemler küme merkezi sabit kalana kadar yapılmaktadır.

Çalışmada kullanılan veriler bir önceki yazıda ele alınan veri seti olup, detaylarına YAPAY SİNİR AĞLARI VE UYGULAMALARI-2 yazısından erişebilirsiniz.

K-means modelinin oluşturulması, adım adım ele alınmıştır:

1. Veri Setini Okuma İşlemi

Bir önceki yazıda olduğu gibi veriler Python kütüphanesi olan Numpy’ ın loadtxt fonksiyonu ile okunmuştur. Veriler input ve target olarak ikiye ayrılarak, modelde kullanılacak veri setinden diyabetli/diyabetsiz verilerinin bulunduğu kolon çıkarılmıştır.

import numpy as np

dataset_input  = np.loadtxt(‘pima-indians-diabetes.csv’, delimiter=‘,’, usecols=range(8), dtype=np.float32)

dataset_target = np.loadtxt(‘pima-indians-diabetes.csv’, delimiter=‘,’, usecols=[8],

 dtype=np.object)

 

2. Normalizasyon İşlemi

 

Bu adımda veri tutarlılığını artırmak için normalizasyon işlemi gerçekleştirilmiştir. Verilerin normal dağılıma yakın olması algoritmaların verimliliğini artırmakta ve makine öğreniminde algoritmalar için verilerin daha anlaşılır olabilmesini sağlamaktadır.

Çalışmada normalizasyon için normal dağılımı esas alan Feature Scalling (Özellik Ölçeklendirme) kullanılmıştır. Her bir değerin ortalamadan olan uzaklığının standard sapmaya oranı ile bulunmaktadır.

Pyhton’ın Sklearn kütüphanesi kullanılarak, Feature Scalling’in MinMax Scalling algoritması kullanılmıştır. Genel bir normalizasyon türü olan bu fonskiyon 0-1 aralığında değerler almaktadır.

 

from sklearn import preprocessing

mm_scaler = preprocessing.MinMaxScaler()

data_norm = mm_scaler.fit_transform(dataset_input)

print(‘data_norm :’, data_norm)

print(data_norm.shape)

 

3. Küme Sayısının Belirlenmesi

Normalizasyon işleminden sonra K-Means yönteminde öncellikle verilerin kaç kümeye ayrılabileceğini gözlemlemek gerekmektedir. Bunun için temelde Elbow (Dirsek) veya Silhouette kümeleme yöntemleri kullanılmaktadır.

Çalışmanın bu adımında Elbow yöntemi kullanılmıştır. Elbow yöntemi, her bir noktanın ağırlık merkezine uzaklıklığının karesinin toplamının hesaplanmasıdır (intertia).

Bu değerlere göre en uygun K değeri için grafik çizilir. Grafik, eğimin azaldığı veya bir başka deyişle değişim miktarının azaldığı yer olan dirsek noktasını göstererek en uygun K değeri veya değerleri vermektedir.

 

from sklearn.cluster import KMeans

total_inertias = [KMeans(n_clusters=i).fit(data_norm).inertia_ for i in range(1, 10)]

 

import matplotlib.pyplot as plt

plt.title(‘Elbow Graph’)

plt.xlabel(‘Number of Clusters’)

plt.ylabel(‘Total Inertias’)

plt.plot(range(1, 10), total_inertias, c=‘red’)

 

Grafikten de anlaşılacağı üzere kırılım noktası veya bir başka deyişle dirsek noktası 2’yi göstermektedir. Diyabetli ve diyabetsiz verilerden oluşan veri setinin aslında bu çalışma için güçlü bir kümeleme sayısına denk geldiği görülmektedir.

 

4.  K-Means Modelleme İşlemleri

 Bu adım da Elbow yöntemi ile bulunan k değeri, modele verilmiştir. K-means kümeleme işlemi, Scikit-learn kütüphanesinin sklearn.cluster modülü kullanılarak yapılmıştır.

  • Algoritmanının n_cluster parametresi, kullanılacak k değerinin belirtmektedir.
  • fit () metodu ise algoritmayı çalıştıran metottur. Parametre olarak veri setini alır ve işledikten sonra K-Means’ e geri göndermektedir.
  • Hangi verinin veya noktanın hangi kümeye ait olduğunu labels_ ile görmek mümkündür. Küme numarasını 0’ dan başlatarak, her verinin atandığı kümeyi göstermektedir.

 

from sklearn.cluster import KMeans

import random

random.seed()

 

km = KMeans(n_clusters=2)

km.fit(data_norm)

print(km.labels_)

 

data_first_group = data_norm[km.labels_ == 0]

print(‘Birinci Grup Veri Sayısı’, data_first_group.shape)

print(‘Birinci Grup:’, data_first_group)

 

data_second_group = data_norm[km.labels_ == 1]

print(‘İkinci Grup Veri Sayısı’, data_second_group.shape)

print(‘İkinci Grup:’, data_second_group)

 

  • Aşağıdaki komutlar ile de grafik üzerinden verilerin dağılımı görülebilmektedir.

plt.title(‘Clustered Points’)

plt.scatter(data_norm[km.labels_== 0, 0], data_norm[km.labels_ == 0, 1], c=‘black’)

plt.scatter(data_norm[km.labels_ == 1, 0], data_norm[km.labels_ == 1, 1], c=‘blue’)

plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], c=‘red’)

 

Modelin görmediği verilerin hangi kümeye denk geleceğini test etmek için predict edilebilmektedir. Bunun için gerekli olacak bilgileri bir önceki yazıda bulabilirsiniz.

İlk adımda ayrılan data_target verisi kullanılarak K-means ile elde ettiğimiz sonuçların başarısını test edebiliriz. Bunun için aşağıdaki adımlar yapılmıştır;

 

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

dataset_y = le.fit_transform(dataset_y)

total = np.sum(dataset_y == km.labels_)

result_success_rate = total / len(dataset_y)

print(‘result_success_rate:’, result_success_rate)

 

Çalışmada ele alınan K-Means algoritması en popüler kümeleme algoritmasıdır. Büyük veri ve karmaşık veri setlerinin yapısı hakkında fikir vermesiyle yapılan işi kolaylaştırması ve hızlandırması konusunda önem taşımaktadır. Pima-Indians-Diabetes veri seti kullanılarak, bu yazı serisinde şu ana kadar iki farklı yöntem ile modeller oluşturuldu. Denetimsiz öğrenme yöntemlerinden K-means’i kullanılarak başarı oranı %66 bulunmuştur. Bir önceki yazımızda denetimli öğrenme ile başarılar bu oranın üzerine çıkarak, %70 – %80 civarlarında olduğunu göreceksiniz. Sizde kullanmak istediğiniz veri setini bu yöntemler ile başarılarını karşılaştırıp, işinizi daha kaliteli hale getirebilirsiniz. Konu hakkında merak ettikleriniz ve soruların için GTech Büyük Veri ve İleri Analitik uzman ekibine ulaşabilirsiniz.

 

Kaynakça

https://spotle.ai/feeddetails/k-Means-Clustering-in-Python/3660

https://devhunteryz.wordpress.com/2018/03/01/denetimsiz-ogrenme-yontemleri/

https://towardsdatascience.com/machine-learning-algorithms-part-9-k-means-example-in-python-f2ad05ed5203