4. 평균 이동 Mean shift

: K-평균과 유사하게, 군집의 중심을 지속적으로 움직이면서 군집화를 수행함
: 그러나, K-평균이 중심에 소속된 데이터의 평균 거리 중심으로 이동하는데 반해,
: 평균 이동은 데이터가 모여있는 밀도가 가장 높은 곳으로 이동시키면서 군집화하는 방법

  • 평균 이동 군집화는 데이터의 분포도를 이용해 군집 중심점을 찾음

    • 군집 중심점은 데이터 포인트가 모여있는 곳이라는 생각에서 착안

    • 이를 위해 확률 밀도 함수를 이용 함

    • 확률 밀도 함수가 피크인 점(가장 집중적으로 데이터가 모여 있을)을 군집 중심점으로 선정하며

    • 주어진 모델의 확률 밀도 함수를 찾기 위해서 KDE(Kernel Density Estimation)을 이용

    • 주변 데이터와의 거리 값을 KDE 함수 값으로 입력한 뒤, 그 반환 값을 현재 위치에서 업데이트하면서 이동하는 방식

  • KDE(Kernel Density Estimation)

    : 커널 함수를 통해 어떤 변수의 확률 밀도 함수를 추정하는 대표적인 방법

    : 개별 데이터 각각에, 커널 함수를 적용한 값을 모두 더한 뒤 데이터 건수로 나눠 확률 밀도 함수를 추정한다.

    • 확률 밀도 함수 PDF(Probability Density Function)

      : 확률 변수의 분포를 나타내는 함수 (정규 분포, 감마 분포, t-분포 등)

      • 확률 밀도 함수를 알면 특정 변수가 어떤 값을 갖게 될지에 대한 확률을 알게 되므로, 이를 통해 변수의 특성, 확률 분포 등 변수의 많은 요소를 알 수 있다.
    • 커널 함수의 예시) 가우시안 커널 함수 적용

    • 수식

      KDE=1ni=1nKh(xxi)=1nhi=1nK(xxih)KDE = {1\over n}\sum_{i=1}^nK_h(x-x_i) = {1\over nh}\sum_{i=1}^nK({x-x_i\over h})
      • KK : 커널 함수, xx : 확률 변수 값, xix_i : 관측값, hh : 대역폭(bandwidth)

      • 대역폭 hh : KDE 형태를 부드럽거나 뾰족한 형태로 평활화(smoothing)하는데 적용
        - 작은 hh 값: 좁고 뾰족한 KDE를 가짐. 과적합 되기 쉬움. 많은 수의 군집 중심점을 가짐
        - 큰 hh 값: 과도하게 평활화된 KDE를 가짐. 과소적합 되기 쉬움. 적은 수의 군집 중심점을 가짐

        ⇒ 적절한 h를 계산하는 것이 KDE 기반의 평균 이동에서 매우 중요하다.

  • 사용

    import numpy as np
    from sklearn.datasets import make_blobs
    from sklearn.cluster import MeanShift
    
    X, y = make_blobs(n_samples=200, n_features=2, centers=3, 
                      cluster_std=0.7, random_state=0)
    
    meanshift= MeanShift(bandwidth=0.8)
    cluster_labels = meanshift.fit_predict(X)
    print('cluster labels 유형:', np.unique(cluster_labels))
    
    > cluster labels 유형: [0 1 2 3 4 5]
    
    meanshift= MeanShift(bandwidth=1) # bandwidth 변경
    cluster_labels = meanshift.fit_predict(X)
    print('cluster labels 유형:', np.unique(cluster_labels))
    
    > cluster labels 유형: [0 1 2]
    • bandwidth (=KDE의 h) 값을 작게 할수록 군집 개수가 많아진다.
  • ⭐️ estimate_bandwidth(X) ⭐️ : 최적의 대역폭 hh 찾아줌. 파라미터로 피처 데이터 세트(X) 입력

    from sklearn.cluster import estimate_bandwidth
    
    # estimate_bandwidth()로 최적의 bandwidth 계산
    bandwidth = estimate_bandwidth(X)
    print('bandwidth 값:', round(bandwidth,3))
    
    > bandwidth 값: 1.816
    
    ------------------------------------------------------------
    import pandas as pd
    
    clusterDF = pd.DataFrame(data=X, columns=['ftr1', 'ftr2'])
    clusterDF['target'] = y
    
    # estimate_bandwidth()로 최적의 bandwidth 계산
    best_bandwidth = estimate_bandwidth(X)
    
    meanshift= MeanShift(bandwidth=best_bandwidth)
    cluster_labels = meanshift.fit_predict(X)
    print('cluster labels 유형:',np.unique(cluster_labels))
    
    > cluster labels 유형: [0 1 2]
  • 평균 이동의 장점

    • 데이터 세트의 형태를 특정 형태로 가정한다든가, 특정 분포 기반의 모델로 가정하지 않기 때문에 유연한 군집화 가능
    • 이상치의 영향력도 크지 않으며, 미리 군집의 개수를 정하지 않아도 된다.
  • 평균 이동의 단점

    • 수행 시간이 오래 걸리고, bandwidth의 크기에 따른 군집화 영향도가 크다.
  • 활용

    • 컴퓨터 비전 영역에서 많이 사용
    • 이미지나 영상 데이터에서, 특정 개체를 구분하거나 움직임을 추적하는데 뛰어난 역할

5. GMM(Gaussian Mixture Model) (확률 기반 군집화)

: 군집화를 적용하고자 하는 데이터가, 여러 개의 가우시안 분포를 가진 데이터 집합들이 섞여서 생성된 것이라는 가정하에, 군집화를 수행하는 방식


  • 정규분포: 평균 μ\mu를 중심으로 높은 데이터 분포도를 가지고 있으며, 좌우 표준편차 1에 전체 데이터의 68.27%, 좌우 표준편차 2에 전체 데이터의 95.45%를 갖고 있다.
  • 표준 정규 분포: 평균이 0, 표준편차가 1인 정규분포
  • 섞인 데이터 분포에서 개별 유형의 가우시간 분포 추출, 개별 데이터가 이 중 어떤 정규분포에 속하는지 결정하는 방식

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

    • 가령 1,000개의 데이터 세특 있다면, 이를 구성하는 여러 개의 정규 분포 곡선을 추출
    • 개별 데이터가 이 중 어떤 정규 분포에 속하는지 결정하는 방식
  • 사용

    from sklearn.mixture import GaussianMixture
    
    gmm = GaussianMixture(n_components=3, random_state=0).fit(iris.data)
    gmm_cluster_labels = gmm.predict(iris.data)
    
    # 클러스터링 결과를 irisDF 의 'gmm_cluster' 컬럼명으로 저장
    irisDF['gmm_cluster'] = gmm_cluster_labels
    irisDF['target'] = iris.target
    
    # target 값에 따라서 gmm_cluster 값이 어떻게 매핑되었는지 확인. 
    iris_result = irisDF.groupby(['target'])['gmm_cluster'].value_counts()
    print(iris_result)
    
    > target  gmm_cluster
    > 0       0              50
    > 1       2              45
    >         1               5
    > 2       1              50
    > Name: gmm_cluster, dtype: int64
    • n_components: 모델의 총 개수. 군집의 개수를 정하는데 중요한 역할 수행
    • fit(피처 데이터 세트), predict(피처 데이터 세트)를 수행해 군집을 결정
  • 장점 : KMeans보다 유연하게 다양한 데이터 세트에 잘 적용될 수 있다. (Not 원형 범위여도 작동 잘 함)

    • 성능이 더 좋다는 뜻이 아니라, K-평균은 평균 거리 중심을 이동하면서 군집화를 수행하여,
      개별 군집 내의 데이터가 원형으로 흩어져 있는 경우에 매우 효과적으로 군집화가 수행될 수 있음
      ⇒ 데이터 세트 구성에 따라 성능 달라짐
      - 따라서 K-평균은 길쭉한 타원형으로 늘어선 경우에는 군집화를 잘 수행하지 못함
  • 단점 : 수행시간이 오래 걸린다.

6. DBSCAN(Density Based Spatial Clustering of Applications with Noise) (밀도 기반 군집화)

: 입실론 주변 영역의 최소 데이터 갯수를 포함하는 밀도 기준을 충족시키는 데이터인, 핵심 포인트를 연결하면서 군집화를 구성하는 방식
: 데이터의 분포가 기하학적으로 복잡한 데이터 세트에도 효과적으로 군집화 가능

  • 수행 방법

    1. P1 데이터 기준으로 입실론 반경(eps=0.6)내에 포함한 데이터(min_samples=6)가 7개 (자신 P1 포함하여, 이웃 데이터 P2, P6, P7, P9, P11)로 최소 6개 이상을 만족하므로 P1은 핵심 포인트(Core Point)
    2. 다음으로 P2 데이터를 보면, P2 역시 반경 내에 6개 (자신 P2, P1, P3, P4, P9, P10) 데이터를 갖고 있으므로 핵심 포인트
    3. 핵심 포인트 P1의 이웃 ↔ 데이터 포인트 P2 역시 핵심 포인트일 경우 ⇒ P1에서 P2를 연결하여 [직접 접근]
    4. 특정 핵심 포인트에서 [직접 접근]이 가능한 다른 핵심 포인트들을 서로 연결하면서 군집화를 구성 ⇒ 이런 군집화 영역을 확장해나가는 것이 DBSCAN의 군집화 방식
    5. P3 데이터의 경우, 이웃 데이터로 P2, P4 2개이므로 군집을 구분할 수 있는 핵심포인트는 될 수 없음
      1. 하지만 이웃 데이터 중에 핵심 포인트인 P2를 가지고 있음
      2. 이렇게, 자신은 핵심 포인트가 아니지만, 이웃 데이터로 핵심 포인트를 가지고 있는 데이터를 경계 포인트(Border Point)라고 부름
      3. 경계 포인트는 군집의 외곽을 형성
    6. P5와 같이 반경내 최소 데이터를 갖고 있지도 않고, 핵심 포인트를 이웃 데이터로 가지고 있지 않은 데이터를 잡음 포인트(Noise Point)라고 함
    • 핵심 포인트(core point) : 주변 영역 내 최소 데이터 갯수 이상의 타 데이터를 가지고 있을 경우
    • 이웃 포인트(neighbor point): 주변 영역 내에 위치한 타 데이터
    • 경계 포인트(border point): 주변 영역 내에 최소 데이터 개수 이상의 이웃 포인트를 가지고 있지 않지만 핵심 포인트를 갖고 있는 데이터
    • 잡음 포인트(noise point): 최소 데이터 개수 이상의 이웃 포인트를 가지고 있지 않으며, 핵심 포인트도 갖고 있지 않은 데이터
  • 사용

    from sklearn.cluster import DBSCAN
    
    dbscan = DBSCAN(eps=0.6, min_samples=8, metric='euclidean')
    dbscan_labels = dbscan.fit_predict(iris.data)
    
    irisDF['dbscan_cluster'] = dbscan_labels
    irisDF['target'] = iris.target
    
    iris_result = irisDF.groupby(['target'])['dbscan_cluster'].value_counts()
    print(iris_result)
    
    > target  dbscan_cluster
    > 0        0                49
    >         -1                 1
    > 1        1                46
    >         -1                 4
    > 2        1                42
    >         -1                 8
    > Name: dbscan_cluster, dtype: int64
    
    # 군집 레이블이 -1인 것은 노이즈에 속하는 군집을 의미
    • 군집 레이블이 -1인 것은 노이즈에 속하는 군집을 의미
    • Target 유형이 3가지 인데, 군집이 2개가 됐다고 군집화 효율이 떨어진다는 의미는 아님
      • DBSCAN은 군집의 갯수를 알고리즘에 따라 자동으로 지정하므로, DBSCAN에서 군집의 갯수를 지정하는 것은 무의미
      • 원래 iris 데이터의 경우는 군집을 3개로 하는 것 보다, 2개로 하는 것이 군집화의 효율로서 더 좋은 면도 실제로 있음
  • 파라미터

    파라미터설명
    eps입실론(epsilon)

    개별 데이터를 중심으로 입실론 반경을 가지는 원형의 영역
    일반적으로 1 이하의 값 설정 |
    | min_samples | 최소 데이터 개수(min points)
    개별 데이터의 입실론 주변 영역에 포함되는 타 데이터의 개수 (자기 자신 포함) |

    • eps 값을 크게 하면, 반경이 커져 포함하는 데이터가 많아지므로 노이즈 데이터 개수가 작아진다.
    • min_samples를 크게 하면, 주어진 반경 내에서 더 많은 데이터를 포함시켜야 하므로 노이즈 데이터 개수가 커진다.

DBSCAN 적용하기 - make_circles() 데이터 세트 +- 비교하기

  • make_circles() 원본

    • make_circles는 내부 원과 외부 원으로 구분되는 데이트 세트를 생성해줌
  • Kmeans (거리기반 군집화)

    • 거리를 기반으로, 위, 아래 군집 중심을 기반으로 군집화 됨
  • GMM (확률 기반 군집화)

    • 일렬로 늘어선 데이터 세트(타원형)에서는 효과적으로 군집화 적용이 가능했으나,
    • 내부와 외부의 원형으로 구성된 더 복잡한 형태의 데이터 세트에서는 군집화가 원하는 방향으로 되지 않았음
  • DBSCAN

    • 는 정확히 군집화가 됐음

7. 실습

군집화 실습 : 고객 세그먼테이션

  • 비지도학습 알고리즘의 하나인 군집화의 기능적 의미 ⇒ 숨어 있는 새로운 집단을 발견하는 것
    • 새로운 군집 내의 데이터 값을 분석하고 이해함으로써, 집단에 새로운 의미를 부여하고
    • 전체 데이터를 다른 각도로 바라볼 수 있게 만들어줌

8. 정리

: 각 군집화 기법은 나름의 장/단점을 가지고 있으며, 군집화 하려는 데이터의 특성에 맞게 선택해야 한다.

  • KMeans: 거리 기반으로 군집 중심점을 이동시키며 군집화 수행. 평가는 실루엣 계수 이용
  • MeanShift: 거리 중심X, 데이터가 모여 있는 밀도가 가장 높은 쪽으로 군집 중심점을 이동하며 군집화 수행
  • GMM: 전체 데이터 세트에서 서로 다른 정규 분포 형태를 추출해 다른 정규 분포를 가진 데이터 세트를 각각 군집화
  • DBSCAN: 밀도 기반. 입실론 주변 영역 내에 포함되는 최소 데이터 개수의 충족 여부에 따라 데이터 포인트를 핵심 포인트, 이웃 포인트, 경계 포인트, 잡음 포인트로 구분하고 특정 핵심 포인트에서 직접 접근이 가능한 다른 핵심 포인트를 서로 연결하면서 군집화를 구성하는 방식
profile
mios의 데이터 놀이터 | Instagram@data.decision (하단 홈 아이콘 버튼)

0개의 댓글