본문 바로가기

머신러닝

clustering

clustering : 그룹으로 나누는 작업

 

1. k-means 

데이터 포인트를 가장 가까운 클러스터 중심에 할당

from sklearn.cluster import  KMeans
X,y = make_blobs(random_state=1)

kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

print(kmeans.labels_) #레이블 확인 가능

[1 0 0 0 2 2 2 0 1 1 0 0 2 1 2 2 2 1 0 0 2 0 2 1 0 2 2 1 1 2 1 1 2 1 0 2 0
 0 0 2 2 0 1 0 0 2 1 1 1 1 0 2 2 2 1 2 0 0 1 1 0 2 2 0 0 2 1 2 1 0 0 0 2 1
 1 0 2 2 1 0 1 0 0 2 1 1 1 1 0 1 2 1 1 0 0 2 2 1 2 1]

predict 메소드 존재

실패하는 경우
복잡한 형태면 구분 잘 못함

1. 모든 클러스터의 반경이 똑같다고 가정 -> 밀도가 다르면 잘 구분 못함

2. 모든 방향이 똑같이 중요하다고 가정 -> 대각선으로 늘어져 있으면 잘 구분 못함

 

PCA는 분산이 가장 큰 방향을 찾으려고 하고

NMF는 극단 또는 일부분에 상응되는 중첩할 수 있는 성분을 찾는다고 배움

KMeans는 클러스터 중심으로 각 데이터 포인트를 표현 -> 즉 포인트가 클러스터 중심, 하나의 성분으로 표현됨 == 벡터 양자화

 

장점 : 쉬움, 빠름, MiniBatchKMeans도 제공

단점 : 무작위 초기화를 사용하여 출력이 난수 초깃값에 따라 달라짐, 클러스터 개수를 지정해야함

 

개선

2. 병합 군집 agglomerative clustering

시작할 때 각 포인트를 하나의 클러스터로 지정, 가장 비슷한 두 클러스터를 합쳐나감

종료조건 : 클러스터 개수

linkage option

ward : 대부분 잘맞음   분산을 가장 작게 증가시키는 두 클러스터 합침

average

complete

새로운 포인트에 대해서는 예측못함-> predict 메서드 없음

대신 fit_predict 존재 : fit메서도에서 찾은 labels_를 반환하는 함수

from sklearn.cluster import AgglomerativeClustering

X,y = make_blobs(random_state=1)
agg = AgglomerativeClustering(n_clusters=3)
assignment = agg.fit_predict(X)

병합 군집이 적절한 클러스터 개수를 선택하는데 도움을 줌

 

3. 계층적 군집  hierarchical clustering

병합군집은 계층적 군집을 만듦

다차원 데이터 셋은 덴드로그램으로 시각화 처리

from scipy.cluster.hierarchy import dendrogram, ward
X, y = make_blobs(random_state=0, n_samples=12)

linkage_array = ward(X)
dendrogram(linkage_array)

가지의 길이는 합쳐진 클러스터가 얼마나 멀리 떨어져 있는지를 보여줌

 

4. DBSCAN 

주요 장점 : 클러스터를 미리 지정할 필요 없음

복잡한 형태도 가능  그러나 좀 느림

 

특성 공간에서 가까이 있는 데이터가 많아 붐비는 지역의 포인트를 찾음 -> 밀집 지역

매개변수 : eps, min_samples

eps 거리 안에 데이터가 min_samples만큼 들어 있으면 이를 핵심 샘플로 분류

 

시작할 때 무작위로 포인트를 선택하고 eps거리 안의 모든 포인트를 찾음

eps거리 안에 있는 포인트 수가 min보다 작으면 == 어떤 클래스에도 속하지 않으면 noise로 분류

 

분석의 목적이 군집화라면 잡음점을 무시하거나 제거하면 되구요, 만약 분석의 목적이 군집화가 아니라 anomaly detection, outlier detection 이라면 잡음 점(noises)들이 주요 관심사가 되겠습니다.

출처 : https://yganalyst.github.io/ml/ML_clustering/

 

새로운 데이터 예측 불가능  fit_predict 존재

적절한 eps 쉽게 찾으려면 standardscaler나 MinMaxScaler 사용

dbscan = DBSCAN(min_samples=3, eps=15)

 

군집 알고리즘 비교와 평가

 

1. 타깃 값으로 군집 평가

ARI(adjusted rand index), NMI

from sklearn.metrics.cluster import adjusted_rand_score

실수 : accuracy_score를 사용하는것

 

 

2. 타깃 값없이 군집 평가

from sklearn.metrics.cluster import silhouette_score

성능 안좋음

모양이 복잡하면 평가 잘 안됨

 

견고성 기반 : 데이터에 잡음 포인터를 추가하거나 여러가지 매개변수 설정으로 알고리즘을 실행하고그 결과를 비교해도 결과가 일정하다면 신뢰할만하다

아직 sklearn에는 구현안됨

 

 

요약

k-means, 병합군집 : 클러스터 개수를 지정할 수 있음

DBSCAN : eps매개변수를 사용하여 클러스터 크기를 간접적으로 조절 가능

 

탐색적 데이터 분석과 데이터 전처리에 사용가능