본문 바로가기

Data Science/Machine Learning

[핸즈온 머신러닝 2/E] 9장. 비지도 학습

드디어 "핸즈온 머신러닝 2/E" 교재를 Part 1(머신러닝 파트)까지 완독하였다!!

 

자, 그럼 이제 Part 1의 마지막 챕터인 "9장. 비지도 학습"에 대해서 정리해보도록 하겠다.

 

 

▶ 비지도 학습이란?

  • 우리가 사용할 수 있는 대부분의 데이터는 레이블이 없다.
  • 즉, 정답이 없는 데이터이기 때문에 지도 학습을 사용할 수가 없다.
  • 이러한 경우에 사용하는 방법이 바로 "비지도 학습"이다.
    • 대표적인 비지도 학습으로는 Clustering(군집 분석)이 있다.

 

 

▶ 군집 분석(Clustering)

  • 앞서 말했듯이, 군집 분석은 대표적인 비지도 학습이다.
  • 주의할 점은 "분류""군집"을 헷갈리면 안 된다는 것이다.
    • 아래의 그림을 참고하면, 분류와 군집을 구분할 수 있을 것이라고 생각한다.

분류(왼쪽) vs 군집(오른쪽)

  • 군집 분석은 다방면에서 활용될 수 있다.
    • 고객 분류
    • 데이터 분석 각 cluster별로 따로 분석!!
    • 차원 축소 지도 학습 알고리즘을 적용하기 전에 전처리 단계에서 활용 가능!!
    • 이상치 탐지
    • 준지도 학습 → 레이블이 없는 데이터가 많고, 레이블이 있는 데이터는 적은 경우에 사용
    • 검색 엔진
    • 이미지 분할 → 이미지를 여러 개의 segment로 분할하는 작업
  • Cluster에 대한 보편적인 정의는 따로 없으며, 군집 알고리즘에 따라 다른 종류의 cluster를 감지한다.

K-means 알고리즘

  • 이 알고리즘은 각 cluster의 중심을 찾고 가장 가까운 cluster에 샘플을 할당한다.
  • 사이킷런의 KMeans 클래스를 사용하면 된다.
    • 다만 한 가지 고려해야 할 부분은 알고리즘이 찾을 cluster 개수 k를 직접 지정해주어야 한다는 점이다.
    • 적절한 cluster 개수를 지정해주는 것이 쉬운 일이 아니다...

  • K-means 알고리즘은 cluster의 크기가 많이 다르면 잘 작동하지 않는다.
    • 샘플을 cluster에 할당할 때, centroid까지 거리를 고려해주는 것이 전부이기 때문이다.
  • 일반적으로 K-means 알고리즘은 속도가 빠르다.

<참고>

1. 하드 군집

  • 각 샘플에 대해 가장 가까운 cluster를 선택하는 것

2. 소프트 군집

  • Cluster마다 샘플에 점수를 부여하는 것
    • 그렇다면 여기서 말하는 점수란?
      • 샘플과 centroid 사이의 거리 (KMeans 클래스의 transform( ) 메소드를 통해 구할 수 있음)
      • 유사도 점수
  • 고차원 데이터 셋을 저차원으로 변환할 때, 매우 효율적인 비선형 차원 축소 기법이다.

<K-means 알고리즘의 작동 원리>

1. Centroid를 랜덤하게 초기화

2. 샘플에 레이블을 할당

3. Centroid 업데이트

4. 샘플에 다시 레이블을 할당

5. 최적으로 보이는 cluster에 도달할 때까지 위 과정들을 반복!!

K-means 알고리즘의 작동 원리

<Centroid 초기화 방법>

  • 한 가지 방법으로는 다른 군집 알고리즘을 먼저 실행해서 centroid 위치를 근사하게 파악해 볼 수 있다.
  • 또 다른 방법으로는 centroid 랜덤 초기화를 다르게 하여 여러 번 알고리즘을 실행하고, 최적의 솔루션을 선택하는 것이다.
    • 그렇다면 최적의 솔루션을 어떻게 알 수 있을까? 
      • 이 때 사용하는 성능 지표가 바로 모델의 이너셔(inertia)이다.
      • 모델의 이너셔(inertia)각 샘플과 가장 가까운 centroid 사이의 평균 제곱 거리를 의미한다.
      • 이너셔(inertia)가 낮을수록 좋은 모델이다.

<미니배치 k-means 알고리즘>

  • 전체 데이터 셋을 사용해 반복하지 않고, 각 반복마다 미니배치를 사용해서 centroid를 조금씩 이동하는 방법이다.
  • 이 알고리즘을 사용하면, 일반적으로 k-means 알고리즘의 속도를 3배에서 4배 정도 높일 수 있다.
    • 다만, 이너셔(inertia)는 일반적으로 k-means 알고리즘보다 안 좋다.
    • 특히 cluster의 개수가 증가할 때 위와 같은 현상이 발생한다.
  • 사이킷런의 MiniBatchKMeans 클래스를 사용하면 된다.

<최적의 cluster 개수 찾기>

  • 일반적으로 최적의 cluster 개수(k)를 지정해주는 것은 쉬운 일이 아니다.
    • 왜죠? 가장 작은 이너셔(inertia)를 가진 모델을 선택하면 되는 거 아닌가요? → No!!
    • Cluster가 늘어날수록 각 샘플은 가까운 centroid에 더 가깝게 된다. 따라서 이너셔(inertia)는 더 작아질 것이다!
  • 그러면 우리는 어떻게 최적의 cluster 개수를 찾아서 지정해줄 수 있을까?
    • 일반적으로 많이 사용하는 두 가지 방법은 다음과 같다.

1. 이너셔 그래프를 cluster 개수(k)의 함수로 그렸을 때, 그래프가 꺽이는 지점(Elbow) 찾기

  • 아래 그래프를 보면, k가 4까지 증가할 때 이너셔는 빠르게 감소한다.
  • 하지만 k가 계속 증가할수록 이너셔의 감소 폭은 크게 줄어드는 것을 알 수 있다.
  • 따라서 이 그래프가 꺽이는 지점. 즉, Elbow가 위치한 k 값을 최적의 cluster 개수로 지정해주면 된다.

이 그래프가 마치 사람의 팔꿈치를 닮았다고 하여 붙여진 이름 Elbow...

2. 실루엣 점수 및 실루엣 다이어그램

  • 물론 위의 Elbow 방법도 많이 사용하지만, 다소 주먹구구 식이라는 느낌이 든다.
  • 그리하여 나온 방법이 바로 "실루엣 점수"이다.
    • 이 값은 모든 샘플에 대한 실루엣 계수의 평균 값이다.
    • 샘플의 실루엣 계수"(b - a) / max(a, b)" 로 계산된다.
      • a : 동일한 cluster에 있는 다른 샘플까지의 평균 거리 (즉, cluster 내부의 평균 거리)
      • b : 가장 가까운 cluster까지의 평균 거리 (즉, 가장 가까운 cluster의 샘플까지 평균 거리)
    • 실루엣 계수-1에서 +1까지의 값을 가진다.
      • "+1"에 가까운 경우 : 해당 샘플이 cluster 안에 잘 속해 있고, 다른 cluster와는 멀리 떨어져 있다는 의미
      • "0"에 가까운 경우 : Cluster 경계에 위치한다는 의미
      • "-1"에 가까운 경우 : 해당 샘플이 잘못된 cluster에 할당되었다는 의미
  • 실루엣 점수를 계산하려면 사이킷런의 silhouette_score( ) 함수를 사용하면 된다.

위 그래프를 보면 최적의 cluster 개수(k)가 4임을 알 수 있다.

  • 실루엣 점수와 더불어, 실루엣 다이어그램을 그려보면 더 많은 정보를 얻을 수 있다.
    • 각 cluster마다 칼 모양의 그래프가 그려진다.
    • 칼 모양 그래프의 높이 : Cluster가 포함하고 있는 샘플의 개수
    • 칼 모양 그래프의 너비 : Cluster에 포함된 샘플의 정렬된 실루엣 계수 (따라서 넓을수록 좋음)
    • 수직 파선 : 각 cluster 개수에 해당하는 실루엣 점수

위 실루엣 다이어그램을 통해 최적의 cluster 개수(k)는 4와 5라고 판단할 수 있다.

<K-means 알고리즘의 한계>

  • K-means 알고리즘은 속도가 빠르고 확장이 용이하다는 장점을 갖고 있다.
  • 하지만 최적의 cluster 개수(k)를 직접 지정해줘야 한다는 점, 그리고 최적의 솔루션에 도달하지 못하는 문제를 해결하기 위해 알고리즘을 여러 번 실행해주어야 한다는 점이 꽤나 번거롭다.
  • 또한 k-means 알고리즘은 cluster의 크기나 밀집도가 서로 다르거나, 원형이 아닐 경우(타원형 등과 같은 경우) 잘 작동하지 않는다.
    • 참고로 타원형 cluster에서는 가우시안 혼합 모델(GMM)이 잘 작동한다.
  • 마지막으로 k-means 알고리즘을 실행하기 전입력 특성의 스케일을 맞춰주는 것은 굉장히 중요하다.

DBSCAN

  • 밀도 기반 군집화의 대표적인 알고리즘이다.
  • <장점>
    • 데이터의 분포가 기하학적으로 복잡한 데이터 셋에도 효과적인 군집화가 가능하다.
      • 즉, cluster의 모양과 개수에 상관없이 감지할 수 있는 능력이 뛰어나다.
      • 따라서 이상치에 안정적이다.
    • 사전에 cluster 개수를 지정할 필요가 없다.
  • <단점>
    • 데이터 밀도가 자주 변하거나, 아예 모든 데이터의 밀도가 크게 변하지 않으면 성능이 떨어진다.
    • 특성(feature)의 개수가 많으면 성능이 떨어진다.
    • 새로운 샘플에 대해 cluster를 예측할 수 없다.
      • 따라서 사용자가 필요한 예측기를 선택해야 한다.
  • DBSCAN의 작동 원리에 대한 자세한 설명"파이썬 머신러닝 완벽 가이드" 교재를 참고하면 좋다!!
    • "핸즈온 머신러닝 2/E" 교재보다 설명이 자세하게 나와있다...
  • DBSCAN을 구성하는 가장 중요한 두 가지 파라미터는 다음과 같다.
    • 입실론 주변 영역(epsilon) : 개별 데이터를 중심으로 입실론 반경을 가지는 원형의 영역
      • 사이킷런의 eps 파라미터
    • 최소 데이터 개수(min points) : 개별 데이터의 입실론 주변 영역에 포함되는 타 데이터의 개수
      • 사이킷런의 min_samples 파라미터
    • 위 두 개의 파라미터를 통해 최적의 군집을 찾는 게 중요하다.

◆ 다른 군집 알고리즘

1. 병합 군집

2. BIRCH

3. Mean-Shift (평균-이동)주로 "영상 처리" 분야에서 사용함. 자세한 내용은 "파이썬 머신러닝 완벽 가이드" 참고!

4. 유사도 전파

5. 스펙트럼 군집

 

 

▶ 가우시안 혼합 모델(GMM)

  • 군집화를 적용하고자 하는 데이터가 여러 개의 가우시안 분포(정규분포)를 가진 데이터 집합들이 섞여서 생성된 것이라는 가정 하에 군집화를 수행하는 방식이다.
    • 하나의 가우시안 분포에서 생성된 모든 샘플은 하나의 cluster를 형성한다.
    • 일반적으로 이 cluster는 타원형이다.
  • K-means 알고리즘의 단점을 보완해줄 수 있는 모델이다.
    • GMM은 k-means보다 유연하게 다양한 데이터 셋에 잘 적용될 수 있다. (그러나 수행 시간이 오래 걸림)
  • 이상치 탐지에도 사용할 수 있다.
  • 사이킷런의 GaussianMixture 클래스를 사용해서 구현이 가능하다.
    • 단, GMM의 경우 cluster 개수(k)를 지정해주어야 한다.
    • 그렇다면 cluster의 개수(k)를 어떻게 지정해주면 좋을까? (즉, GMM의 성능 지표는 무엇일까?)
    • AIC, BIC와 같은 이론적 정보 기준을 최소화 하는 모델을 선택!!

BIC와 AIC 계산 식

위 식을 이해하려면 MLE에 대한 개념이 필요한데, 이번 포스팅에서는 따로 설명하지 않도록 하겠다.

(수리통계학에 대한 내용으로 넘어가야 하기 때문에...)

간단하게 말하면 "AIC 및 BIC 최소화하는 모델을 선택해야 하는데,

그러려면 가능도 함수 최대화해야 되겠구나!!" 정도로만 이해하고 넘어가도록 하자.

 

 

<EM(기댓값-최대화) 알고리즘>

  • GMM의 모수를 추정하기 위해 사용하는 알고리즘이다.
    • 여기서 말하는 모수 추정은 대표적으로 다음의 2가지를 추정하는 것이다.
      • 개별 정규 분포의 평균과 분산
      • 각 데이터가 어떤 정규분포에 해당되는지의 확률

<Step 1> Expectation

  • 개별 데이터 각각에 대해서 특정 정규 분포에 소속될 확률을 구하고, 가장 높은 확률을 가진 정규분포에 소속시킨다.
    • 최초 시에는 데이터들을 임의로 특정 정규분포로 소속시킨다.

<Step 2> Maximization

  • 데이터들이 특정 정규분포로 소속되면, 다시 해당 정규분포의 평균(모수)과 분산(모수)을 구한다.
    • 해당 데이터가 발견될 수 있는 가능도(likelihood)를 최대화할 수 있도록 평균(모수)과 분산(모수)을 구한다.
    • 여기서 MLE 개념이 나오네...(즐거웠던 "수리통계학" 강의 시간이 떠오르네 ㅎ)

<Step 3>

  • 개별 정규분포의 모수인 평균과 분산이 더 이상 변경되지 않고, 각 개별 데이터들의 이전 정규분포 소속이 더 이상 변경되지 않으면, 그것으로 최종 군집화를 결정한다.
  • 그렇지 않으면 계속 EM 반복을 수행한다.

GMM과 EM 알고리즘

 

 

▶ 이상치 탐지와 특이치 탐지를 위한 다른 알고리즘

  1. PCA 이상치 탐지 기법
  2. Fast-MCD 이상치 탐지 기법
  3. 아이솔레이션 포레스트 이상치 탐지 기법
  4. LOF(Local Outlier Factor) 이상치 탐지 기법
  5. One-class SVM 특이치 탐지 기법

<참고>

  • 교재에는 "베이즈 가우시안 혼합 모델"에 대한 내용도 나와있었으나, 내용이 너무 어렵고 이해도 잘 되지 않아서 일단 이번 포스팅에서는 다루지 않았다.

 

이번 "9장. 비지도 학습"을 끝으로, "핸즈온 머신러닝 2/E" 교재 Part 1(머신러닝 파트)에 대한 포스팅을 모두 마치도록 하겠다.

 

"핸즈온 머신러닝 2/E 교재 Part 2(딥러닝 파트)"는 딥러닝에 대한 기초를 갈고 닦은 후에 공부할 예정이다.

 

★ 참고 자료

- 핸즈온 머신러닝 2/E 교재

- 파이썬 머신러닝 완벽 가이드 교재