작업 2유형 : DBSCAN

SOOYEON·2022년 6월 11일
0

빅데이터분석기사

목록 보기
23/36

DBSCAN

Density Based Spatial Clustering of Applications with Noise
밀도 기반 클러스터링 기법

이 방법은 케이스가 집중되어 있는 밀도 Density에 초점을 두어 밀도가 높은 그룹을 클러스터링 하는 방식

중심점을 기준으로 특정한 반경 이내에 케이스가 n개 이상 있을 경우 하나의 군집을 형성하는 알고리즘

Hyper Parameter

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

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

concat

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

crosstab

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

→ 현재 데이터는 정규화 과정을 거치지 않아서 단위의 표준화 과정이 필요




시각화 Visualization

군집화 경향과 이상치를 도표에 표현

  • 변수가 4개 이므로 4차원의 공간에 데이터가 위치해 있겠지만, 4차원을 표현하지 못하므로 2차원으로 축소

sklearn

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

0개의 댓글