Garfield
YZF Admin
DBSCAN, verileri önceden kaç küme olduğunu belirtmeden yoğunluklarına göre gruplar. scikit-learn içindeki
Ardından şu kodu bir Python dosyasında veya Jupyter Notebook hücresinde çalıştırın:
Bu örnekte beklenen çıktı, veri yapısına ve seçilen parametrelere bağlı olarak iki küme ve bazı gürültü noktalarıdır. Etiket numaraları sabit bir anlam taşımaz; örneğin
Bir sınır noktası kendi komşuluğunda yeterli sayıya ulaşmasa da bir çekirdek noktanın
Bu ayarlar birbirinden bağımsız yorumlanmamalıdır. Örneğin
Bu çıktı yalnızca ilk eleme için kullanılmalıdır. Daha fazla küme veya daha az gürültü otomatik olarak daha iyi sonuç anlamına gelmez. Örneğin iki gerçek grubu birleştiren yüksek bir
Tüm noktalar tek bir kümeye atanıyorsa
DBSCAN, küme sayısını önceden istemez ve düzensiz biçimli kümeleri yakalayabilir. Buna karşılık farklı kümelerin yoğunlukları çok farklıysa tek bir
DBSCAN sınıfını kullanarak veriyi ölçeklendirin, eps ve min_samples değerlerini belirleyin, modeli çalıştırın ve labels_ çıktısını yorumlayın. -1 etiketi, hiçbir kümeye atanamayan gürültü noktalarını gösterir.Çalışan en küçük örnek
Aşağıdaki varsayımsal örnekte iki boyutlu noktalar kümelenir.scikit-learn ve matplotlib kurulu değilse önce Python ortamınızda gerekli paketleri yükleyin:
Python:
pip install scikit-learn matplotlib
Ardından şu kodu bir Python dosyasında veya Jupyter Notebook hücresinde çalıştırın:
Python:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
# Varsayımsal iki boyutlu veri
X = np.array([
[1.0, 1.1], [1.2, 0.9], [0.8, 1.0], [1.1, 1.3],
[8.0, 8.1], [8.2, 7.9], [7.8, 8.0], [8.1, 8.3],
[4.5, 4.5]
])
# Özellikleri benzer ölçeğe getir
X_scaled = StandardScaler().fit_transform(X)
# Modeli oluştur ve çalıştır
model = DBSCAN(eps=0.7, min_samples=3)
labels = model.fit_predict(X_scaled)
print("Etiketler:", labels)
print("Küme sayısı:", len(set(labels)) - (1 if -1 in labels else 0))
print("Gürültü noktası sayısı:", np.sum(labels == -1))
# Sonucu görselleştir
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="viridis")
plt.xlabel("Özellik 1")
plt.ylabel("Özellik 2")
plt.title("DBSCAN kümeleri")
plt.show()
Bu örnekte beklenen çıktı, veri yapısına ve seçilen parametrelere bağlı olarak iki küme ve bazı gürültü noktalarıdır. Etiket numaraları sabit bir anlam taşımaz; örneğin
0 etiketi her zaman belirli bir kümeyi ifade etmez. Gürültü etiketi -1 dışında, aynı etikete sahip noktalar aynı kümeye atanmıştır; -1 olan noktalar tek bir küme oluşturmaz.DBSCAN nasıl çalışır?
DBSCAN,eps yarıçaplı komşuluğunda kendisi dâhil en az min_samples nokta bulunan gözlemi çekirdek nokta kabul eder. Yoğunlukla bağlı çekirdek noktalar kümeleri oluşturur. Yoğun bir bölgeye bağlanamayan noktalar -1 etiketiyle gürültü olarak işaretlenir.Bir sınır noktası kendi komşuluğunda yeterli sayıya ulaşmasa da bir çekirdek noktanın
eps komşuluğunda bulunarak kümeye katılabilir. Yeterli komşu sayısı çekirdek nokta olmanın koşuludur; her küme üyesi için zorunlu değildir. Bu nedenle DBSCAN, farklı yoğunluklara sahip kümelerde veya yüksek boyutlu verilerde parametre seçimine duyarlı olabilir.Temel parametreler
Aynı veri üzerinde parametreleri değiştirerek modelin daha fazla veya daha az noktayı kümelere almasını sağlayabilirsiniz. En önemli üç ayar şunlardır:| Parametre | Ne belirler? | Değer büyürse genellikle ne olur? |
|---|---|---|
| eps | Bir noktanın komşu kabul edileceği azami uzaklık. | Daha geniş komşuluklar oluşur; kümeler birleşebilir ve daha az nokta gürültü kalabilir. |
| min_samples | Yoğun bölge için gereken asgari komşu sayısı. | Yoğunluk şartı zorlaşır; daha fazla nokta gürültü olarak işaretlenebilir. |
| metric | Noktalar arasındaki uzaklığın nasıl hesaplanacağı. | Verinin yapısına uygun başka bir uzaklık ölçüsü kullanılabilir; sonuç doğrudan değişir. |
eps değerini gereğinden fazla artırmak, aslında ayrı olan kümeleri tek kümede birleştirebilir. Çok küçük bir eps ise çoğu noktayı gürültüye dönüştürebilir. min_samples değerini artırmak daha sıkı bir yoğunluk tanımı sağlar; ancak küçük veya seyrek kümeleri kaybetmenize neden olabilir.Gerçek veride uygulanacak sıra
- Veriyi sayısal bir matrise dönüştürün. Her satır bir gözlemi, her sütun bir özelliği temsil etsin. Metin sütunlarını doğrudan
DBSCANiçine vermek yerine uygun bir kodlama yöntemi kullanın. - Özellik ölçeklerini kontrol edin. Bir sütun binlerce, başka bir sütun yalnızca onluk aralıkta değişiyorsa uzaklık hesabını büyük ölçekli sütun baskılayabilir. Bu durumda eğitim verisini
StandardScalerveya verinin yapısına uygun başka bir ölçekleyiciyle dönüştürün. - Başlangıç
min_samplesdeğerini seçin. Küçük veri kümelerinde düşük bir değerle, gürültüye dayanıklı bir çözüm istiyorsanız daha yüksek bir değerle başlayabilirsiniz. Bu değer kesin bir küme sayısı üretmez; yoğunluk eşiğini belirler. - Uygun bir
epsaralığını deneyin. Çok küçük ve çok büyük tek bir değer seçmek yerine birkaç aday değerle modeli çalıştırın. Her adayda küme sayısını, gürültü oranını ve kümelerin alan bilgisine göre anlamlı olup olmadığını karşılaştırın. - Modeli çalıştırın.
DBSCAN(eps=..., min_samples=..., metric=...)ile modeli oluşturupfit_predict(X_scaled)çağrısını kullanın. Dönen dizi, her satır için küme etiketini içerir. - Gürültü ve kümeleri ayrı değerlendirin.
labels == -1olan satırlar kümeye alınmamıştır. Bunları otomatik olarak hatalı veri kabul etmeyin; aykırı gözlem, nadir durum veya yanlış parametre seçimi olabilir. - Sonucu görsel ve alan bilgisiyle doğrulayın. İki veya üç boyutlu görselleştirme kullanabiliyorsanız kümeleri inceleyin. Yüksek boyutlu veride yalnızca görselleştirme için yapılan boyut indirgeme, modelin asıl uzaklık hesabının yerine geçmez.
Parametreleri değerlendirme örneği
Birden fazla aday değeri hızlıca karşılaştırmak için şu varsayımsal kodu kullanabilirsiniz:
Python:
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
import numpy as np
X_scaled = StandardScaler().fit_transform(X)
for eps in [0.3, 0.5, 0.7, 1.0]:
labels = DBSCAN(eps=eps, min_samples=3).fit_predict(X_scaled)
cluster_count = len(set(labels)) - (1 if -1 in labels else 0)
noise_count = int(np.sum(labels == -1))
print(
f"eps={eps}: "
f"küme={cluster_count}, "
f"gürültü={noise_count}"
)
Bu çıktı yalnızca ilk eleme için kullanılmalıdır. Daha fazla küme veya daha az gürültü otomatik olarak daha iyi sonuç anlamına gelmez. Örneğin iki gerçek grubu birleştiren yüksek bir
eps değeri, sayısal olarak daha az gürültü üretse de uygulama açısından yanlış olabilir.Sonucu doğru yorumlama
Küme etiketleri, verilerin birbirine göre yoğun bölgelerde toplandığını gösterir; tek başına bu etiketler kümelerin iş anlamını açıklamaz. Her kümenin ortalama özelliklerini, gözlem sayısını ve alan bilgisindeki karşılığını ayrıca inceleyin.-1 etiketinin bulunması modelin başarısız olduğu anlamına gelmez. DBSCAN'in güçlü yönlerinden biri, önceden belirlenmiş bir kümeye zorla atamak yerine seyrek noktaları ayırabilmesidir. Ancak noktaların çoğu -1 oluyorsa eps değerinin fazla küçük olması, min_samples değerinin fazla büyük seçilmesi, özelliklerin ölçeklenmemesi veya verinin DBSCAN'e uygun olmayan bir yapıda olması mümkündür.Tüm noktalar tek bir kümeye atanıyorsa
eps fazla büyük olabilir veya min_samples fazla düşük seçilmiş olabilir. Bu durumda daha küçük eps değerlerini denemek, min_samples değerini artırmak ve özellik ölçeklerini yeniden kontrol etmek gerekir.DBSCAN, küme sayısını önceden istemez ve düzensiz biçimli kümeleri yakalayabilir. Buna karşılık farklı kümelerin yoğunlukları çok farklıysa tek bir
eps değeri her iki kümeyi aynı anda iyi temsil etmeyebilir. Ayrıca uzaklık tabanlı olduğu için yüksek boyutlu verilerde özellik seçimi, ölçekleme ve kullanılan uzaklık metriği sonucu belirgin biçimde etkileyebilir.Sık sorulan sorular
DBSCAN'te küme sayısını ayrıca vermek gerekir mi?
Hayır. DBSCAN küme sayısını
n_clusters gibi bir parametreyle almaz; kümeleri yoğunluk bağlantılarına göre keşfeder. Bu, sonucu otomatik olarak doğru yapmaz. eps, min_samples, özellik ölçekleri ve verinin gerçek yapısı yine dikkatle değerlendirilmelidir.DBSCAN sonucu neden her çalıştırmada farklı küme numaraları gösterebilir?
Etiket numaraları yalnızca tanımlayıcıdır. scikit-learn DBSCAN aynı veri, aynı satır sırası ve aynı ayarlarla deterministik çalışır. Satır sırası değişirse küme numaraları değişebilir; birden fazla kümeye komşu sınır noktalarının ataması da değişebilir. Sonucu numaraların kendisiyle değil, gözlemlerin oluşturduğu kümelerle değerlendirin.
Son düzenleme: