컴공댕이 공부일지
[ Alchmist 9주차 ] chapter 07 군집화 [ K-평균, 실루엣 계수, 평균 이동, KDE, 확률 밀도 함수, GMM, DBSCAN와 포인터 ] 본문
[ Alchmist 9주차 ] chapter 07 군집화 [ K-평균, 실루엣 계수, 평균 이동, KDE, 확률 밀도 함수, GMM, DBSCAN와 포인터 ]
은솜솜솜 2023. 11. 23. 21:37참고 교재 - (위키북스) 파이썬 머신러닝 완벽 가이드 개정 2판
01. K-평균 알고리즘의 이해
머신러닝 비지도 학습에 속하며, 데이터를 K개의 군집으로 묶는 알고리즘
거리 기반 군집화 : 군집 중심점이라는 특정한 임의의 지점을 선택해
해당 중심에 가장 가까운 포인트들을 선택하는 군집화 기법
- K-평균 알고리즘의 과정
1) 군집화의 기준이 되는 중심을, 군집화 개수만큼 임의의 위치에 가져다 놓기
( 임의의 위치에 군집 중심점을 가져다 놓으면, 이동해야하는 횟수가 늘어나므로 오래걸린다.
그래서, 수행시간이 오래 걸리기 때문에, 초기화 알고리즘으로 적합한 위치에 중심점을 가져다 놓는다. )
2) 각 데이터는 가장 가까운 곳에 위치한 한 중심점에 소속됨
3) 소속이 결정되면, 군집 중심점을 소속 데이터들의 평균 중심 위치로 이동시키기.
4) 중심점이 이동했으니, 각 데이터는 기존에 속한 중심점보다 더 가까운 중심점이 있다면, 소속 변경.
5) 다시 중심을 소속된 데이터의 평균 중심으로 이동.
6) 중심점 이동 이후, 데이터의 소속 변경이 없으면, 군집화를 종료 / 아니면, 4번을 거쳐 과정 반복

- K-평균의 장점
- 일반적 군집화에서 가장 많이 활용되는 알고리즘
- 알고리즘이 쉽고 간결함
- K-평균의 단점
- 속성 개수가 매우 많을 경우 군집화 정확도가 떨어짐 (이를 해소하기 위해 PCA로 차원 감소를 적용해야 할 수도)
- 반복 횟수가 많을 경우, 수행 시간이 매우 느려짐
- 몇 개의 군집을 선택해야 할 지 가이드하기 어려움
- 클러스터 모양이 원형이 아닐 경우, 정확한 결과를 도출해내지 못함
+) 반대로, 군집 내의 데이터가 원형으로 흩어져 있는 경우엔, K-평균이 매우 효과적으로 군집화를 수행한다.
- K-평균 구현 ㅡ 사이킷런 KMeans 클래스
- 주요 파라미터
n_clustes : 초기화 파라미터로, 군집화할 개수. 즉 군집 중심점의 개수
init : 초기에 군집 중심점의 좌표를 설정할 방식. 보통 임의로 중심을 설정하지 않고, k-means++ 방식으로 최초 설정
max_iter : 최대 반복 횟수. 단, 이 횟수 이전에 중심점 이동이 더이상 없으면 먼저 종료.
fit / fit_transform 메서드를 이용해 수행.
- 군집화 관련 주요 속성
labels_ : 각 데이터 포인트가 속한 군집 중심점 레이블
(ex) 중심점 3개 군집화 이후, [ 0 1 2 2 2 1 1 0 0 0 1 2 0 2 ] 이런식으로 각 데이터가 속한 중심점 레이블을 반환.
cluster_centers_ : 각 군집 중심점 좌표(Shape는 [군집 개수, 피처 개수]), 이를 이용해 군집 중심점 좌표 시각화
- K-평균을 이용한 붓꽃 데이터 세트 군집화
붓꽃 데이터(꽃받침과 꽃잎의 너비와 길이)를 이용해 K-평균 군집화를 수행해 품종 분류
kmeans = KMeans(n_clusters=3, init = 'k-means++', max_iter=300, random_state=0)
keans.fit(DF)
중심점 개수가 3개고, k-means++로 초기 중심점을 최적화해 배치하고,
최대 반복 횟수가 300인 KMeans 생성, fit()을 수행.
=> DF에 대한 군집화 수행 결과가 kmeans 객체 변수로 반환됨
* random_state : 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 값
데이터가 4개로 4차원이라, 시각화 할 때, 2차원으로 PCA 차원 축소 후 시각화.
- 군집화 알고리즘 테스트를 위한 데이터 생성
- 대표적인 군집화용 데이터 생성기 API
make_blobs()
make_classification()
n_samples : 생성할 총 데이터의 개수(default = 100)
n_features : 데이터의 피처 개수 (시각화하는 경우 2개로 설정해 x,y 좌표상에 표현)
centers : int값으로 군집의 개수 or ndarray로 표현하면 개별 군집 중심점의 좌표
cluster_std : 생성될 군집 데이터의 표준 편차
02. 군집 평가 (Cluster Evaluation)
how to evaluate clustring?
대부분의 데이터 세트는 타깃 레이블이 없다. ( 정답 없이 분석해내는 비지도학습이므로 )
- 실루엣 분석의 개요
군집화의 성능을 평가하는 대표적인 방법. 실루엣 계수 기반.
각 군집 간의 거리가 얼마나 효율적으로 분리돼 있는지 나타내는 지표
효율적인 분리
= 다른 군집과는 떨어져있고, 동일 군집끼리는 가깝게 잘 뭉쳐 있다는 의미
군집화가 잘 될수록 개별 군집은 비슷한 정도의 여유공간을 가지고 떨어져있을 것.
- 실루엣 계수 ( -1 ~ 1 )
개별 데이터가 가지는 군집화 지표로,
해당 데이터가 같은 군집 내의 데이터와 얼마나 가깝게 군집화돼있고,
다른 군집 데이터와는 얼마나 멀리 분리돼 있는지를 나타내는 지표
실루엣 계수의 정의 필기.
-1에서 1 사이의 값을 가지며,
1에 가까울수록 근처 군집과 더 멀리 떨어져있음.
0에 가까울수록 근처 군집과 가까움
- 사이킷런의 실루엣 분석 메서드
sklearn.metrics.silhouette_samples(X, labels, metric='euclidean', **kwds)
sklearn.metrics.silhouette_score(X, labels, metric='euclidean', sample_size=None, **kwds )
- 좋은 군집화의 기준
1) 전체 실루엣 계수의 평균값, 즉 사이킷런의 silhouette_score() 의 값은
0~1의 값을 가지며, 1에 가까울수록 좋다.
2) 전체 실루엣 계수의 평균값과 더불어 개별 군집의 평균값 편차가 크지 않아야 합니다.
즉, 개별 군집의 실루엣 계수 평균값이 전체 실루엣 계수의 평균값에 크게 벗어나지 않는 것이 중요.
ex) 전체 실루엣 계수의 평균값은 높지만, 특정 군집의 실루엣 계수 평균값만 유난히 높고,
다른 군집들의 실루엣계수 평균값은 낮으면 좋은 군집화 조건이 아님.
- 붓꽃 데이터 세트를 이용한 군집 평가
(in 주피터 노트북)
- 군집별 평균 실루엣 계수의 시각화를 통한 군집 개수 최적화 방법
좋은 군집화의 조건은 쉽게 말해,
실루엣 계수 평균값이 1에 가까울수록 좋은데, 어느 군집의 평균만 높은 것이 아니라,
모든 군집의 실루엣 계수 평균들이 모두 비슷비슷해야함 !
교재의 예제의 경우,
군집의 개수를 2개, 3개, 4개로 늘려가면서, 실루엣 계수의 평균을 보며 군집 개수 확정.
군집의 개수가 4개일 때, 개별 군집의 평균 실루엑 계수 값이 비교적 비슷비슷~ 균일해서,
4가 가장 이상적인 군집화 개수라는 것을 알 수 있음 !

03. 평균 이동 (mean shift)
군집의 중심점은 데이터 포인트가 모여있는 곳
가장 데이터가 모여있는. 확률 밀도 함수가 피크인 점을 군집 중심점으로 선정
평균 이동 군집화는 K-평균과 유사하게 군집의 중심을 지속적으로 움직이며 군집화를 수행
K-평균은 중심에 소속된 데이터의 평균 거리 중심으로 이동하지만,
평균 이동은 중심을 데이터가 모인 밀도가 가장 높은 곳으로 이동시킨다.
확률 밀도 함수를 이용해, 데이터의 분포도를 토대로 군집 중심점을 찾는다.
ㅡ
KDE를 이용해 주어진 모델의 확률 밀도 함수를 찾는다.
특정 데이터를 반경 내의 데이터 분포 확률 밀도가 가장 높은 곳으로 이동하기 위해서,
주변 데이터와의 거리값을 KDE 함수 값으로 입력한 뒤, 반환 값을 현재 위치에서 업데이트 하면서 이동하는 방식.
- KDE와 확률 밀도 함수 추정
- PDF (Probability Density Function) ; 확률 밀도 함수
확률 변수의 분포를 나타내는 함수
정규분포, 감마 분포, t-분포 등이 있다.
확률 밀도 함수를 알면, 특정 변수가 어떤 값을 갖게 될 지 확률을 알 수 있어서,
변수의 특성(정규분포의 평균과 분산 같은), 확률 분포 등 변수의 많은 요소를 알 수 있다.

- KDE (Kernel Density Estimation) ; 커널 밀도 추정
커널 함수를 통해 어떤 변수의 확률 밀도 함수를 추정하는 대표적인 방법
관측된 데이터 각각에 *커널 함수를 적용한 값을 모두 더한 뒤 데이터 건수로 나눠 확률 밀도 함수 추정

* 밀도 추정 : 데이터들의 분포로부터 원래 변수의 분포 특성을 추정하는 것
ex) 어느 다리를 통과하는 일일 교통량을 파악할 때, 매일매일의 값들은 다르겠지만,
오랜 기간이 지나 얻은 수많은 데이터들의 분포를 보게 되면, 원래 변수 즉, 일일 교통량을 어느정도 짐작할 수 있다
( 주말엔 500대, 화요일엔 200대 이런식으로 ! )
기계 학습에서의 밀도는 수학적인 부피분의 질량 그 밀도가 아닌, 확률 밀도이다.
기계학습에서의 밀도 = 확률밀도 !
따라서, 밀도 추정이란, 확률 밀도 함수를 추정하는 것이다.
( 확률 밀도 함수의 함수값 = (확률)밀도 )
* 커널 함수 : 원점을 중심으로 좌우 대칭이면서, 적분값이 1인, non-negative 함수
ex) 가우시안 분포 함수
KDE : 커널 함수를 활용한 밀도 추정 !
위에서 공부한 정의대로 적용해보자.
확률변수값 x - 관측값xi를 커널 함수 K에 적용해 합산한 후, 데이터 갯수 n으로 나눠준다.
이 때, 대역폭도 적절히 설정해 평활화 해준다.

대역폭 h의 설정에 따라, 확률 밀도 추정 성능이 크게 달라진다.
h가 너무 작으면, 다소 뾰족한 KDE로, 과적합 가능성이 커지고,
h가 너무 크면, 너무 평활화된 KDE 때문에 과소적합 가능성이 커진다.
그래서 h를 계산하는 것은 평균 이동 군집화에서 매우 중요하다.
사이킷런은 최적의 대역폭 계산을 위해 estimate_bandwidth() 함수를 제공한다.
파라미터로 피처 데이터 세트를 입력하면 최적화된 대역폭 값을 반환해준다.
best_bandwidth = estimate_bandwidth(X) #피처 데이터 세트로부터 최적 대역폭 찾기
meanshift = MeanShift(bandwidth = best_bandwidth) #최적 대역폭으로 평균 이동 군집화 수행
일반적으로 대역폭이 작아질수록 더 fit 해지므로, 군집 개수가 많아진다 !
- 평균 이동의 장점
- 데이터 세트를 특정 형태로 가정하거나, 특정 분포 기반 모델로 가정하지 않으므로, 유연한 군집화가 가능
- 이상치의 영향력 크지 않음
- 군집 개수 정할 필요 없이, 대역폭에 의해 알아서 군집화됨
- 평균 이동의 단점
- 수행 시간 오래 걸림
- 대역폭의 크기에 따른 군집화 영향도가 매우 크다
위와 같은 특징 탓에 평균 이동은 분석 업무 기반 데이터 세트보다는 컴퓨터 비전 영역에 더 많이 사용된다.
이미지나 영상 데이터에서 특정 개체를 구분하거나, 움직임을 추적하는데 뛰어난 역할을 수행한다.
04. GMM (Gaussian Mixture Model)
확률 기반 군집화
데이터가 여러 개의 정규 분포를 가진 데이터 집합들이 섞여서 생성된 것이라 가정.

- GMM의 두 가지 종류의 모수
- 개별 정규 분포의 평균과 분산
- 각 데이터가 어떤 정규 분포에 해당되는지의 확률

- GMM을 이용한 붓꽃 데이터 세트 군집화
사이킷런이 GMM의 *EM방식을 통한 모수 추정 군집화를 위해 GaussianMixture클래스를 지원함.
n_components : GM 객체의 중요한 초기화 파라미터로, GM의 총 개수 즉, 군집의 개수를 의미한다.
- GMM과 K-평균의 비교
- K-평균 (거리 기반 군집화)
원형의 범위에서 군집화 수행
데이터 세트가 원형의 범위를 가질수록 군집화 효율 상승
다만, 데이터 세트가 타원형 등일 경우엔, 군집화 정확성이 떨어진다.
- GMM (확률 기반 군집화)
유연하게 다양한 데이터 세트에 잘 적용될 수 있음
그러나, 수행 시간이 오래 걸린다.
05. DBSCAN (Density Based Spatial Clustering of Applications with Noise)
밀도 기반 군집화
입실론 주변 영역의 최소 데이터 개수를 포함하는 밀도 기준을 충족시키는 데이터인
핵심 포인트를 연결하며, 점차적으로 군집화를 구성하는 방식.
데이터의 분포가 기하학적으로 복잡한 데이터 세트에도 효과적인 군집화 가능
ㅡ
DBSCAN의 중요 파라미터
- 입실론 주변 영역 : 개별 데이터를 중심으로 입실론 반경을 가지는 원형의 영역
- 최소 데이터 개수 : 개별 데이터의 입실론 주변 영역에 포함되는 타 데이터의 개수
DBSCAN의 데이터 포인트 정의
- 핵심 포인트(Core Point) : 주변 영역 내에 최소 데이터 개수 이상의 타 데이터를 가지고 있는 데이터
- 이웃 포인트(Neighbor Point) : 주변 영역 내에 위치한 타 데이터
- 경계 포인트(Border Point) : 주변 영역 내에 최소 데이터 개수 이상의 이웃 포인트를 가지고 있진 않지만, 핵심 포인트를 이웃으로 가지고 있는 데이터
- 잡음 포인트(Noise Point) : 최소 데이터 개수 이상의 이웃 포인트를 가지고 있지 않으며, 핵심 포인트도 이웃 포인트로 가지고 있지 않은 데이터

두 핵심 포인트가 이웃인 경우, 직접 접근이 가능하다.
특정 핵심 포인트에서 직접 접근이 가능한 다른 핵심 포인트를 서로 연결하며 군집화를 구성한다.
점차적으로 클러스터의 영역을 확장해 나가는 것이 DBSCAN 군집화 방식이다.
- DBSCAN 적용 - 붓꽃 데이터 세트
사이킷런 DBSCAN 클래스
초기화 파라미터
eps : 입실론 주변 영역의 반경
min_samples: 핵심 포인트가 되기 위해 영역 내에 포함되어야 할 데이터의 최소 개수(자신 데이터 포함)
- DBSCAN 적용 - make_circles() 데이터 세트
make_circles()로 두 겹의 원 모양으로 흩어진 데이터 생성
파라미터
noise : 노이즈 비율
factor : 외부 원과 내부 원의 스케일 비율
KDE 참고 티스토리. 어려운 개념을 쉽게 설명해두셨다 :) : https://darkpgmr.tistory.com/147
Kernel Density Estimation(커널밀도추정)에 대한 이해
얼마전 한 친구가 KDE라는 용어를 사용하기에 KDE가 뭐냐고 물어보니 Kernel Density Estimation이라 한다. 순간, Kernel Density Estimation이 뭐지? 하는 의구심이 생겨서 그 친구에게 물어보니 자기도 잘 모른
darkpgmr.tistory.com