이번 챕터에서는 비지도 학습과 함께 데이터를 전처리하는 내용에 대해서 다루었습니다. sample data로는 Iris dataset를 자주 사용했는데요, iris dataset은 4개의 feature(petal length, petal width, sepal length, sepal width)와 3 종류의 label (setosa, versicolor, virginica)을 가지고 있는 데이터입니다.
K-means clustering
출처: t.ly/Jflr
#K means clustering
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3) #iris datset = 3 speceis
model.fit(samples)
labels = model.predict(samples)
print(labels)
대표적인 비지도학습 알고리즘의 예시인 K-means clustering 에는 새로운 데이터가 입력되면, 기존에 있던 cluster 중 하나에 배정받게 됩니다. k-means는 각 클러스터의 평균, centroid를 가지고 있는데요. 새로운 샘플이 들어올 때마다 가장 가까운 centroid를 찾아줍니다.
Evaluating a clustering 성능 평가하기
K-means 모델이 각 샘플마다 어떤 label을 부여했는지 알아보기 위해서 cross tabulation을 사용할 수 있습니다.
#label 로 이루어진 list가 있다는 가정 하에
import pandas as pd
df = pd.DataFrame({'labels':labels, 'species':species}) #create DF
ct = pd.crosstab(df['labels'], df['species'])
print(ct)
clustering quality는 각 클러스터가 잘 모여있는지에 따라 결정됩니다. 각 클러스터의 centroid로부터의 거리가 짧을수록 좋다는 의미입니다. 아래와 같은 attribute를 통해 점수를 확인할 수 있습니다.
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
model.fit(samples)
print(model.inertia_)
사실 이 점수는 클러스터의 개수가 늘어날수록 줄어듭니다. 하지만 가장 최적의 클러스터 개수가 많다고 해서 무조건 좋진 않습니다. 적절한 n을 찾기 위해서 여러 가지 방법을 적용할 수 있는데, 그중 대표적인 방법은 elbow point를 찾는 것입니다. 가장 급격하게 점수가 줄어드는 포인트를 찾는 방법입니다.
출처: t.ly/54pQ
하지만 이 방법은 사람의 주관이 들어갈 수밖에 없기 때문에, 링크에 소개된 silhouette plot을 사용하는 것도 좋은 방법입니다.
Feature transformation
각 feature의 variance, 분산은 K-means clustering algorithm에 큰 영향을 주는 항목입니다. 각 feature들의 분산이 차이가 클 경우 모델의 성능이 많이 떨어지기 때문에, scaling을 통해 데이터가 고른 분산을 가질 수 있도록 만드는 작업이 필요할 수 있습니다. feature의 평균을 0, 분산을 1로 만드는 standard scaling을 하는 코드는 아래와 같습니다. 이때 주의할 점은, validatioin 혹은 test에 사용되는 데이터는 fit 할 때 사용하시면 모델 학습 시킬 때와 마찬가지로 data leakage에 해당하므로 사용하시면 안 된다는 점!입니다.
#t-SNE sample
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
model = TSNE(learning_rate=100) #lr: hypterparameter, 50~200
transformed = model.fit_transform(samples) #cannot separate fit/transform
t-SNE의 특징
fit, transform 이 한 번에 이루어지기 때문에 새로운 data가 입력될 경우 다시 학습시켜야 한다.
t-SNE plot의 축에 대한 정보는 해석할 수 없는 정보를 가진다
PCA transformation
dimension reduction이란 데이터의 특징을 파악하여 압축된 형태로 다시 표현시키는 것입니다. 원본 데이터의 크기가 크다면 차원 축소를 통해 효율적인 연산을 가능하게 해줍니다. 모델이 동작하는 데 방해가 되는 noise feature를 줄여주는 데도 효과가 있는 방법입니다.
Intrinsic dimension 고유 차원
= dataset의 근사치를 추정하기 위해 필요한 feature의 개수 = 높은 분산값을 갖는 PCA feature의 개수
Dimension reduction with PCA
높은 variance를 가지는 feature를 정보성이 높은 데이터로 상정하고, 차원을 축소시킵니다.
#performing dimension reduction
from sklearn.decomposition import PCA
pca = PCA(n_components=2) # n = 결과적으로 얻을 feature의 개수
pca.fit(samples)
transformed = pca.transform(samples)
또 다른 dimension reduction technique - Non-negative matrix factorization
NMF model은 해석 가능, 즉 스스로 이해하기에도 쉽고 다른 사람들에게 설명하기가 더 수월하다는 점에서 PCA와 차이점이 있습니다. 하지만 데이터셋의 모든 값이 0 이상이어야 사용할 수 있습니다. 데이터가 모두 양수로 표현되는 NLP 혹은 CV task에서도 활용할 수 있겠죠?
#same as others, apply NMF model by fit and transform
from sklearn.decomposition import NMF
model = NMF(n_components=3)
model.fit(samples)
nmf_features = model.transform(samples)
#check components of model
model.components_
PCA에 대해서 수업시간에 언급하고 넘어간 적은 있는데, 이번 챕터를 통해서 의미와 용도를 다시 한번 자세하게 짚어볼 수 있었습니다. 다른 주차에 비해서 처음 보는 개념이 많아 공부하는 시간이 더 걸렸던 것 같아요. 이해 안되는 내용들은 이번 기회에 처음 만나뵈었다..라는 생각으로 다음을 기약하면서 넘어갑니다. 어차피 언젠가는 다시 보겠지 하는 마음 가짐으로..