다차원 데이터 분석을 하다가 기존에 공부했었던 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 |
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 = 0, 0
for eps_i in np.arange(0.5, 2.0, 0.1):
for min_samples_i in range(5, 20, 1):
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 결과 및 정답 출력
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으로 나오는 것을 확인하였다.
실제 타켓을 보면 특징값들이 서로 겹쳐있어서 DBSCAN처럼 밀도를 기준으로 분리를 하고자 하면 제대로 할 수 없다는 것을 확인하였다.
먼저 데이터 분석을 진행할 경우, 이러한 사항을 고려해야 할 것 같다.
# 추가
DBSCAN의 동작 방식에 대한 부분도 다음 글에 정리하고자 한다.
'파이썬 > 데이터분석' 카테고리의 다른 글
EM 알고리즘 (expectation maximization algorithm) (0) | 2023.02.23 |
---|---|
Time Series K-Means (0) | 2023.02.14 |
pandas duplicate drop시 중복된 값을 평균 만들기 (0) | 2023.02.13 |
datetime index를 통해 pandas DataFrame 생성 (0) | 2023.02.13 |