본문 바로가기
인공지능(AI)/머신러닝

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

by hyezzisss 2022. 2. 7.
  • 군집 : 비슷한 샘플을 클러스터로 모은다
  • 이상치 탐지 : 정상 데이터가 어떻게 보이는지 학습
  • 밀도 추정 : 데이터셋 생성 확률 과정의 확률 밀도 함수를 추정

1. 군집


  • 비슷한 샘플을 구별해 하나의 클러스터 또는 비슷한 샘플 그룹으로 할당하는 작업
  • 사용 예
    • 고객 분류
    • 데이터 분석
    • 차원 축소 기법
    • 이상치 탐지
    • 준지도 학습
    • 검색 엔진
    • 이미지 분할

1) k-평균

  • 각 클러스터의 중심을 찾고 가장 가까운 클러스터에 샘플을 할당
from sklearn.cluster import KMeans

k=5
kmeans = KMeans(n_clusters=k)
y_pred = kmeans.fit_predict(X)
  • 클러스터의 크기가 많이 다르면 잘 작동하지 않음 -> 샘플은 클러스터에 할당할 때 센트로이드까지 거리를 고려하는 것이 전부이기 때문
  • 사용하는 성능지표로 이니셔는 각 샘플과 가장 가까운 센트로이드 사이의 평균 제곱 거리임

k-평균 속도 개선과 미니배치 k-평균

  • 삼각 부등식을 사용하여 불필요한 거리 계산을 피해 알고리즘 속도를 상당히 높일 수 있음
  • 각 반복마다 미니배치를 사용해 전체 센트로이드를 조금씩 이동 -> 일반적으로 알고리즘의 속도를 3~4배 높임
  • 미니배치 k-평균 알고리즘이 일반 k-평균 알고리즘보다 훨씬 빠르지만 이니셔는 일반적으로 더 나쁨 (특히 클러스터 개수가 증가할 때)

최적의 클러스터 개수 찾기

  • 실루엣 점수: 모든 샘플에 대한 실루엣 계수의 평균
    • 실루엣 계수 +1 : 자신의 클러스터 안에 잘 속해 있고 다른 클러스터와는 멀리 떨어져 있다는 뜻
# 실루엣 점수 계산
from sklearn.metrics import silhouette_score
silhouette_score(X, kmeans.labels_)
  • 실루엣 다이어그램: 모든 샘플의 실루엣 계수를 할당된 클러스터와 계숫값으로 정렬한 그래프 (넓을수록 좋음)

2) k-평균의 한계

  • 속도가 빠르고 확장이 용이하다는 장점이 있지만 최적이 아닌 솔루션을 피하려면 알고리즘을 여러 번 실행해야 함
  • 클러스터 개수를 지정해야 함
  • 클러스터의 크기나 밀집도가 다르거나 원형이 아닐 경우 잘 작동하지 않음
    • 타원인 경우에는 가우시안 혼합 모델이 잘 작동
  • 실행 전 입력 특성의 스케일을 맞추는 것이 중요

3) 군집을 활용한 이미지 분할

X = image.shape(-1, 3)
kmeans = KMeans(n_cluster=8).fit(X)
segmented_img = kmeans.cluster_centers_[kmeans.labels_]
segmented_img = segmented_img.reshape(image.shape)

4) 군집을 사용한 전처리

from sklearn.pipeline import Pipeline

pipeline = Pipeline([
	("kmeans", KMeans(n_clusters=50)),
    	("log_reg", LogisticRegression()),
])
pipeline.fit(X_train, y_train)

5) 군집을 사용한 준지도 학습

  • 대표 이미지: 각 클러스터에서 센트로이드에 가장 가까운 이미지
k = 50
kmeans = KMeans(n_cluster=k)
X_digits_dist = kmeans.fit_transform(X_train)
representative_digit_idx = np.argmin(X_digits_dist, axis=0)
X_representative_digits = X_train[representative_digit_idx]

6) DBSCAN

  • 알고리즘이 각 샘플에서 작은 거리인 입실론 내에 샘플이 몇 개 놓여있는지 셈
  • 이웃 내에 min_samples개 샘플이 있다면 이를 핵심 샘플로 간주 -> 즉 핵심 샘플은 밀집된 지역에 있는 샘플
  • 핵심 샘플의 이웃은 동일한 클러스터에 속함
  • 핵심 샘플이 아니고 이웃도 아닌 샘플은 이상치로 판단
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons

X,y = make_moon(n_sample=1000, noise=0.05)
dbscan = DBSCAN(eps=0.05, min_samples=5)
dbscan.fit(X)
print(dbscan.labels_) # 모든 샘플의 레이블
  • predict()를 제공하지 않고 fit_predict()를 제공 -> 새로운 샘플에 대해 클러스터 예측 불가

7) 다른 군집 알고리즘

  • 병합 군집 : 클러스터 계층을 밑바닥부터 위로 쌓아 구성
  • BIRCH : 특별히 대규모 데이터셋을 위해 고안 -> 특성 개수가 너무 많지 않으면(20개 이하) 배치 K-평균보다 빠르고 비슷함
  • 평균-이동 : 각 샘플을 중심으로 하는 원을 그린 후 포함된 모든 샘플의 평균을 구한 뒤 원의 중심을 평균으로 이동하며 대규모 데이터셋에는 적합하지 않음
  • 유사도 전파 : 튜표 방식을 사용하며 대규모 데이터셋에는 적합하지 않음
  • 스펙트럼 군집 : 샘플 사이의 유사도 행렬을 받아 저차원 임베딩을 만든 후 또 다른 군집 알고리즘을 사용

2. 가우시안 혼합


  • 샘플이 파라미터가 알려지지 않은 여러 개의 혼합된 가우시안 분포에서 생성되었다고 가정하는 확률 모델
  • 하나의 가우시안 분포에서 생성된 모든 샘플은 하나의 클러스터를 형성하며 일반적으로 이 클러스터는 타원형
from sklearn.mixture import GaussianMixture

gm = GaussianMixture(n_components=3, n_init=10)
gm.fit(X)
  • 하드 군집 : 새로운 샘플을 가장 비슷한 클러스터에 손쉽게 할당 -> predict()
  • 소프트 군집 : 특정 클러스터에 속할 확률을 예측 -> predict_proba()
  • covariance_type 매개변수 : 클러스터 모양과 범위를 제한하는 매개변수

1) 가우시안 혼합을 사용한 이상치 탐지

  • 이상치 탐지 : 보통과 많이 다른 샘플을 감지하는 작업
  • 가우시안 혼합 모델을 사용하는 방법은 밀도가 낮은 지역에 있는 모든 샘플을 이상치로 볼 수 있음 -> 밀도 임곗값을 정해야 함
densities = gm.score_samples(X)
density_threshold = np.percentile(densities, 4) # 4%를 밀도 임곗값으로 사용
anomalies = X[densities < density_threshold]
  • 특이치 탐지 : 이상치로 오염되지 않은 깨끗한 데이터셋에서 훈련한다는 것이 이상치 탐지와 다름

2) 클러스터 개수 선택하기

  • k-평균처럼 GaussianMixture 알고리즘은 클러스터의 개수를 지정해야 함
  • k-평균에서는 이너셔나 실루엣 점수를 사용해 적절한 클러스터 개수를 정하지만 가우시안 혼합에서는 사용 불가 -> BICAIC와 같은 이론적 정보 기준을 최소화하는 모델을 찾음
gm.bic(X)
gm.aic(X)

3) 베이즈 가우시안 혼합 모델

  • BayesianGaussianMixture 클래스 : 최적의 클러스터 개수를 수동으로 찾지 않고 불필요한 클러스터의 가중치를 0으로 만듦
    • n_components를 최적의 클러스터 개수보다 크다고 믿을 만한 값으로 지정
from sklearn.mixture import BayesianGaussianMixture
bgm = BayesianGaussianMixture(n_components=10, n_init=10) # 클러스터 개수를 10으로 설정
bgm.fit(X)
np.round(bgm.weights_, 2)

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

  • PCA
  • Fast-MCD : 데이터셋 정제할 때 사용
  • 아이솔레이션 포레스트 : 고차원 데이터셋에서 이상치 감지를 위한 효율적인 알고리즘
  • LOF : 주어진 샘플 주위의 밀도와 이웃 주위의 밀도를 비교
  • one-class SVM : 특이치 탐지에 잘 맞음

 

 

댓글