본문 바로가기

Study/Introduction to ML with python - 한빛

[Book] 3. 비지도학습과 데이터 전처리 - (3)

Book Title : Introduction to Machine Learning with Python

- 파이썬 라이브러리를 활용한 머신러닝 -

 

지은이 : 안드레아스 뮐러, 세라 가이도

옮긴이 : 박해선

출판사 : 한빛미디어

코드 출처

https://github.com/rickiepark/introduction_to_ml_with_python

 

GitHub - rickiepark/introduction_to_ml_with_python: 도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의

도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의 주피터 노트북과 코드입니다. Contribute to rickiepark/introduction_to_ml_with_python development by creating an account on GitHub.

github.com


3.5 군집

  • 데이터셋을 클러스터라는 그룹으로 나누는 작업
  • 분류 알고리즘과 비슷하게 각 데이터 포인트가 어느 클러스터에 속하는지 할당(또는 예측)
  • 군집은 각 데이터 포인트가 레이블을 가지는 점에서 분류와 비슷
  • 그러나 정답을 모름, 레이블 자체에 어떤 의미가 있지 않음

3.5.1 k-평균 군집

  • 간단하며 쉽게 사용
  • 데이터의 어떤 영역을 대표하는 클러스터 중심(cluster-center)을 찾음

단계

  1. 데이터 포인트를 가장 가까운 클러스터 중심에 할당
  2. 클러스터에 할당된 데이터 포인트의 평균으로 클러스터 중심을 다시 지정 (클러스터에 할당되는 포인트에 변화가 없을 때 알고리즘 종료)
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

X, y = make_blobs(random_state = 1)
kmeans = KMeans(n_clusters = 3)
kmeans.fit(X)

mglearn.discrete_scatter(X[:, 0], X[:, 1], kmeans.labels_, markers = 'o')
mglearn.discrete_scatter(
    kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], [0, 1, 2], markers ='^', markeredgewidth = 2)

k-평균 알고리즘이 실패하는 경우

  • 데이터셋의 클러스터 개수를 정확하게 알더라도 항상 구분해낼 수 있는 건 아님
  • 각 클러스터를 정의하는 것이 중심 하나뿐이므로 클러스터는 둥근 형태로 나타남

예시 ) 복잡한 형태의 two_moon 데이터셋

해당 데이터셋은 k-평균 알고리즘으로 군집시키는건 어려움


3.5.2 병합 군집(augglomertative)

  • 시작할 떄때 각 포인트를 하나의 클러스터로 지정하고, 그다음 어떤 종료 조건을 만족할 때까지 가장 비슷한 두 클러스터를 합쳐나감
  • 사이킷런에서 사용하는 종료 조건은 클러스터 개수

사이킷런에 구현된 옵션

ward

모든 클러스터 내의 분산을 가장 작게 증가시키는 두 클러스터를 합침

대부분의 데이터셋에 알맞음

average

클러스터 포인트 사이의 평균 거리가 가장 짧은 두 클러스터를 합침

한 클러스터가 다른 것보다 매우 클 때 ward보다 나을 수 있음

complete

클러스터 포인트 사이의 최대 거리가 가장 짧은 두 클러스터를 합침

한 클러스터가 다른 것보다 매우 클 때 ward보다 나을 수 있음

 

세 개의 클러스터를 찾기 위한 병합 군집 과정

  1. 초기에는 각 포인트가 하나의 클러스터
  2. 각 단계에서 가장 가까운 두 클러스터가 합쳐짐
  3. 네 번째 단계까지 포인트가 하나뿐인 클러스터 두 개가 합쳐져서  두 개의 포인트를 가진 클러스터가 됨
  4. 5단계에서 두 개의 포인트를 가진 클러스터 중 하나가 세 개의 포인트로 확장
  5. 이렇게 9단계에 이르면 클러스터가 세 개만 남음
  6. 3개의 클러스터를 찾으면 알고리즘은 멈춤

3.5.3 DBSCAN(Density-Based Spatial Clustering Of Applications with Noise)

  • 클러스터 개수를 미리 지정할 필요가 없는 장점을 가짐
  • 복잡한 형상도 찾을 수 있음
  • 어떤 클래스에도 속하지 않는 포인트를 구분할 수 있음
  • 병합 군집이나 k-평균보다는 다소 느리지만 큰 데이터셋에도 작용

과정

  1. 무작위로 포인트를 선택
  2. 그런 다음 그 포인트에서 eps 거리 안의 모든 포인트를 찾음
  3. eps 거리 안에 있는 포인트 수가 min_sampleds 보다 적다면 그 포인트는 잡음(noise)으로 처리
  4. eps 거리 안에 min_samples 보다 많은 포인트가 있다면 그 포인트는 핵심 샘플로 처리하고 새로운 클러스터 레이블을 할당
  5. 그런 다음 그 포인트의 모든 이웃을 살핌
  6. 만약 어떤 클러스터에도 속하지 않는 경우 전에 만든 클러스터 레이블 할당
  7. 만약 핵심 샘플이면 그 포인트의 이웃을 차례로 방문
  8. 위 과정을 계속반복해 클러스터는 eps 거리 안에 더 이상 핵심 샘플이 없을 때 까지 자라남

포인트의 종류

  1. 핵심 포인트
  2. 경계 포인트(핵심 포인트에서 eps 거리안에 있는 포인트)
  3. 잡음 포인트
X, y = make_moons(n_samples = 200, noise = 0.05)

scaler = StandardScaler()
scaler.fit(X)
X_scaled = scaler.transform(X)
dbscan = DBSCAN()
clusters = dbscan.fit_predict(X_scaled)

plt.scatter(X_scaled[:, 0],X_scaled[:, 1], c = clusters, cmap =mglearn.cm2, s = 60, edgecolors = 'black')

  • k 평균 알고리즘과는 다르게 두 개의 반달 모양을 정확히 구분

3.5.4 군집 알고리즘 비교 평가

타깃 값으로 군집 평가하기
  • 군집 알고리즘의 결과를 실제 정답 클러스터와 비교하여 평가할 수 있는 지표들이 있음
  • ARI(adjusted rand index) , NMI(Normalized Mutual Information)
타깃 값 없이 군집 평가하기
  • 군집용 지표로 실루엣 계수(Silhoueete Coefficient)가 있음
  • 클러스터의 밀집 정도를 계산, 높을 수록 좋으며 최대 점수는 1
  • 밀집된 클러스터가 좋긴 하지만 모양이 복잡할떄는 잘 맞지 않음