MLOps 부트캠프 by 한경+토스뱅크/Machine Learning

차원 축소 - 차원의 저주

나니니 2024. 8. 17. 19:39

차원의 저주

데이터에서 '차원'이란 변수의 개수를 의미한다. 즉, 변수가 1개인 데이터는 1차원 데이터, 2개인 데이터는 2차원 데이터, n개인 데이터는 n차원 데이터라고 부른다. 

이때, 아래와 같은 데이터는 변수가 6개이기 때문에 6차원 데이터이다. 

만약 recency와 age라는 2개의 변수만 가지고 있는 2차원 데이터라면 children, spent_all까지 4차원으로 구성된 데이터보다 정보가 적다. 마찬가지로 purchase_num_all 과 family_size 를 모두 포함한 6차원 데이터라면 2, 4차원보다 더 많은 정보를 가지게 된다. 따라서 차원이 높은 데이터를 분석에 활용하면 더 많은 정보를 반영한 결과를 얻을 수 있다. 

 

그러나

오히려 데이터의 차원이 너무 많아지면 분석의 정확도가 떨어지는 경우가 있다. 이러한 현상을 '차원의 저주'라고 한다.

 

차원의 저주가 발생하는 상황을 아래의 그래프로 확인해보자.  

좌: 차원 축소 전(6차원) / 우: 차원 축소 후(2차원)

위의 두 그래프를 비교해보면, 차원이 2개인 데이터로 클러스터링 한 결과가 차원이 6개인 데이터로 클러스터링 한 결과보다 모든 클러스터 개수 k개에서 inertia값이 작은 것을 알 수 있다. 

즉, 차원의 개수가 더 작을수록 클러스터링의 결과로 모인 데이터들이 더 많이 유사하고, 성능이 좋게 나오는 것을 알 수 있다. 

# 6차원 데이터 클러스터링

from sklearn.cluster import KMeans
import seaborn as sns
from matplotlib import pyplot as plt

# 데이터 스케일링
user_mean = user.mean() # 각 컬럼의 평균값
user_std = user.std() # 각 컬럼의 표준편차
scaled_df = (user - user_mean)/user_std # 컬럼별 표준화 진행

# 클러스터링(6차원 데이터로 k를 1부터 9까지 바꿔가며 모델 학습)
ks = range(1, 10)
inertias = []

for k in ks: 
  model = KMeans(n_clusters=k)
  model.fit(scaled_df)
  inertias.append(model.inertia_)

# 위 모델의 성능 지표인 inertia 시각화
sns.lineplot(x=ks, y=inertias, marker='o')
# 6차원 -> 2개 차원으로 축소 후, 다시 k-means 적용

# PCA
from sklearn.decomposition import PCA

pca = PCA(n_components=2)

# PCA 적용
pca.fit(scaled_df)
scaled_df_pca = pca.transform(scaled_df)
pca_df = pd.DataFrame(scaled_df_pca)

# 클러스터링
ks = range(1, 10)
inertias = []

for k in ks:
  model=KMeans(n_clusters=k)
  model.fit(pca_df)
  inertias.append(model.inertia_)

# 시각화
sns.lineplot(x=ks, y=inertias, marker='o')

차원 축소(Dimensionality Reduction)

차원의 저주를 해결하는 대표적인 방법으로 차원 축소가 있다. 차원 축소란 데이터에 있는 차원(변수)의 숫자를 줄여서 차원의 저주 문제를 해결하는 기법이다. 

차원 축소에는 크게 두 가지 접근법이 있다. 

차원 선택

 전체 차원 중 의미 있다고 판단되는 것들만 선택해서 사용하는 차원 선택이라는 방법이 있다.

차원 선택을 적용할 때는 변수 중 무엇이 중요한지, 의미상 중복되는 것들이 있는지 확인해야 한다. 이때, 변수 간의 관계를 면밀히 확인하여 제거할 변수를 판단해야 한다. 

  • 장점: 쉬운 사용법
    • 제거할 변수를 직관적으로 판단하고 선택하기 때문에 쉽고 빠르게 적용할 수 있으며, 각 변수들의 특성이 유지되면서 차원을 줄이기 때문에 결과를 이해하고 해석하기 쉽다. 
  • 단점: 큰 정보 손실
    • 전체 데이터에서 해당 변수만으로 설명되는 정보가 분명 존재할 수 있지만 변수 선택 시 탈락되기 때문에 해당 변수가 가지는 고유 정보가 사라지게 된다. 

차원 추출

 데이터를 가장 잘 설명하는 차원을 새롭게 생성하여 차원을 줄이는 방법이다. 즉, 여러 변수의 특징을 종합적으로 잘 나타내는 새로운 변수를 찾아내 변수를 통합하여 차원을 줄이는 방법이다. 

차원 선택과 달리 데이터를 설명하는데 필요한 정보를 최대한 보존하기 때믄에 차원 선택으로 뽑은 변수들로만 분석할 때에 비해 상대적으로 더 나은 성능을 보인다. 

하지만 만들어진 새로운 변수가 정확하게 무엇을 의미하는 것인지 해석하기 어려울 수 있다. 또, 여러 변수를 대표하기 위한 새로운 변수를 생성하는 과정에서 데이터 간의 분산이나 거리를 계산하는 등 추가적인 연산을 해야하므로 계산 비용이 증가하는 단점이 있다.