새소식

Study/Today_I_Learned

[Datacamp] Unsupervised learning in Python

  • -
728x90

Clustering for dataset exploration 

 이번 챕터에서는 비지도 학습과 함께 데이터를 전처리하는 내용에 대해서 다루었습니다. 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에 해당하므로 사용하시면 안 된다는 점!입니다. 

#mean: zero, variance:1
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(samples)
StandardScaler(copy=True, with_means=True, with_std=True)
samples_scaled = scaler.transform(samples)

 scaler의 종류에는 MaxAbsScaler, Normarlizer, MinMaxScaler 등이 있습니다. 자세한 사항은 공식문서 !

Hierarchical clustering and t-SNE

t-SNE : t-distributed stochastic neighbor embedding

#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에 대해서 수업시간에 언급하고 넘어간 적은 있는데, 이번 챕터를 통해서 의미와 용도를 다시 한번 자세하게 짚어볼 수 있었습니다. 다른 주차에 비해서 처음 보는 개념이 많아 공부하는 시간이 더 걸렸던 것 같아요. 이해 안되는 내용들은 이번 기회에 처음 만나뵈었다..라는 생각으로 다음을 기약하면서 넘어갑니다. 어차피 언젠가는 다시 보겠지 하는 마음 가짐으로.. 

 

 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.