본문 바로가기
파이썬/데이터분석

DBSCAN 설명 및 코드

by 배우고 성장하는 청년 블로그 2023. 2. 22.

다차원 데이터 분석을 하다가 기존에 공부했었던 DBSCAN도 가능할 수도 있겠다 싶었다.

그래서 해당 내용을 간단하게 정리를 하고자 한다.

 

# 사용한 데이터셋

많은 데이터 분석에서 사용하는 iris 데이터셋으로 간단한 구현을 하였다.

 

# 데이터셋 읽기 위한 코드 및 결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from sklearn import datasets
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
 
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
 
# read dataset
iris = datasets.load_iris()
 
# feature
data = pd.DataFrame(iris.data)
feature_columns = ['Sepal_length','Sepal_width','Petal_length','Petal_width']
data.columns = feature_columns
 
# labels
data['target'= iris.target
 
# dataset describe
print(data)
print(data.describe())
print(data.info())
cs

iris 데이터 출력

 

pandas의 describe 함수를 통해 각 열에 대한 통계값을 확인해봤다.

각 특징에 대한 통계값

 

pandas의 info 함수를 통해 데이터 누락 여부 및 데이터 형식을 확인할 수 있다.

데이터셋에 대한 누락 여부 및 데이터 형식 확인

# 데이터셋 스케일링

DBSCAN을 적용하기 위해서는 eps와 min_samples의 파라미터를 정해야 한다.

eps: 특정 데이터를 기준으로 다른 데이터와의 거리를 의미함.

min_samples: 몇 개의 데이터가 모였을 경우 군집으로 인정을 할 지에 대한 최소 샘플 갯수를 뜻함.

 

이러한 값을 정하기 위해서 데이터 스케일링을 진행하면 조금은 수월하게 진행할 수 있을 것으로 생각함.

1
2
3
# dataset Scaling
scaler_ = StandardScaler()
data[feature_columns] = scaler_.fit_transform(data[feature_columns])
cs

 

# DBSCAN 최적 파라미터 탐색

grid search 방식으로 파라미터 탐색을 진행하였다.

eps는 0.5에서 2.0으로 0.1간격으로 반복을 하고, min_samples은 5에서 20까지 1간격으로 반복을 진행하였다.

평가는 target과 predict의 정확도를 사용하였다.

정확도가 제일 큰 경우의 eps와 min_samples을 사용하여 결과를 도출해봤다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# DBSCAN
acc = 0
eps_m, min_samples_m = 00
for eps_i in np.arange(0.52.00.1):
    for min_samples_i in range(5201):
        data['predict'= DBSCAN(eps=eps_i, min_samples=min_samples_i).fit_predict(data[feature_columns])
        res = data['target'== data['predict']
        if acc < np.mean(res):
            acc = np.mean(res)
            eps_m = eps_i
            min_samples_m = min_samples_i
 
print('-'*50)
print('acc: {0:.2f}'.format(acc))
print('eps: {0:.2f}'.format(eps_m))
print('min_sample: {0:.2f}'.format(min_samples_m))
print('-'*50)
cs

 

제일 정확도가 큰 경우의 값과 해당 경우의 파라미터 값

DBSCAN 최적 결과

 

# DBSCAN 결과 및 정답 출력

seaborn 라이브러리를 활용하여 DBSCAN 결과를 출력하여 분석을 진행하였다.

1
2
3
4
5
6
7
8
9
10
# best DBSCAN
data['predict'= DBSCAN(eps=eps_m, min_samples=min_samples_m).fit_predict(data[feature_columns])
 
# predict plot
sns.pairplot(data.loc[:, feature_columns + ['predict']], hue='predict')
plt.show()
 
# target plot
sns.pairplot(data.loc[:, feature_columns + ['target']], hue='target', palette='husl')
plt.show()
cs

 

DBSCAN으로 출력한 예측값은 3가지로 분류하지 못하고 2가지로 분류하게 되었다.

그래서, 정확도 값이 최대 0.67으로 나오는 것을 확인하였다.

Predict 결과

실제 타켓을 보면 특징값들이 서로 겹쳐있어서 DBSCAN처럼 밀도를 기준으로 분리를 하고자 하면 제대로 할 수 없다는 것을 확인하였다.

먼저 데이터 분석을 진행할 경우, 이러한 사항을 고려해야 할 것 같다.

target 결과

 

# 추가

DBSCAN의 동작 방식에 대한 부분도 다음 글에 정리하고자 한다.