elevne's Study Note

딥러닝 파이토치 교과서 (2-2: 비지도학습(1)) 본문

Machine Learning/Pytorch

딥러닝 파이토치 교과서 (2-2: 비지도학습(1))

elevne 2023. 3. 1. 14:33

비지도학습은 지도학습처럼 레이블이 필요한 것이 아니라, 정답이 없는 상태에서 훈련을 시킬 수 있는 방식이다. 비지도학습은 크게 ClusteringDimensionality Reduction 으로 구분할 수 있다. Clustering (군집화) 은 각 데이터의 유사성을 측정한 후 유사성이 높은 데이터끼리 같은 집단으로 분류하는 것이고, Dimensionality Reduction 은 차원을 나타내는 특성을 줄여서 데이터를 줄이는 방식이다. 이러한 비지도학습의 다양한 알고리즘들에 대해서 하나씩 다시 공부하였고, 이번에는 K-means Clustering 에 대해서 복습해보았다.

 

 

 

K-means Clustering 은 데이터를 입력받아 소수의 그룹으로 묶는 알고리즘이다. K-means Clustering 을 진행하게 될 때, 우선 랜덤하게 초기 중심점 (k 개) 들을 지정한다. 그 후, 그 k 개의 중심점과 각각의 개별 데이터 간의 거리를 측정한 후, 가장 가까운 중심점을 기준으로 그룹을 할당하게 되는 것이다. 그 후, 각 클러스터마다 새로운 중심점을 계산하는 과정을 다시 거친다. 마지막으로 범위를 확인하게 되는데, 선택된 새로운 중심점에 더 이상의 변화가 생기지 않는다면 위 과정을 마무리하게 되는 것이다.

 

 

 

 

 

 

위 그림과 같이 단순하게 분류될 수 있을 때 유용하게 사용될 수 있으나 데이터가 비선형, 군집 크기가 서로 많이 다를 때, 혹은 군집마다 밀집도와 거리가 다른 경우에는 성능이 잘 나오지 않을 수 있다고 한다.

 

 

아래 예제코드를 통해서 K-means Clustering 알고리즘을 구현해볼 수 있다.

 

 

 

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

data = pd.read_csv("./salesdata.csv")
data.head()

 

 

result

 

 

 

이후 get_dummies() 메서드로 명목형데이터를 원핫인코딩, MinMaxScaler.fit 메서드로 스케일링을 하며 전처리를 진행해준다.

 

 

 

categorical_features = ["Channel", "Region"] # 명목형데이터
continuous_features = ["Fresh", "Milk", "Grocery", "Frozen", "Detergents_Paper", "Delicassen"] # 연속형데이터

for col in categorical_features:
    dummies = pd.get_dummies(data[col], prefix=col) # 명목형데이터는 Pandas 의 get_dummies() 메서드를 사용하여 원핫인코딩
    data = pd.concat([data, dummies], axis=1) # 병합
    data.drop(col, axis=1, inplace=True) # 기존 컬럼 드랍
    
mms = MinMaxScaler()
mms.fit(data)
data_transformed = mms.transform(data)
print(data_transformed)

 

 

result

 

 

 

데이터 전처리를 마치면, 아래와 같은 코드로 K-means Clustering 에 사용할 적당한 K 의 값을 알아볼 수 있다.

 

 

 

Sum_of_squared_distances = []
K = range(1, 15)
for k in K:
    km = KMeans(n_clusters=k)
    km = km.fit(data_transformed)
    Sum_of_squared_distances.append(km.inertia_)

plt.plot(K, Sum_of_squared_distances, "bx-")
plt.xlabel("k")
plt.ylabel("Sum_of_squared_distances")
plt.title("Optimal k")
plt.show()

 

 

result

 

 

 

위 코드에서 작성한 SSD (Sum of Squared Distances, 거리 제곱의 합) 는 x, y 두 데이터의 차를 구해서 제곱한 값을 모두 더한 후 유사성을 측정하는 데 사용된다고 한다. K-means Clustering 에서는 K 가 증가하면 거리 제곱의 합이 0 이 되는 경향이 있다. 위 그래프에서는 K 값이 6 이 될 때부터 제곱 합이 0 에 가까워지기에 K 값을 5 로 설정하는 것이 적정하다고 볼 수 있다고 한다.

 

 

 

 

 

 

Reference:

딥러닝 파이토치 교과서