Density Based Spatial Clustering of Applications with Noise
밀도 기반 클러스터링 기법
이 방법은 케이스가 집중되어 있는 밀도 Density에 초점을 두어 밀도가 높은 그룹을 클러스터링 하는 방식
중심점을 기준으로 특정한 반경 이내에 케이스가 n개 이상 있을 경우 하나의 군집을 형성하는 알고리즘
epsilon = (eps)
근접 이웃점을 찾기 위해 정의 내려야 하는 반경 거리
minPts ; minimum amount of points = (min_samples)
하나의 군집을 형성하기 위해 필요한 최소 케이스 수
1. Core point
epsilon 반경 내에 최소점(minPts) 이상을 찾는 점
2. Border point
Core point의 엡실런 반경 내에 있으나, 그 자체로는 최소점(minPts)을 갖지 못하는 점
3. Noise point
Core point 도 아니고 Border point도 아닌 점
sklearn.cluster import DBSCAN
DBSCAN 은 sklearn에서 cluster 에 있다.
- 일반적인 cluster 가 유사한 군집을 도출하기 이한 목적에 사용되는 반면,
- DBSCAN은 멀리 떨어진 데이터, 즉 이상값을 탐지하는 데에 많이 활용된다.
iris = pd.read_csv('iris.csv')
iris_data = iris[iris.columns[0:4]]
iris_head()
from sklearn.clustering import DBSCAN
dbscan = DBSCAN(eps = 0.5, metric = 'euclidean', min_samples = 5)
dbscan
metric
개체간 거리는 기본 설정 방법이 유클리디안
metric = 'euclidean')
으로 되어 있다.
dbscan.fit(iris_data)
dbscan.labels_
# result
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1,
1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
dtype=int64)
dbscan 모델에 iris_data 를 학습(fit)시킨 후, dbscan.labels_를 보면 숫자가 나타난다.
위에서 설정한 기준에 따르면 2개의 군집 (0.1) 으로 나타낸 것이다.
모델 기준에서 이상치로 파악된 것은 '-1'로 표현된다.
DBSCAN은 반경
과 최소표본수
를 어떻게 잡는가에 따라 -1 값이 많아질 수도 있고 적어질 수도 있다.
따라서 -1의 데이터를 보고 이상치를 볼 수 있는가를 확인하면서 하이퍼파라미터를 조정해야 한다.
.fit_predict()
pred = dbscan.fit_predict(iris_data)
pred = pd.DataFrame(pred)
pred.columns = ['predict']
pred.head()
기본적인 데이터 처리 및 도표 시각화 라이브러리
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
match_data = pd.concat([iris, pred], axis = 1)
match_data.head()
sepal_length sepal_width petal_length petal_width class predict
0 5.1 3.5 1.4 0.2 Iris-setosa 0
1 4.9 3.0 1.4 0.2 Iris-setosa 0
2 4.7 3.2 1.3 0.2 Iris-setosa 0
3 4.6 3.1 1.5 0.2 Iris-setosa 0
4 5.0 3.6 1.4 0.2 Iris-setosa 0
cross = pd.crosstab(match_data['class'].match_data['predict'])
cross
predict -1 0 1
class
Iris-setosa 1 49 0
Iris-versicolor 6 0 44
Iris-virginica 10 0 40
→ 현재 데이터는 정규화 과정을 거치지 않아서 단위의 표준화 과정이 필요
군집화 경향과 이상치를 도표에 표현
decomposition PCA
PCA는 주성분분석 ; Principle Component Analtsis으로서 대표적인 차원축소 방법
n_components
차원 수
from sklearn.decomposition import PCA
pca = PCA(n_components = 2).fit(iris_data) # 차원 수를 2로 하고, 데이터를 학습(fit) 시킨다.
pca_2d = pca.transform(iris_data) # 데이터를 변환 (transform) 하여 결과를 pca_2d에 담는다.
for문으로 데이터수만큼 반복하면서 0번이면 빨간색(c='r'), 표시(marker)는 '+'로 표현하고, 1번이면 녹색(c='g'), 'o'로 표시, -1이면 파란색 (c='b'), '*'로 표시하도록 한다.
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()