AI/ML

[ML] 비지도학습 - 군집화모델 (DBSCAN)

죵욜이 2024. 12. 29. 02:21

DBSCAN 이란?

DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

DBSCAN은 밀도 기반 군집화 알고리즘으로,

데이터의 밀도(density)에 따라 클러스터를 형성하며, 이상치(outlier)를 효과적으로 처리할 수 있는 비지도 학습 알고리즘입니다.

  • 밀도가 높은 영역을 군집으로 간주하고, 밀도가 낮은 영역은 노이즈로 처리


핵심 개념

DBSCAN은 다음의 두 가지 주요 개념을 기반으로 작동합니다:

  1. ε-이웃 (Epsilon Neighborhood, ):
    • 특정 데이터 포인트를 중심으로 반경 ε 내에 포함된 다른 데이터 포인트들을 말합니다.
  2. 밀도 기준 (Density Criterion):
    • 포인트는 밀도를 기준으로 세 가지로 분류됩니다:
      • 코어 포인트(Core Point): 반경 ε 내에 최소 이상의 이웃을 가진 포인트.
      • 경계 포인트(Border Point): 코어 포인트의 -이웃에 속하지만, 자체적으로 코어 포인트가 아닌 포인트.
      • 노이즈 포인트(Noise Point): 어떤 클러스터에도 속하지 않는 포인트.

작동 원리

  1. 초기화:
    데이터셋에서 방문하지 않은 포인트를 선택합니다.
  2. 밀도 기반 확장:
    • 선택한 포인트가 코어 포인트이면, 반경 내의 포인트를 클러스터로 확장합니다.
    • 이 과정을 모든 코어 포인트와 경계 포인트가 클러스터에 포함될 때까지 반복합니다.
  3. 노이즈 처리:
    • 어떤 클러스터에도 속하지 않는 포인트는 노이즈로 간주됩니다.
  4. 종료:
    • 모든 데이터 포인트를 방문하고 클러스터를 생성하면 알고리즘이 종료됩니다.

하이퍼파라미터

  1. ε (반경):
    • 데이터 포인트를 연결하는 기준 거리.
    • 데이터의 스케일에 따라 적절히 조정되어야 함.
  2. (최소 포인트 수):
    • 코어 포인트로 간주하기 위한 최소 이웃 개수.
    • 일반적으로 데이터의 차원 d에 대해 로 설정.

장점

  1. 이상치 감지 가능: 노이즈 포인트를 별도로 구분하여 이상치를 처리할 수 있습니다.
  2. 클러스터 형태 제약 없음: 구형 클러스터뿐만 아니라 임의의 형태를 가진 클러스터도 잘 탐지합니다.
  3. 군집 개수 자동 결정: 클러스터 개수를 사전에 지정할 필요가 없습니다.

단점

  1. 하이퍼파라미터 민감성: 값에 따라 결과가 크게 달라질 수 있습니다.
  2. 고차원 데이터 처리 어려움: 차원이 높아지면 거리 계산의 정확도가 떨어질 수 있습니다(차원의 저주).
  3. 밀도가 다른 클러스터 탐지 한계: 밀도가 크게 다른 클러스터는 잘 탐지하지 못할 수 있습니다.

예시

- 데이터 로드

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()