[빅분기 실기] DBSCAN
DBSCAN
밀도기반 클러스터링 기법
케이스가 집중되어 있는 밀도에 초점을 두어 밀도가 높은 그룹을 클러스터링 하는 방식이다.
중심점을 기준으로 특정한 반경 이내에 케이스가 n개 이상 있을 경우 하나의 군집을 형성한다.
이상값을 탐지하는 데에 많이 사용된다.
[주요 하이퍼파라미터]
- eps (ε, epsilon) : 근접 이웃점을 찾기 위해 정의 내려야 하는 반경 거리
- min_samples (minimum amount of points) : 하나의 군집을 형성하기 위해 필요한 최소 케이스 수
[데이터의 케이스(포인트)]
- Core point : ε 반경 내에 최소점(minPts) 이상을 갖는 점
- Border point : Core point 의 ε 반경 내에 있으나, 그 자체로는 최소점(minPts) 을 갖지 못하는 점
- Noise point : Core point 도 아니고 Border point 도 아닌 점
1. 분석 데이터 준비
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
iris = pd.read_csv("iris.csv")
iris_data=iris[iris.columns[0:4]]
iris_data.head()
2. 모델 적용
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.5, metric='euclidean', min_samples=5)
dbscan.fit(iris_data)
dbscan.labels_
설정한 기준에 따라 2개의 군집(0, 1) 으로 나타났다.
모델 기준에서 이상치로 파악된 것은 -1 로 표현된다.
pred=dbscan.fit_predict(iris_data)
pred=pd.DataFrame(pred)
pred.columns=['predict']
match_data = pd.concat([iris,pred],axis=1)
match_data.tail()
cross = pd.crosstab(match_data['class'],match_data['predict'])
cross
setosa 에서 1개, versicolor 에서 6개, virginica 에서 10개의 이상치가 발견되었다.
반경을 좀 더 넓히거나 단위의 표준화 과정을 통해 이상치를 줄여야 한다.
3. 시각화 (Visualization)
from sklearn.decomposition import PCA
pca = PCA(n_components=2).fit(iris_data)
pca_2d = pca.transform(iris_data)
변수가 4개이므로 4차원의 공간에 데이터가 위치해 있겠지만 4차원을 표현하지 못한다.
따라서 2차원으로 차원을 축소해서 보아야 한다. (n_components=2)
for i in range(0, pca_2d.shape[0]):
if dbscan.labels_[i] == 0:
c1 = plt.scatter(pca_2d[i,0],pca_2d[i,1],c='r', marker='+')
elif dbscan.labels_[i] == 1:
c2 = plt.scatter(pca_2d[i,0],pca_2d[i,1],c='g', marker='o')
elif dbscan.labels_[i] == -1:
c3 = plt.scatter(pca_2d[i,0],pca_2d[i,1],c='b', marker='*')
plt.legend([c1, c2, c3], ['Cluster 1', 'Cluster 2', 'Noise'])
plt.title('DBSCAN finds 2 clusters and noise')
plt.show()