Makine Öğrenmesi - Kümeleme Algoritmaları

DBSCAN

Yayın tarihi :21-Oca-22
Bölüm kodlarını ve/veya veri setlerini indir.

DBSCAN (Density-based spatial clustering of applications with noise - Gürültülü uygulamaların yoğunluğa dayalı uzamsal kümelenmesi) algoritması, isminden de anlaşılacağı gibi yoğunluğa dayalı kümeleme algoritmasıdır. Kümeler, kendi içinde yoğun ve diğer kümelerle daha düşük yoğunluklu olduğu için birbirlerinden ayrılmıştır. DBSCAN algoritması da "kümeler" ve "gürültü" kavramlarına dayanmaktadır. 

 KMeans algoritması gibi küme sayısını belirtmeye gerek yoktur, küme sayısını veri setindeki değerlere göre algoritma kendisi oluşturur.

DBSCAN algoritması iki parametre kullanır:

  • eps : Bir veri noktasının etrafındaki komşuluğu tanımlar, yani iki nokta arasındaki mesafe 'eps'ye eşit veya daha düşükse, bunlar komşu olarak kabul edilir. Eps değeri çok küçük seçilirse, verilerin büyük bir kısmı aykırı değer olarak kabul edilecektir. Çok büyük seçilirse kümeler birleşecek ve veri noktalarının çoğu aynı kümelerde olacaktır.
  • MinPts : Eps yarıçapı içindeki minimum komşu sayısıdır. Veri kümesi ne kadar büyükse, MinPt'lerin daha büyük değeri seçilmelidir. MinPt'lerin minimum değeri en az 3 olmalıdır.

Kullanabilmek için "DBSCAN " algoritmasının içe aktarılması gerekmektedir.

from sklearn.cluster import DBSCAN

Söz dizimi: DBSCAN(eps=0.5, *, min_samples=5, metric='euclidean', metric_params=None, algorithm='auto', leaf_size=30, p=None, n_jobs=None)

  • eps, iki nokta arasındaki mesafeyi temsil eder. Varsayılan olarak 0.5'dir.
  • mim_samples, komşuluktaki numune saysını temsil eder. Varsayılan olarak 5'dir.
  • algorithm, noktasal mesafeleri hesaplamak ve en yakın komşuları bulmak için kullanılacak algoritmadır. 4 farklı değer alabilir: "auto", "ball_tree", "kd_tree", "brute". Varsayılan olarak "auto" dur.

Örnek-1: Cars veri seti üzerinden, sayısal olan sütunlara DBSCAN kümeleme algoritmasını uygulayalım.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")

from sklearn.cluster import DBSCAN
from sklearn.metrics import silhouette_score

Keşifsel Veri Analizi EDA

#Veri seti okunur
df=pd.read_excel("cars.xls")
df.head()

Çıktı:

#Veri setinde sayısal olan değişkenleri x olarak atayalım
x=df.select_dtypes("number")
x.head()

Çıktı:

# Veri seti hakkında bilgi 
x.info()

Çıktı:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 804 entries, 0 to 803
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Price     804 non-null    float64
 1   Mileage   804 non-null    int64  
 2   Cylinder  804 non-null    int64  
 3   Liter     804 non-null    float64
 4   Doors     804 non-null    int64  
 5   Cruise    804 non-null    int64  
 6   Sound     804 non-null    int64  
 7   Leather   804 non-null    int64  
 8   Cluster   804 non-null    int32  
dtypes: float64(2), int32(1), int64(6)
memory usage: 53.5 KB
#Veri seti açıklamaları
x.describe()

Çıktı:

Model Oluşturma İşlemleri

#DBSCAN ataması yapılır
model=DBSCAN(eps=1,min_samples=4)

#Model eğitme ve Tahminleme işlemi
predict_model=model.fit_predict(X)

#tahmin edilen kümelemenin ilk 20 değerini yazdıralım
predict_model[0:20]

Çıktı:

array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       -1, -1, -1], dtype=int64)
#Veri seti değerlerinin kümeleme sonrası kümeleme dağılım grafiği
plt.figure(figsize=(10,6))
plt.scatter(x.Price,x.Mileage,c=predict_model)
plt.title("Veri seti değerlerinin kümeleme sonrası kümeleme dağılım grafiği")
plt.colorbar()
plt.show()

Çıktı:

DBSCAN algoritması sonrasında tüm veri noktaları aynı renkte oluştu. Aslında bu doğru bir kümeleme yöntemi olmadı çünkü algoritma verileri gürültü(aykırı değer) olarak kabul etti. Bunun nedeni, DBSCAN(eps=1,min_samples=4) eps değerinin olması gerekenden çok düşük olmasıdır. Bu nedenle, veri seti için epsilon değerini bularak modeli tekrar eğitmemiz gerekiyor veya StandartScaler işlemi yaparak da bu durumu çözebiliriz. Biz eps değeri üzerinden devam edelim. Veri kümesindeki tüm veri noktaları için bir nokta ile en yakın veri noktası arasındaki mesafeye ihtiyacımız var. Bunu NearestNeighbors kütüphanesini kullanarak elde edebiliriz.

from sklearn.neighbors import NearestNeighbors

#NearestNeighbors atanır
model= NearestNeighbors(n_neighbors=2)

#Model eğitme işlemi yapılır
model_fit= neigh.fit(x)
distances, indices = model_fit.kneighbors(x)
# Mesafeler grafiği çizimi

#mesafeler küçükten büyüğe sıralanır.
distances = np.sort(distances, axis=0)
distances = distances[:,1]

plt.figure(figsize=(20,10))
plt.plot(distances)
plt.title('Mesafeler grafiği')
plt.xlabel('Mesafeye göre sıralanmış Veri Noktaları')
plt.ylabel('Epsilon')
plt.show()

Çıktı:

Epsilonun optimum değeri mesafeler grafiğindeki maksimum eğrilik nokyasıdır. Yaklaşık olarak 2200 değerini eps olarak alabiliriz.

#DBSCAN ataması yapılır
model=DBSCAN(eps=2200,min_samples=6)

#Model eğitme ve Tahminleme işlemi
predict_model=model.fit_predict(x)

#tahmin edilen kümelemenin ilk 20 değerini yazdıralım
predict_model[0:20]

Çıktı:

array([ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0, -1, -1], dtype=int64)
#Veri seti değerlerinin kümeleme sonrası kümeleme dağılım grafiği
plt.figure(figsize=(10,6))
plt.scatter(x.Price,x.Mileage,c=predict_model)
plt.title("Veri seti değerlerinin kümeleme sonrası kümeleme dağılım grafiği")
plt.colorbar()
plt.show()

Çıktı:

Veri setindeki değerleri DBSCAN kümeleme algoritması kullanılarak 5 farklı renk ile belirtilen kümeleme işlemi yapılmış oldu.

silhouette_score değerine bakılırsa;

silhouette_score(X,predict_model)

Çıktı:

0.21076406498881994
Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.