- 군집 : 비슷한 샘플을 클러스터로 모은다
- 이상치 탐지 : 정상 데이터가 어떻게 보이는지 학습
- 밀도 추정 : 데이터셋 생성 확률 과정의 확률 밀도 함수를 추정
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-평균에서는 이너셔나 실루엣 점수를 사용해 적절한 클러스터 개수를 정하지만 가우시안 혼합에서는 사용 불가 -> BIC나 AIC와 같은 이론적 정보 기준을 최소화하는 모델을 찾음
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 : 특이치 탐지에 잘 맞음
'인공지능(AI) > 머신러닝' 카테고리의 다른 글
[핸즈온 머신러닝] 11장 심층 신경망 훈련하기 (11.1 ~ 11.3) (0) | 2022.02.18 |
---|---|
[핸즈온 머신러닝] 10장 케라스를 사용한 인공 신경망 소개 (0) | 2022.02.14 |
[핸즈온 머신러닝] 8장 차원 축소 (0) | 2022.01.24 |
[핸즈온 머신러닝] 7장 앙상블 학습과 랜덤 포레스트 (0) | 2022.01.22 |
[핸즈온 머신러닝] 6장 결정 트리 (0) | 2022.01.18 |
댓글