본문 바로가기
👩🏻‍💻TECH/개념정리

[개념정리] 차원의 저주와 차원축소(PCA 설명)

by Alicia03 2024. 9. 5.

👀모든 포스팅은 직접 이미지와 글을 작성하고 있습니다. 사용하실 때는 꼭 링크와 출처를 남겨주세요

 

😈차원의 저주

 차원의 저주를 설명하기 위해서는 데이터의 차원이 무엇인지 살펴보아야 한다. 

 

데이터에서 차원은 '변수'를 뜻한다.

 

'변수가 많다'는 말은, 'feature가 많다', 'high dimensional하다'는 의미는 데이터에 포함된 변수가 많다는 뜻으로 바꾸어 표현할 수 있다. 변수가 많다는 것은 일견 데이터 분석에 좋아보인다. 그만큼 다양한 측면에서 데이터를 설명할 수 있다는 말이기 때문이다. 

 

이 말도 맞으나, 데이터에 변수가 많아지면 오히려 분석하기가 어려워지는 측면도 있다.

이 역설을 우리는 '차원의 저주'라고 부른다. 

데이터의 차원이 많아지면 분석 모델의 정확도가 떨어지거나 분석이 어려워지는 현상

 

그렇다면 차원의 저주는 왜 생겨나는 것일까?

 

데이터의 변수를 하나의 축으로 놓고 그림을 그린다고 생각해보자. 

예컨대 키와 몸무게를 모아둔 데이터가 있다면 키에 해당하는 변수를 x축에 몸무게를 y축에 표시해서 2차원상의 그래프를 그릴 수 있을 것이다. 여기서 하나의 변수, 즉 하나의 축을 더 추가해서 3차원에 표현해보자.

 

1차원 > 2차원 > 3차원

 

위의 그림과 같이 차원이 늘어날 수록 데이터 간의 거리는 점점 더 멀어진다. 

그렇게 되면 데이터의 연관성을 묶어내기가 어려워진다. 특히 거리기반으로 클러스터링을 하는 모델이라면 더욱더 데이터를 분석하는 데에 어려움이 생기는 것이다. 

 

🗞️차원 축소

차원의 저주를 해결하기 위해서 차원축소라는 방법을 사용한다. 
차원축소는 말그래도 차원을 축소하는 것이다. 고차원의 데이터를 저차원으로 축소하여 분석을 용이하게 만드는 것이다. 

차원축소에는 차원선택과 차원추출,  두 가지 방법이 있다. 

차원선택 

차원 선택은 말 그대로 필요하거나 중요한 변수만을 선택하여 사용하는 방법이다.

다른 변수를 통해 도출이 가능한 값을 가진 컬럼이거나 중복되는 정보가 있는 컬럼을 제거해주거나 덜 중요한 컬럼을 배제하는 식으로 이루어진다. 

 

이 방법은 아래와 같은 장단점이 있다. 

  • 장점: 사용이 쉽다. 
  • 단점: 데이터 손실이 크다.(데이터를 분석할 때 삭제한 컬럼의 특징은 반영되지 않는다.)

차원추출

차원을 누락시키지 않고 차원을 추출하여 사용하는 방법을 차원 추출이라고 한다. 

대표적으로 주성분을 통해 분석하는 주성분 분석(PCA)이 있다. 

 

차원추출 방법은 차원선택과 비교하여 다음과 같은 장단점이 있다. 

  • 장점: 데이터를 비교적 적게 누락하면서 분석을 진행할 수 있다. 
  • 단점: 차원 추출로 얻어낸 값은 직관적인 해석이 어려울 수 있다.

여기서는 차원 추출의 대표적인 방법인 주성분 분석을 알아보도록 하자. 

 

🗝️PCA(Principal Component Analysis)

PCA의 정의는 아래와 같다. 

차원들의 특성을 가장 잘 설명해주는 주성분(Principal Component)를 이용하여 차원을 축소하는 방법

 

PCA에서는 주성분을 찾는 방법은 데이터의 분산을 가장 잘 반영하는 축을 새로 생성하는 것이다.

 

데이터의 흩어짐 정도(분산)는 정보값이다. 예컨대 300명의 학생의 신발 사이즈를 모아둔 데이터 값이 있다고 하자.

 

내가 이 데이터를 활용하는 입장이라면 이 데이터에 대해서 가장 많은/적은 사이즈 혹은 대체로 어느정도의 신발 사이즈인지 등의 '분포'를 알고 싶을 것이다. 이처럼 분산은 데이터가 어떤식으로 분포되어 있는지를 보여주는 정보값이기 때문에 이를 가장 잘 반영하는 값을 주성분으로 뽑아 사용하는 것이다. 

 

Python에서는 sklearn 라이브러리를 사용해서 아래와 같이 사용할 수 있다. 

 

아래는 주성분 2개를 분석한 것이다. 여기서 scaled_df는 정규화된 데이터를 의미하는데 PCA를 할 때는 데이터들의 단위가 다르기 때문에 정규화를 해주고 PCA를 해주어야 한다.

#step 1: 모델 생성
from sklearn.decomposition import PCA
pca = PCA(n_components=2) # 주성분 선택

# step 2: 모델을 학습시키기
pca.fit(scaled_df) 
scaled_df_pca = pca.transform(scaled_df) 
pca_df = pd.DataFrame(scaled_df_pca)

#step 3: 결과 확인
pca_df.columns = ['PC1', 'PC2'] # 컬럼명 지정
pca_df.head()

 

벨로그 원문

[Weekly] 차원축소와 PCA