DBSCAN 이란?
DBSCAN (Density-Based Spatial Clustering of Applications with Noise)
DBSCAN은 밀도 기반 군집화 알고리즘으로,
데이터의 밀도(density)에 따라 클러스터를 형성하며, 이상치(outlier)를 효과적으로 처리할 수 있는 비지도 학습 알고리즘입니다.
- 밀도가 높은 영역을 군집으로 간주하고, 밀도가 낮은 영역은 노이즈로 처리
핵심 개념
DBSCAN은 다음의 두 가지 주요 개념을 기반으로 작동합니다:
- ε-이웃 (Epsilon Neighborhood, ):
- 특정 데이터 포인트를 중심으로 반경 ε 내에 포함된 다른 데이터 포인트들을 말합니다.
- 밀도 기준 (Density Criterion):
- 포인트는 밀도를 기준으로 세 가지로 분류됩니다:
- 코어 포인트(Core Point): 반경 ε 내에 최소 이상의 이웃을 가진 포인트.
- 경계 포인트(Border Point): 코어 포인트의 -이웃에 속하지만, 자체적으로 코어 포인트가 아닌 포인트.
- 노이즈 포인트(Noise Point): 어떤 클러스터에도 속하지 않는 포인트.
- 포인트는 밀도를 기준으로 세 가지로 분류됩니다:
작동 원리
- 초기화:
데이터셋에서 방문하지 않은 포인트를 선택합니다. - 밀도 기반 확장:
- 선택한 포인트가 코어 포인트이면, 반경 내의 포인트를 클러스터로 확장합니다.
- 이 과정을 모든 코어 포인트와 경계 포인트가 클러스터에 포함될 때까지 반복합니다.
- 노이즈 처리:
- 어떤 클러스터에도 속하지 않는 포인트는 노이즈로 간주됩니다.
- 종료:
- 모든 데이터 포인트를 방문하고 클러스터를 생성하면 알고리즘이 종료됩니다.
하이퍼파라미터
- ε (반경):
- 데이터 포인트를 연결하는 기준 거리.
- 데이터의 스케일에 따라 적절히 조정되어야 함.
- (최소 포인트 수):
- 코어 포인트로 간주하기 위한 최소 이웃 개수.
- 일반적으로 데이터의 차원 d에 대해 로 설정.
장점
- 이상치 감지 가능: 노이즈 포인트를 별도로 구분하여 이상치를 처리할 수 있습니다.
- 클러스터 형태 제약 없음: 구형 클러스터뿐만 아니라 임의의 형태를 가진 클러스터도 잘 탐지합니다.
- 군집 개수 자동 결정: 클러스터 개수를 사전에 지정할 필요가 없습니다.
단점
- 하이퍼파라미터 민감성: 과 값에 따라 결과가 크게 달라질 수 있습니다.
- 고차원 데이터 처리 어려움: 차원이 높아지면 거리 계산의 정확도가 떨어질 수 있습니다(차원의 저주).
- 밀도가 다른 클러스터 탐지 한계: 밀도가 크게 다른 클러스터는 잘 탐지하지 못할 수 있습니다.
예시
- 데이터 로드
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import AgglomerativeClustering
import scipy.cluster.hierarchy as sch
# 데이터셋 불러오기
df = pd.read_csv('Mall_Customers.csv')
# 데이터 확인
print(df.head())
# 필요한 열만 선택
X = df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']]
# 데이터 정규화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
- DBSCAN 수행
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import seaborn as sns
# DBSCAN 모델 생성
dbscan = DBSCAN(eps=5, min_samples=5)
# 모델 학습 및 예측
df['Cluster'] = dbscan.fit_predict(X)
# 군집화 결과 시각화
plt.figure(figsize=(10, 7))
sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', hue='Cluster', data=df, palette='viridis')
plt.title('DBSCAN Clustering of Mall Customers')
plt.show()
- 파라미터 튜닝
# 다양한 eps와 min_samples 값 시도
eps_values = [3, 5, 7, 10]
min_samples_values = [3, 5, 7, 10]
for eps in eps_values:
for min_samples in min_samples_values:
dbscan = DBSCAN(eps=eps, min_samples=min_samples)
df['Cluster'] = dbscan.fit_predict(X)
plt.figure(figsize=(10, 7))
sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', hue='Cluster', data=df, palette='viridis')
plt.title(f'DBSCAN Clustering (eps={eps}, min_samples={min_samples})')
plt.show()
'AI > ML' 카테고리의 다른 글
[ML] 비지도학습 - 차원축소 (t-SNE) (0) | 2024.12.29 |
---|---|
[ML] 비지도학습 - 차원축소 (PCA) (0) | 2024.12.29 |
[ML] 비지도학습 - 군집화모델 (계층적 군집화) (0) | 2024.12.29 |
[ML] 비지도학습 - 군집화모델 (K-means Clustering) (0) | 2024.12.29 |
[ML] 지도학습 - 분류모델 (의사결정나무) (2) | 2024.12.29 |