728x90
DBSCAN¶
- 밀도 기반 군집화
- 기하학적으로 복잡한 데이터 세트에도 효과적
- 특정 공간 내에 데이터 밀도 차이를 기반한 알고리즘
epsilon : 개별 데이터를 중심으로 입실론 반경을 가진 원형의 영역입니다.
핵심 포인트(최소 데이터 개수 이상(자신의 데이터 포함))와 이웃포인트(주변 영역에 포함)로 핵심포인트인 데이터를 정의합니다.
Core point : 주변 영역 내에 최소 데이터 개수 이상을 가집니다.
Border point : 핵심 포인트는 아니지만 이웃 포인트로 핵심 포인트를 가집니다.
Noise point : 핵심 포인트와 이웃 포인트로 핵심포인트도 없습니다.
핵심 포인트를 서로 연결하면서 군비화를 구성합니다.
In [29]:
from sklearn.datasets import load_iris
from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline
In [30]:
iris = load_iris()
feature_names = ['sepal_length','sepal_width','petal_length','petal_width']
# 보다 편리한 데이타 Handling을 위해 DataFrame으로 변환
iris_df = pd.DataFrame(data=iris.data, columns=feature_names)
iris_df['target'] = iris.target
In [31]:
# epsilon은 1이하 값을 지정합니다.
# eps 가 커지면 노이즈가 작아지고 min_samples가 커지면 노이즈가 커집니다,.
dbscan = DBSCAN(eps=0.8, min_samples=8, metric='euclidean')
dbscan_labels = dbscan.fit_predict(iris.data)
iris_df['dbscan_cluster'] = dbscan_labels
iris_df['target'] = iris.target
iris_result = iris_df.groupby(['target'])['dbscan_cluster'].value_counts()
print(iris_result)
# -1레이블은 노이즈를 가리킵니다.
target dbscan_cluster
0 0 50
1 1 50
2 1 47
-1 3
Name: dbscan_cluster, dtype: int64
In [32]:
# 2차원으로 시각화하기 위해 PCA n_componets=2로 피처 데이터 세트 변환
pca = PCA(n_components=2, random_state=0)
pca_transformed = pca.fit_transform(iris.data)
# visualize_cluster_plot( ) 함수는 ftr1, ftr2 컬럼을 좌표에 표현하므로 PCA 변환값을 해당 컬럼으로 생성
iris_df['ftr1'] = pca_transformed[:,0]
iris_df['ftr2'] = pca_transformed[:,1]
In [33]:
iris_df.head(3)
Out[33]:
sepal_length | sepal_width | petal_length | petal_width | target | dbscan_cluster | ftr1 | ftr2 | |
---|---|---|---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 | 0 | -2.684126 | 0.319397 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 | 0 | -2.714142 | -0.177001 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 | 0 | -2.888991 | -0.144949 |
In [34]:
unique_labels = np.unique(dbscan_labels)
markers=['o', 's', '^', 'x', '*']
for label in unique_labels:
label_cluster = iris_df[iris_df['dbscan_cluster']==label]
if label == -1:
cluster_legend = 'Noise'
isNoise=True
else :
cluster_legend = 'Cluster '+str(label)
# 군집별로 다른 마커로 산점도 적용
plt.scatter(x=label_cluster['ftr1'], y=label_cluster['ftr2'], s=50, edgecolor='k', marker=markers[label], label=cluster_legend)
plt.legend(loc='upper center')
plt.show()
728x90
'Data Analytics with python > [Machine Learning ]' 카테고리의 다른 글
[Regression/Classification] 교차 검증과 하이퍼 파라미터 튜닝 + pipeline (0) | 2023.02.16 |
---|---|
[Classification] Decision Tree (0) | 2023.02.15 |
[Clustering] GMM (0) | 2023.02.15 |
[Clustering] MeanShift (0) | 2023.02.14 |
[Clustering] K-means (0) | 2023.02.14 |
댓글