다시 이음

선형 대수 - 4 ( Supervised Learning / Unsupervised Learning ) 본문

AI 일별 공부 정리

선형 대수 - 4 ( Supervised Learning / Unsupervised Learning )

Taeho(Damon) 2021. 7. 27. 23:42

지도 학습 (Supervised Learning)

데이터에 라벨이 있을 때 사용 가능.

 

  • 분류(Classification) : 주어진 데이터가 카테고리 혹은 클래스 예측을 위해 사용
  • 회귀(Prediction) : 주어진 데이터가 continuous할 때 결과 예측을 위해 사용

비지도 학습 (Unsupervised Learning)

  • 클러스터링 ( Clustering ) : 데이터와 연관된 feature을 바탕으로 유사한 그룹을 생성.
  • 차원 축소 ( Dimentionality Reduction )
  • 연관 규칙 학습 ( Association Rule Learning ) : feature들의 관계를 발견하는 방법

 

클러스터링 ( Clustering ) - 군집화

목적 : 주어진 데이터가 얼마나, 어떻게 유사한지 확인하기

데이터를 요약,정리할 때 매우 효율적인 방법으로 통한다.

 

종류 :

 1 ) 계층적 클러스터링 ( Hierarchical )

  • Agglomerative : 개별 포인트에서 시작하여 점점 크게 합쳐가는 형태
  • Divisive : 한 개의 큰 군집에서 점점 작은 군집으로 나누는 형태

2) Point Assignment

  • 처음에 군집의 수를 정하고 데이터를 군집에 하나하나 배정하는 형태

3) Hard Clustering

  • 데이터는 하나의 군집에만 할당된다.

4) Soft Clustering

  • 데이터는 여러 군집에 확률을 가지고 할당된다.

 

유사성 ( Similarity ) 

클러스터링은 어떻게 유사성을 파악하여 클러스터를 배정할까?

 

  • 유클리디안 ( Euclidean )

두 변수의 거리를 측정하여 유사도를 파악하는 방법.

a = np.array((1, 2, 3))
b = np.array((4, 5, 6))

dist = np.linalg.norm(a-b)
# 벡터의 길이를 측정하는 방법으로 확인 가능

그 외의 방법들 : Cosine, Jaccard, Edit Distance ( 궁금하다면 추가적으로 찾아서 공부하기 )

 

 

K-Means Clustering

A.K.A. centroid-based clustering

(K는 중심점의 개수)

 

유사성은 K-Means 클러스터링 메커니즘에 크게 중요하다.

데이터와 클러스터의 거리(유클리드)의 제곱한 총합(오차제곱합)을 최소화 함으로써 최적의 클러스터 배치를 결정한다.

 

이러한 메커니즘을 사용하여 최적의 클러스터 수를 확인하는 것이 Elbow methods이다.

 

k-means clustering 진행 (출처 : https://livebook.manning.com/book/machine-learning-for-mortals-mere-and-otherwise/chapter-16/20)

진행 과정

1) k 개의 랜덤한 데이터를 cluster의 중심점으로 설정 

2) 해당 cluster에 근접해있는 데이터를 cluster로 할당

3) 변경된 cluster에 대해서 중심점을 새로 계산

 

# 중심점 계산하기
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

x, y = make_blobs(n_samples = 100, centers = 3, n_features = 2)
# 데이터셋을 만드는 데 100개의 샘플을 3개의 중심점을 가지게 2개의 feature를 기준으로 만든다.
plt.scatter(points.x, points.y)
plt.show()
# 산포도를 통해 만들어진 데이터셋이 어떻게 분포되어 있는지 파악해보기

centroids = points.sample(3) # 랜덤으로 중심점 3개 만들어보기

from scipy.spatial import distance

def find_nearest_centroid(df, centroids, iteration반복):
 
  # 포인트와 centroid 간의 거리 계산
  distances = distance.cdist(df, centroids, 'euclidean')
  
  # 제일 근접한 centroid 선택
  nearest_centroids = np.argmin(distances, axis = 1)
    
  # cluster 할당
  se = pd.Series(nearest_centroids)
  df['cluster_' + iteration] = se.values
  
  반복하여 유의미한 변화가 없을 때 중심점이라고 본다.

 

K-means에서 K를 결정하는 방법

Elbow methods

 

클러스터 개수를 1이라고 할 때 오차제곱합을 측정하고 그 값을 저장, 또 2,3,4... 계속해서 측정과 저장을 하여 최종적으로 그래프로 시각화 할 수 있다. 이러한 방법 때문에 그래프를 보았을 때 데이터와 클러스터간의 거리를 의미하는 오차제곱합의 수치가 점차 줄어들어 그 수치가 변화하는 구간이 미세할 때, 더이상 클러스터를 늘림으로써 데이터와 클러스터간의 거리가 줄어들지 않는다고 판단할 수 있다.

sum_of_squared_distances = []
K = range(1, 15)
for k in K:
    km = KMeans(n_clusters = k)
    km = km.fit(points)
    sum_of_squared_distances.append(km.inertia_)
# 1~15개의 클러스터를 지정했을 때 각각 중심점간의 거리를 기록

plt.plot(K, sum_of_squared_distances, 'bx-')
plt.xlabel('k')
plt.ylabel('Sum_of_squared_distances')
plt.title('Elbow Method For Optimal k')
plt.show()

# 그래프를 통하여 Scree Plot과 같이 유의미한 변화를 보이지 않는 경우 전까지 중심점을 활용하면 된다.

 

K-Means Clustering을 라이브러리를 사용해서 구하기

from sklearn.cluster import KMeans 
kmeans = KMeans(n_clusters = 3) # n_clusters = 구하고자 하는 클러스터의 개수입력
kmeans.fit(x)
labels = kmeans.labels_ # 구해진 k-means 클러스터열을 반환
new_series = pd.Series(labels)
df['clusters'] = new_series.values # 클러스터열('label')의 값들을 df열에 입력
# 위의 series를 그대로 넣으려고 하면 오류가 생기니 꼭 값으로 변환한 뒤에 넣기

 

K-Means Clustering 시각화하기

산포도를 표현하며 클러스터 분류(라벨)을 통해 컬러가 자동 입력된다.

 

 

import matplotlib.pyplot as plt
plt.scatter(df['x열'],df['y열'],c=df['clusters(열)'],alpha=0.5)

 

K-Means Clustering을 사용할 때 주의점

 

1) 여러 feature들이 사용된 데이터셋일 경우에 각 feature들의 크기가 너무 크다면 StandardScaler().fit_transform(x)을 통해 표준화를 진행하면 결과값을 분석하기 쉽다.

2) 데이터셋에 수치형이지만 해당 데이터의 정보에 불필요한 값은 제외시키는 전처리 과정을 꼭 거친 뒤 진행하여야 유의미한 결과를 얻을 수 있다.

3) 데이터셋에 분류된 값(라벨)이 없다면 해당 과정을 거쳐도 정말 이 값이 정확하다고 파악하기는 어렵다.

4) feature가 엄청 많은 경우 PCA 전처리 과정을 거친 뒤 해당 과정을 진행하면 좀더 효율적일 것 같지만 그것에 대해서는 그럴 수도 있고 아닐 수도 있다.

5) feature가 많은 경우 해당 과정의 시각화(산포도)를 해보고 싶다면 PCA를 활용하여 차원축소하여 시각화를 하는 것이 좋다.