파이썬 머신러닝 완벽가이드 - 저자: 권철민 -
위 책을 바탕으로 정리한 내용입니다.
비지도 학습이란
정해져 있는 값(라벨)이 없는 데이터를 (데이터 피처 값을 통해) 비슷한 특징끼리 군집화하여, 이후에 입력하는 새로운 데이터에 대한 결과를 예측하는 학습을 의미합니다.
K-평균 알고리즘 (군집화)
군집 중심점이라는 특정한 임의의 지점을 선택해,
해당 중심에 가장 가까운 포인트들을 선택하는 기법입니다.
군집 중심점은 선택된 포인트(데이터)의 평균 지점으로 이동하고, 이동된 중심점에서 다시 가까운 포인트를 선택합니다,
다시, 중심점을 평균 지점으로 이동하는 프로세스를 반복적으로 수행하며, 모든 데이터 포인트에서 더 이상 중심점의 이동이 없을 경우에 반복을 멈춥니다.
1) 군집화의 기준이 되는 중심을 구성하려는 군집화 개수만큼 임의의 위치에 가져다 놓는다.
2) 각 데이터는 가장 가까운 곳에 위치한 중심점에 소속된다.
3) 소속이 결정되면 군집 중심점을 소속된 데이터의 평균 중심으로 이동한다.
4) 중심점이 이동했기 때문에, 각 데이터는 기존에 속한 중심점보다 더 가까운 중심점이 있다면 해당 중심점으로 다시 소속을 변경한다.
5) 2번 ~ 4번을 반복하고, 중심점을 이동했는데 데이터의 중심점 소속 변경이 없으면 군집화를 종료한다.
Scikit-learn - Kmeans (모델명) 클래스 소개
from sklearn.cluster import KMeans
# KMeans 모델 선언
kmeans = KMeans(n_cluster=3, init='k-menas++', max_iter=300, random_state=121)
# KMeans 모델 학습
kmeans.fit(x_train)
# KMeans 모델 예측
pred = kmeans.predict(x_train)
주요 파라미터
▶ n_cluster
: 군집화할 개수를 나타냅니다. 즉 군집 중심점의 개수
▶ init
: 초기에 군집 중심점의 좌표를 설정할 방식을 나타냅니다. (k-means++)
▶ max_iter
: 최대 반복 횟수, 이 횟수 이전에 모든 데이터의 중심점 이동이 없으면 종료합니다.
KMeans 모델의 주요 속성
▶ labels_
: 각 데이터 포인트가 속한 군집 중심점 레이블, 즉 모델이 데이터들을 군집화했을 때 각 데이터가 속한 레이블을 의미합니다.
▶ cluster_centers_
: n_cluster에서 정한 군집화의 개수만큼, 각 군집 중심점 좌표를 나타냅니다.
군집화 평가 - 실루엣 계수
군집화는 분류처럼 레이블 값으로 나누기 때문에 유사해 보입니다.
하지만 군집화는 타깃 레이블이 없는 데이터들을 가지고, 데이터 내에 숨어 있는 별도의 그룹을 찾아서 의미를 부여하거나, 동일한 분류 값에 속하더라도 그 안에서 더 세분화된 군집화를 추구하거나, 서로 다른 분류 값의 데이터도 더 넓은 군집화 레벨화 등의 영역을 가질 수 있습니다.
그렇기에 비지도학습은 지도학습과 달리 정확하게 성능 평가를 하기가 어렵습니다.
그래서 각 군집 간의 거리가 얼마나 효율적으로 분리돼 있는지를 나타내는 실루엣 분석을 통해 성능을 평가합니다.
< 효율적으로 잘 분리된 경우 >
다른 군집과의 거리는 떨어져 있고, 동시에 동일 군집끼리의 데이터는 서로 가깝게 잘 뭉쳐 있는 것을 의미합니다.
실루엣 계수란
개별 데이터가 가지는 군집화 지표입니다.
개별 데이터가 가지는 실루엣 계수는 해당 데이터가 같은 군집 내의 데이터와 얼마나 가깝게 군집화돼 있고, 다른 군집에 있는 데이터와는 얼마나 멀리 분리돼 있는지를 나타냅니다.
실루엣 계수 값 구하는 방법
1) 해당 데이터 포인트와 같은 군집 내에 있는 다른 데이터 포인트와의 거리를 평균한 값을 구한다. - a(i)
2) 해당 데이터 포인트가 속하지 않은 군집 중 가장 가까운 군집과의 평균 거리를 구한다. - b(i)
3) 두 군집 간의 거리가 얼마나 떨어져 있는가의 값은 "b(i) - a(i)" 이며 이 값을 정규화하기 위해 Max(a(i), b(i)) 값으로 나눈다.
Scikit learn - 실루엣 분석을 위한 메서드
from sklearn.metrics import silhouette_samples, silhouette_score
from sklearn.cluster import KMeans
kmeans = KMeans(n_cluster=3, init='k-means++', max_iter=300).fit(x_train)
pred_cluster = kmeans.labels_
# 모든 개별 데이터에 실루엣 계수 값 구하기
score_samples = silhouette_samples(x_train, pred_cluster)
# 모든 데이터의 평균 실루엣 계수 값 구하기
average_score = silhouette_score(x_train, pred_cluster)
▶ sklearn.metrics.silhoutte_samples(X, labels, metric='euclidean', **kwds)
: X_features 데이터 세트와 각 피처 데이터 세트가 속한 군집 레이블 값 labels 데이터를 입력해 주면,
각 데이터 포인트의 실루엣 계수를 반환해 줍니다.
▶ sklearn.metrics.silhoutte_score(X, labels, metric='euclidean', sample_size=None, **kwds)
: X_features 데이터 세트와 각 피처 데이터 세트가 속한 군집 레이블 값 labels 데이터를 입력해 주면,
전체 데이터의 실루엣 계수 값을 반환합니다.
'AI > Machine Learning' 카테고리의 다른 글
[Numpy] - expand_dims 차원 추가하기 (0) | 2022.06.16 |
---|---|
[ML] 머신러닝 - 회귀, 다항회귀, MSE, RMSE (0) | 2022.04.16 |
[ML] 머신러닝 - 스태킹 앙상블 (0) | 2022.04.09 |
불균형 데이터 처리를 위한 언더 샘플링과 오버 샘플링 (0) | 2022.04.09 |
[ML] 머신러닝 - 부스팅 GBM, XGBoost, LightGBM (0) | 2022.04.09 |