본문 바로가기
코딩/Machine Learning

12. 군집화(Clustering)

by 세자책봉 2021. 1. 9.
728x90

권철민 저, '파이썬 머신러닝 완벽 가이드', 2019.02.28

내 맘대로 요약 공부 중(문제시 비공개 및 삭제)

최초 작성일 2021.1.7

12.1 K-평균 알고리즘

- 군집화(Clustering)의 가장 보편적인 알고리즘 K-평균

- 군집 중심점(centroid)을 임의로 지정하여 각 데이터와의 평균 지점으로 이동하며, 더 이상 중심점의 이동이 없을 경우

  반복을 멈추고 해당 중심점에 속하는 데이터들을 군집화

K-평균 군집화의 시각적 표현

  1. 두 개의 군집 중심점을 설정하며, 각 데이터는 가까운 중심점에 속함
  2. 할당된 데이터들의 평균 중심으로 중심점 이동
  3. 다시, 각 데이터는 가까운 중심점에 속함
  4. 할당된 데이터들의 평균 중심으로 중심점 이동
  5. 이동이 없을 때까지 반복

- 거리 기반 알고리즘으로 속성의 개수가 많을수록 군집화 정확도가 낮음

- 반복 수행을 해야 하므로 수행 시간이 느림

- 사전에 몇 개로 군집해야 할지 파악하기 어려움(실험적으로 반복해야 한다는 것을 의미)

 

- Sklearn KMeans 클래스 활용

  • n_clusters = 군집화할 개수, 군집 중심점의 개수 /
  • n_init = 초기 군집 중심점의 좌표를 설정할 방식(보통 'k-mean++')
  • max_iter = 최대 반복 횟수, 이전에 중심점의 이동이 없을 경우 반복 종료
  • fit(데이터 세트), fit_transform(데이터 세트)

- 군집화 완료 후 군집화 속성 확인

  • labels_ = 각 데이터 포인트가 속한 군집 중심점 레이블
  • cluster_centers = 각 군집 중심점 좌표, Shape는 [군집 개수, 피처 개수], 좌표를 통해 시각화 가능

- 붓꽃 데이터 세트 군집화

데이터 준비

- 붓꽃 데이터 세트 3개 그룹으로 군집화

- n_clusters=3, init='k-means++', max_iter=300

label 값이 0, 1, 2로 확인

- Cluster Label 값 칼럼 추가

당황하지 않고..
groupby().count() 연산을 실제 target값과 분류 값 cluster에 적용

- 분류 target 0은 1번 군집으로 50개

- 분류 target 1은 0번 군집으로 48개, 2번 군집으로 2개

- 분류 target 2는 0번 군집으로 14개, 2번 군집으로 36개

- 분류 target 1, 2는 군집화가 제대로 되지 않았음. 특히 분류 target 2

- 붓꽃 데이터 전체 시각화

PCA로 4개의 속성을 2개로 차원 축소

- df.loc['row', 'column'] 활용( row에는 행 or 인덱스, column에는 column)

- 군집화 알고리즘 테스트를 위한 데이터 생성기(make_blobs(), make_classification() API)

- make_blobs() → 개별 군집의 중심점과 표준 편차 제어 기능

- make_classification() → 노이즈를 포함한 데이터를 만듦

- make_circle(), make_moon()  군집화로 해결하기 어려운 데이터 세트를 만듦

- make_blobs() 활용

  • n_samples: 생성할 데이터 수, Dafault=100개
  • n_features: 데이터의 피처 수, 시각화는 2개로 설정하여 첫 번째 피처는 X 두 번째 피처는 Y로 표현
  • centers: int값으로 설정하면 군집의 개수, ndarray로 설정하면 개별 군집 중심점의 좌표
  • cluster_std: 생성될 군집 데이터의 표준 편차, list로 표현 시 리스트 순서별로 군집 내의 표준편차를 의미

- np.unique 활용(중복되지 않는 배열을 반환)

데이터 생성 및 확인
2개의 피처를 갖고있는 데이터 세트 X

- 시각화

- KMeans 군집화를 수행한 뒤 군집 별로 시각화

- 매핑 확인

대체적으로 잘 매핑되었음

- make_blobs()의 cluster_std 값에 따른 결과 비교

 cluster_std가 클수록 군집 중심으로 데이터가 모인다

12.2 군집 평가(Cluster Evaluation)

- 군집화는 분류(Classification)와 다르게 데이터 내에 숨어있는 별도의 그룹을 찾아 의미를 부여하는 등 세분화된

  군집화를 추구함

- 대표적인 군집 평가 방법: 실루엣 분석(Silhouette analysis)

- 각 군집 간의 거리가 얼마나 효율적으로 분리돼 있는지 나타냄

- 잘 분리될수록 다른 군집과의 거리는 멀고, 동일 군집과의 거리는 가까움

- 개별 데이터가 가지는 군집화 지표인 실루엣 계수(Silhouette Coefficient)를 기반

- 실루엣 계수

  • 1에 가까울수록 근처의 군집과 더 멀리 떨어져 있음
  • 0에 가까울수록 근처의 군집과 가까움
  • 음수(-)는 다른 군집에 데이터가 군집되어 있음을 의미(다시 군집화 해야 함)

- sklean의 실루엣 분석 메서드

  • sklearn.metrics.silhouette_samples(X, labels, metric='euclidean', **kwds): X feature 데이터 세트, 각 피처의 레이블 값을 인자로 제공하면 실루엣 계수를 반환
  • sklearn.metrics.silhouette_score(X, labels, metric='euclidean', sample_size=None, **kwds): X feature 데이터 세트, 각 피처의 레이블 값을 인자로 제공하면 전체 데이터의 실루엣 계수 값을 평균하여 반환

- 좋은 군집화의 조건

  1. sklearn의 silhouette_score값이 0~1 사이의 값을 가지며, 1에 가까울수록 좋음
  2. 전체 실루엣 계수의 평균값개별 군집의 평균값의 편차가 크지 않아야 함(여러 개 중 하나만 군집이 잘 될 수도)

- 붓꽃 데이터를 활용한 군집 평가

어렵지 않은 코드 진행

- 평균 실루엣 계수: 0.553

- 클러스터별 coeff 평균 구하기

groupby를 활용한 클러스터별 silhouette coeff 평균

- 군집별 평균 실루엣 계수의 시각화 방법

github.com/wikibook/ml-definitive-guide/blob/master/7%EC%9E%A5/7-2_Cluster%20evaluation.ipynb

 

wikibook/ml-definitive-guide

《파이썬 머신러닝 완벽 가이드》 예제 코드. Contribute to wikibook/ml-definitive-guide development by creating an account on GitHub.

github.com

- 부록 소스코드를 활용

- 4개의 군집 중심의 500개 2차원 데이터 세트를 만들고, k-평균으로 군집화

4개의 군집일 때 최적

- 붓꽃 예제로 K-평균 군집화

군집 개수 2개가 적당함(3개는 편차 큼)

- 실루엣 계수를 통한 평가방법은 시간이 오래 걸리므로, 군집 별 임의의 데이터를 샘플링하여 실루엣 계수를 평가하는

  방법을 고려해야 함

12.3 평균 이동(Mean Shift)

- 특정 대역폭(bandwidth)을 가지고 최초의 확률 밀도 중심에서 데이터의 확률 밀도 중심이 더 높은 곳으로 이동

- 데이터의 분포도를 이용해 군집 중심점을 찾음(확률 밀도 함수)

- KDE(Kernel Density Estimation)

- 대역폭의 크기에 따라 군집화의 품질이 결정

- sklearn의 Meanshift 클래스 활용

- make_blobs() cluster_std=0.8, 3개의 군집 데이터, bandwidth=0.9

8개의 군집으로 분류
bandwidth=1로 적용, 3개의 군집

- 최적의 bandwidth를 찾기 위해 sklearn의 estimate_bandwidth를 활용

- 군집화 수행

최적 bandwidth를 적용하니 4개로 군집되었다

- 시각화 수행

책에서는 bandwidth를 1로 적용해서, 이 시각화 자료와 다름
3번 군집이 분류 타겟 0과 분류 타겟 2로 절반 매핑된 것으로 보아 수정할 필요가 있음

- 평균 이동의 장점

  • 평균 이동은 데이터 세트의 형태를 특정 형태로 가정하지 않음
  • 평균 이동은 특정 분포도 기반의 모델로 가정하지 않음
  • 유연한 군집화 가능

- 평균 이동의 단점

  • 수행 시간이 오래 걸림
  • bandwidth에 따른 군집화 영향도가 큰 편

- 데이터 세트 조작보다는 이미지 혹은 영상 데이터에서 특정 개체를 구분하거나 움직임을 추적하는 역할을 수행

12.4 GMM(Gaussiaan Mixture Model)

- GMM 군집화: 데이터가 여러 개의 가우시안 분포 모델을 섞어서 생성된 것을 가정하여 군집화 수행

- 가우시안 분포(Gaussian Distribution) = 정규 분포(Normal Distribution) = 평균 0, 표준편차 1

사진 출처: https://ko.wikipedia.org/wiki/%ED%91%9C%EC%A4%80_%ED%8E%B8%EC%B0%A8

- GMM은 데이터를 여러 개의 가우시안 분포가 섞인 것으로 가정

전체 데이터 세트는 서로 다른 정규 분포 곡선으로 구성될 수 있으며, 이를 기반으로 군집화를 수행

- 가령, 1000개의 데이터 세트가 있으면 이를 구성하는 여러 개의 정규 분포를 추출하고 개별 데이터가 어떤 정규분포에

  속하는지 결정하는 것이 GMM

- GMM의 모수 추정

  • 개별 정규 분포의 평균과 분산
  • 각 데이터가 어떤 정규 분포에 해당되는지 확률

- GMM은 EX(Expectation and Maximization) 방식으로 모수 추정 군집화

- sklearn의 GaussianMixture 클래스 활용

 

- 붓꽃 데이터 세트 군집화

- GaussianMixture 객체의 주요 parameter: n_components(gaussian model의 총 개수)

붓꽃 데이터 불러오기 및 데이터 군집화

- Target 0은 cluster 0, Target 2는 cluster 1, Target 1은 cluster 2로(90%) cluster1로(10%) Mapping 되었음을 확인

- 비교를 위해 k-평균 군집화를 해 보면

붓꽃 데이터 세트는 GMM 군집화에 더 적합하다

- GMM vs K-평균 비교

 - KMeans는 원형의 범위에서 군집화를 수행하므로 데이터가 원형의 범위를 가질수록 군집화 효율이 상승함

 - 타원형의 분포를 갖는 데이터를 생성하여 비교 진행

 - 부록의 소스코드 활용 visualize_cluster_plot(clusterobj, dataframe, label_name, iscluster=True)

  • clusterobj: 사이킷런의 군집 수행 객체, KMeans or GaussianMixture의 fit(), predict()를 완료한 객체, make_blobs()의 경우 None
  • dataframe: 피처 데이터 세트와 label 값을 가진 DataFrame
  • label_name: 군집화 결과 시각화는 dataframe 내 label 칼럼 명, make_blobs()는 dataframe 내 target 칼럼 명
  • iscluster: 사이킷런 Cluster 객체가 군집 중심 좌표를 제공하면 True, 아니면 False

타원형 데이터를 만들기 위해 transformation 및 dot을 진행

- KMeans 수행

원형으로 군집화를 성격상 타원형 분포의 데이터는 최적군집화가 어려움

- GMM 수행

꽤나 정확하게 군집화 된 것을 확인

- GMM은 K-평균과 다르게 중심 좌표를 구할 수 없음

- Label값 비교

원형 데이터 분포가 아닐경우, GMM의 성능이 좋음

- 문제는 GMM도 수행 시간이 오래 걸림

12.5 DBSCAN(Density Based Spatial Clustering of Applications with Noise)

- 기하학적으로 복잡한 데이터 세트에도 효과적으로 군집화 가능

- 특정 공간 내의 데이터 밀도 차이를 기반으로 함

- 주요 파라미터

  • 입실론(epsilon): 개별 데이터를 중심으로 입실론 반경을 가지는 원형의 영역
  • 최소 데이터 개수(min points): 개별 데이터의 입실론 주변 영역에 포함되는 다른 데이터의 개수

- 데이터 구분(입실론 영역 내에 포함되는 최소 데이터 개수를 충족하는가 or not)

  • 핵심 포인트(Core Point): 주변 영역 내에 최소 데이터 개수 충족하는 해당 데이터
  • 이웃 포인트(Neighbor Point): 주변 영역 내에 위치한 타 데이터
  • 경계 포인트(Border Point): 주변 영역 내에 최소 데이터 개수 불충족 AND 핵심 포인트를 이웃하는 해당 데이터
  • 잡음 포인트(Noise Point): 주변 영역 내에 최소 데이터 개수 불충족 AND 핵심 포인트 이웃하지 않는 해당 데이터

- 입실론 영역 내에 포함되는 최소 데이터 개수 3개로 가정

P1은 Core Point이며, 다음차례 P2도 Core Point
P3는 이웃 데이터의 수가 2개, 코어 포인트를 포함하므로 Border Point, P4는 이웃 데이터 수 1개, 코어 포인트 없으므로 Noise Point

- sklearn의 DBSCAN 클래스, 주요 파라미터

  • eps: 입실론 주변 영역의 반경
  • min_samples = 핵심 포인트가 되기 위한 최소 데이터 개수(자신의 데이터 수 포함)

- 붓꽃 데이터 세트 군집화(eps=0.6, min_samples=8)

군집 레이블 -1은 Noise를 의미

- Target 유형 3가지(0,1,2), 군집 레이블 2가지(0,1), 노이즈 군집 레이블(-1)

- 시각화(부록의 소스코드 활용, 2차원 평면에서 표현하기 위해 PCA로 2개의 피처로 압축)

최적의 eps와 min_samples를 찾는것이 중요하다

- 일반적으로 eps가 클수록 노이즈가 줄고, min_samples가 클수록 노이즈가 많아짐

eps=0.8, min_samples=8일 때, 노이즈가 3개로 줄어든 것을 확인할 수 있음
eps=0.6, min_samples=16일 때, 노이즈가 많아진것을 확인

 

- DBSCAN 적용(make_circles() 데이터 세트)

make_circles()는 내부 원과 외부 원으로 구성되는 데이터 세트를 생성

- K-평균 군집화

- GMM 군집화

- DBSCAN 군집화

12.6 군집화 예제 실습 - 고객 세그먼테이션(Customer Segmentation)

- 고객 세그먼테이션(Customer Segmentation)은 다양한 기준으로 고객을 분류하는 기법을 지칭

- 지역/결혼 여부/성별/소득/직업/선호 상품군/최근 구매 상품/구매 주기 등의 데이터를 활용

- 고객의 어떤 데이터를 기반으로 군집화 할 것인가?? →RFM 기법

  • RECENCY(R): 가장 최근 상품 구입 일에서 오늘까지의 시간
  • FREQUENCY(F): 상품 구매 횟수
  • MONETARY VALUE(M): 총 구매 금액

- archive.ics.uci.edu/ml/datasets/online+retail 데이터 활용

 

UCI Machine Learning Repository: Online Retail Data Set

Online Retail Data Set Download: Data Folder, Data Set Description Abstract: This is a transnational data set which contains all the transactions occurring between 01/12/2010 and 09/12/2011 for a UK-based and registered non-store online retail. Data Set Ch

archive.ics.uci.edu

- 데이터 불러오기

InvoiceNo, StockCode, Description, Quantity, InvoiceDate, UnitPrice, CustomerID, Country

- 데이터 결측치 확인(NULL)

CustomerID의 결측치는 약 13만개, 고객식별번호가 없는 데이터는 데이터분석에 의미가 없음 

- 데이터 전처리

  • NULL 데이터 삭제: CustomerID가 없는 데이터 삭제
  • 오류 데이터 삭제: Quantity 혹은 UnitPrice가 0보다 작은 데이터 삭제
  • 데이터 정리: 영국을 제외한 국가의 데이터 삭제

데이터 전처리 후 NULL값이 없는 것을 확인
영국이 대다수
최종 데이터는 354321개

- RFM 기반 데이터 군집화 수행

  • UnitPrice * Quantity를 곱해서 주문 금액 데이터 생성
  • CustomerID int형으로 변경

몇몇 고객이 많은 주문 건수와 주문 금액을 가지고 있음

  • 주문번호(InvoiceNo) + 상품코드(StockCode) 기준의 데이터를 고객 기준의 Recency, Frequency, Monetary Valve 데이터로 변경 → RFM 기반의 세그먼트를 수행해야 하기 때문에 데이터를 바꾸는 것임
  • 여러 개의 칼럼에 서로 다른 연산법(max, count, sum 등)이 필요하므로 agg() 객체를 활용

  • Recency는 고객이 가장 최근에 주문한 날짜 → 데이터가 2011년 12월 9일까지의 데이터 이므로 2011년 12월 10일을 현재 날짜로 간주하고 가장 최근의 주문 일자를 빼서 데이터 정리 필요

 

- RFM 기반 고객 세그먼테이션

  • 데이터 특성상 판매 데이터에는 소매업체의 대규모 주문이 포함되어 있음 → 왜곡 데이터로 왜곡 군집이 발생함
  • 온라인 판매 데이터 세트의 칼럼별 히스토그램을 확인하여 왜곡 데이터 확인

데이터 왜곡 정도가 심한 것을 확인할 수 있음

  • 각 칼럼의 데이터 값 백분위 확인

평균, 분산, 최대, 최소, 75% 값을 보면 데이터 분포가 왜곡되어 있다는것을 알 수 있음

  • 왜곡을 줄이기 위해 StandardScaler로 평균과 표준편차를 조정하여 K-평균을 수행

군집을 3개로 할 경우 실루엣 스코어는 나쁘지 않음

  • 군집 개수 별 실루엣 계수를 확인
  • 부록의 시각화 함수 사용

데이터 왜곡이 심하여 클러스터링이 의미가 없음

  • 데이터 세트의 왜곡 정도를 낮추기 위해 로그 변환을 시행

실루엣 스코어는 감소

  • 군집 개수 별 실루엣 계수를 확인

실루엣 스코어는 떨어졌지만, 데이터 군집화는 더 잘 이루어짐

- 결국, 다양한 방법의 데이터 군집화를 수행해가며 최적의 결과를 얻는 노력이 필요

반응형

'코딩 > Machine Learning' 카테고리의 다른 글

14. 텍스트 분석(Text Analytics)_2  (0) 2021.01.11
13. 텍스트 분석(Text Analytics)_1  (0) 2021.01.10
11. 차원 축소(Dimension Reduction)  (0) 2021.01.03
10. 회귀(Regression)_3  (0) 2021.01.02
9. 회귀(Regression)_2  (0) 2021.01.01

댓글