차원 축소는 매우 많은 피처로 구성된 다차원 데이터 세트의 차원을 축소해 새로운 차원의 데이터 세트를 생성하는 것이다. 일반적으로 차원이 증가할수록 데이터 포인트 간의 거리가 기하급수적으로 멀어지게 되고, 희소한 구조를 가지게 된다. 수백 개 이상의 피처로 구성된 데이터 세트의 경우 상대적으로 적은 차원에서 학습된 모델보다 예측 신뢰도가 떨어진다. 또한 피처가 많은 경우 개별 피처 간에 상관관계가 높을 가능성이 크다. 선형 회귀와 같은 선형 모델에서는 입력 변수 간의 상관관계가 높을 경우 이로 인한 자중 공선성 문제로 모델의 예측 성능이 저하된다.
<다중 공선성?>
다중공선성(multicollinearity)란 독립 변수의 일부가 다른 독립 변수의 조합으로 표현될 수 있는 경우이다. 독립 변수들이 서로 독립이 아니라 상호상관관계가 강한 경우에 발생한다. 즉, 다중 공선성은 독립 변수들 간에 강한 상관관계가 나타나서, 회귀분석의 전제 가정인 독립변수들 간에 상관관계가 높으면 안된다는 조건을 위해하는 경우를 의미한다.
일반적으로 차원 축소는 피처 선택과 피처 추출로 나눌 수 있다. 피처 선택 즉, 특성 선택은 말 그대로 특정 피처에 종속성이 강한 불필요한 피처는 아예 제거하고, 데이터의 특징을 잘 나타내는 주요 피처만 선택하는 것이다. 피처 추출은 기존 피처를 저차원의 중요 피처로 압축해서 추출하는 것이다. 이렇게 새롭게 추출된 중요 특성은 기존의 피처가 압축된 것이므로 기존의 피처와는 완전히 다른 값이 된다.
피처 추출은 기존 피처를 단순 압축이 아닌, 피처를 함축적으로 더 잘 설명할 수 있는 또 다른 공간으로 매핑해 추출하는 것이다. 가령 학생을 평가하는 다양항 요소로 모의고사 성적, 종합 내신성적, 수능성적, 대외활동 등과 관련된 여러 가지 피처로 돼 있는 데이터 세트라면 이를 학업 성취도, 커뮤니케이션 능력, 문제 해결력과 같은 더 함축적인 요약 특성으로 추출할 수 있는 것이다. 이러한 함축적인 특성 추출은 기존 피처가 전혀 인지하기 어려웠던 잠재적인 요소를 추출하는 것을 의미한다.
이처럼 차원 축소는 단순히 데이터의 압축을 의미하는 것이 아니다. 더 중요한 의미는 차원 축소를 통해 좀 더 데이터를 잘 설명할 수 있는 잠재적인 요소를 추출하는 데에 있다. PCA, SVD, NMF는 이처럼 잠재적인 요소를 찾는 대표적인 차원 축소 알고리즘이다. 매우 많은 차원을 가지고 있는 이미지나 텍스트에서 차원 축소를 통해 잠재적인 의미를 찾아 주는 데 이 알고리즘이 잘 활용되고 있다.
PCA(Principal Component Analysis)
PCA는 가장 대표적인 차원 축소 기법이다. PCA는 여러 변수 간에 존재하는 상관관계를 이용해 이를 대표하는 주성분을 추출해 차원을 축소하는 기법이다. PCA로 차원 축소할 때는 기존 데이터의 정보 유실이 최소화되는 것이 당연하다. 이를 위해서 PCA는 가장 높은 분산을 가지는 데이터의 축을 찾아 이 축으로 차원을 축소하는데, 이것이 PCA의 주성분이 된다. (분산이 데이터의 특성을 가장 잘 나타내는 것으로 간주)
PCA는 제일 먼저 가장 큰 데이터 변동성을 기반으로 첫 번째 벡터 축을 생성하고, 두 번째 축은 이 벡터 축에 직각이 되는 벡터를 축으로 한다. 세 번째 축은 다시 두 번째 축과 직각이 되는 벡터를 설정하는 방식으로 축을 생성한다. 이렇게 생성된 벡터 축에 원본 데이터를 투영하면 벡터 축의 개수만큼의 차원으로 원본 데이터 차원 축소된다.PCA, 즉 주성분 분석은 이처럼 원본 데이터의 피처 개수에 비해 매우 작은 주성분으로 원본데이터의 총변동성을 대부분 설명할 수 있는 분석법이다.
PCA를 선형대수 관점에서 해석해 보면, 입력 데이터의 공분산 행렬을 고유값 분해하고, 이렇게 구한 고유벡터에 입력 데이터를 선형 변환하는 것이다. 이 고유 벡터가 PCA의 주성분 벡터로서 입력 데이터의 분산이 큰 방향을 나타낸다.
PCA의 스탭
1. 입력 데이터 세트의 공분산 행렬을 생성한다.
2. 공분산 행렬의 고유 벡터와 고유값을 계산한다.
3. 고유값이 가장 큰 순으로 K개(PCA 변환 차수)만큼 고유벡터를 추출한다.
4. 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 변환한다.
PCA는 많은 속성으로 구성된 원본 데이터를 그 핵심을 구성하는 데이터로 압축한 것이다. 붓꽃 데이터 세트는 4개의 속성으로 되어 있는 데, 이 4개의 속성을 2개의 PCA 차원으로 압축해 원래 데이터 세트와 압축된 데이터 세트가 어떨게 달라졌는지 확인해 보자.
각 품종에 따라 원본 붓꽃 데이터 세트가 어떻게 분포돼 있는지 2차원으로 시각화해 보자. 2차원으로 표현하므로 두 개의 속성인 sepal length와 sepal width를 X축 Y축으로 해 품종 데이터 분포를 나타낸다.
PCA로 변환한 후에도 품종들은 명확하게 구분이 가능한것을 알 수 있다. 이는 PCA의 첫 번째 새로운 축인 pca_component_1이 원본 데이터의 변동성을 잘 반영했기 때문이다. PCA Component별로 원본 데이터의 변동성을 얼마나 반영하고 있는지 알아보자. PCA변환을 수행한 PCA객체의 explained_variance_ratio_ 속성은 전체 변동성에서 개별 PCA 컴포넌트별로 차지하는 변동성 비율을 제공하고 있다.
첫 번째 PCA 변환 요소인 pca_component_1이 전체 변동성의 약 72.9, pca_component_2가 약 22.8을 차지한다. 따라서 PCA를 2개의 요소로만 변환해도 원본 데이터의 변동성을 95% 설명할 수 있다. 이번에는 원본 붓꽃 데이터 세트와 PCA로 변환된 데이터 세트에 각각 분류를 적용한 후 결과를 비교해보자.
원본 데이터 세트 대비 예측 정확도는 PCA변환 차원 개수에 따라 예측 성능이 떨어질 수밖에 없다. 위 붓꽃 데이터의 경우 4개의 속성이 2개의 변환 속성으로 감소하면서 예측 성능의 정확도가 원본 데이터 대비 8% 하락했다. 8% 하락은 비교적 큰 성능 수치 감소이지만, 속성 개수가 50% 감소한 것을 고려하면 PCA변환 후에도 원본 데이터의 특성을 상당 부분 유지하고 있음을 알 수 있다.
개인적인 경험으로 칼럼이 매우 많은 경우에는 공선성을 확인해서 겹치는 칼럼들을 PCA해서 새로운 칼럼을 만드는 것이 상대적으로 좋았다.
LDA(Linear Discirminant Analysis)
LDA는 선형 판별 분석법으로 불리며, PCA와 매우 유사하다. LDA는 PCA와 유사하게 입력 데이터 세트를 저차원 공간에 투영해 차원을 축소하는 기법이지만, 중요한 차이는 LDA는 지도학습의 분류에서 사용하기 쉽도록 개별 클래스를 분별할 수 있는 기준을 최대한 유지하면서 차원 축소한다. PCA는 입력 데이터의 변동성의 가장 큰 축을 찾았지만, LDA는 입력 데이터의 결정 값 클래스를 최대한 분리할 수 있는 축을 찾는다.
LDA는 특정 공간상에서 클래스 최대화하는 축을 찾기 위해 클래스 간 분산과 클래스 내부 분산의 비율을 최대화하는 방식으로 차원을 축소한다. 즉, 클래스 내부 분산의 비율을 최대화하는 방식으로 차원을 축소한다. 즉, 클래스 간 분산은 최대한 크게 가져가고, 클래스 내부의 분산은 최대한 작게 가져가는 방식이다.
LDA의 스탭
1. 클래스 내부와 크래스 간 분산 행렬을 구한다. 이 두 개의 행렬은 입력 데이터의 결정 값 클래스별로 개별 피처의 평균 벡터를 기반으로 구한다.
2. 클래스 내부 분산 행렬, 클래스 간 분산 행렬을 고유벡터로 분해할 수 있다.
3. 고유값이 가장 큰 순으로 K개(LDA변환 차수만큼) 추출한다.
4. 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 변환한다.
붓꽃 데이터 세트에 LDA 적용
PCA와 다르게 LDA에서 한 가지 유의해야 할 점은 LDA는 실제로는 PCA와 다르게 비지도 학습이 아닌 지도 학습이라는 것이다. 즉, 클래스의 결정 값이 변환 시에 필요하다. 다음 LDA객체의 fit() 매서드를 호출할 때 결정값이 입력됐음에 유의해야 한다.
SVD(Singular Value Decomposition)
SVD 역시 PCA와 유사한 행렬 분해 기법을 이용한다. PCA의 경우 정방행렬만을 고유벡터 분해할 수 있지만, SVD는 정방 행렬뿐만 아니라 행과 열의 크기가 다른 행렬에도 적용할 수 있다. 일반적으로 SVD는 m x n 크기의 행렬 A를 분해하는 것을 의미한다.
SVD는 특이값 분해로 불리며, 행렬 U와 V에 속한 벡터는 특이벡터이며, 모드 특이벡터는 서로 직교하는 성질을 가진다. 시그마는 대각행렬이며 행렬의 대각에 위치한 값만 0이 아니고 나머지 위치의 값은 모두 0이다. 시그마가 위치한 0이 아닌 값이 바로 행렬 A의 특이값이다. SCD는 A의 차원이 m X n일 때 U의 차원이 m X m, 시그마의 차원이 m X n, V^t의 차원이 n X n으로 분해한다.
하지만 일반적으로는 시그마의 비대각인 부분과 대각원소 중에 특이값이 0인 부분도 모두 제거하고 제거된 시그마에 대응되는 U와 V원소도 함께 제거해 차원을 줄인 형태로 SVD를 적용한다. 이렇게 컴팩트한 형태로 SVD를 적용하면 A의 차원이 m X n일 때, U의 차원을 m X p, 시그마의 차원을 p X p, V^t의 차원을 p X n으로 분해한다.
Truncated SVD는 시그마의 대각원소 중에 상위 몇 개만 추출해서 여기에 대응하는 U와 V의 원소도 함께 제거해 더욱 차원을 줄인 형태로 분해하는 것이다. 일반적인 SVD는 보통 넘파이나 사이파이 라이브러리를 이용해 수행한다. 넘파이의 SVD를 이용해 SVD연산을 수행하고, SVD로 분해가 어떤 식으로 되는지 간단한 예제를 해보았다.
분해된 이 U, Sigma, Vt를 이용해 다시 원본 행렬로 정확히 복원이 되는지 확인을 해보자. 원본 행렬로의 복원은 이 U, Sigma, Vt를 내적하면 된다. 한 가지 유의할 것은 Sigma의 경우 0이 아닌 값만 1차원으로 추출했으므로 다시 0을 포함한 대칭행렬로 변환한 뒤에 내적을 수행해야 한다는 점이다.
a_는 원본 행렬 a와 동일하게 복원됨을 알 수 있다. 이번에는 데이터 세트가 로우 간 의존성이 있을 경우 어떻게 Sigma 값이 변하고, 이에 따른 차원 축소가 진행될 수 있는지를 알아보자. 일부러 의존성을 부여하기 위해 a 행렬의 3번째 로우를 '첫 번째 로우 + 두 번째 로우'로 업데이트하고, 4번째 로우는 첫 번째 로우와 같다고 업데이트를 하고 진행한다.
이전과 차원은 같지만 Sigma 값 중 2개가 0으로 변했다. 즉, 선형 독립인 로우 벡터의 개수가 2개라는 의미이다. 이렇게 분해된 U, Sigma, Vt를 이용해 다시 원본 행렬로 복원을 하자 이번에는 U, Sigma, Vt의 전체 데이터를 이용하지 않고 Sigma의 0에 대응되는 U, Sigma, Vt의 데이터를 제외하고 복원해보자. 즉 Sigma의 경우 앞의 2개 요소만 0이 아니므로 U의 행렬 중 선행 두 개의 열만 추출하고 Vt의 경우 선행 두 개의 행만 추출해 복원하는 것이다.
사이킷런 Truncated SVD 클래스를 이용한 변환
사이킷런의 Truncated SVD 클래스는 사이파이의 svds와 같이 Truncated SVD 연산을 수행해 원본 행렬을 분해한 U, Sigma, Vt행렬을 반환하지는 않는다. 사이킷런의 Truncated SVD 클래스는 PCA 클래스와 유사하게 fit(), transform()을 호출해 원본 데이터를 몇 개의 주요 컴포넌트(즉, Truncated SVD의 k 컴포넌트 수)로 차원을 축소해 변환한다. 원본 데이터를 Truncated SVD 방식으로 분해 U*Sigma
행렬에 선현 변환해 생성한다.
Truncated SVD 변환 역시 PCA와 유사하게 변환 후에 품종별로 어느 정도 클러스터링이 가능할 정도로 각 변환 속성으로 뛰어난 고유성을 가지고 있음을 알 수 있다.
NMF(Non-Negative Matrix Factorization)
NMF는 Truncated SVD와 같이 낮은 랭크를 통한 행렬 근사 방식의 변형이다. NMF는 원본 행렬 내의 모든 원소 값이 모두 양수라는 게 보장되면 간단하게 두 개의 기반 양수 행렬로 분해될 수 있는 기법을 지칭한다.
4x6 원본 행렬 V는 4x2 행렬 W와 2x6 행렬 H로 근사해 분해될 수 있다. 행렬 분해는 일반적으로 SVD와 같은 행렬 분해 기법을 통칭하는 것이다. 이처럼 행렬 분해를 하게 되면 W 행렬과 H 행렬은 일반적으로 길고 가는 행렬 W와 작고 넓은 행렬 H로 분해된다. 이렇게 분해된 행렬은 잠재 요소를 특성으로 가지게 된다. 분해 행렬 W는 원본 행에 대해서 이 잠재 요소의 값이 얼마나 되는지에 대응하며, 분해 행렬 H는 이 잠재 요소가 원본 열로 어떻게 구성됐는지를 나타내는 행렬이다.
NMF는 SVD와 유사하게 차원 축소를 통한 잠재 요소 도출로 이미지 변환 및 압축, 켁스트의 토픽 도출 등의 영역에서 사용되고 있다. 사이킷런에서 NMF는 NMF클래스를 이용해 지원된다. 붓꽃 데이터를 NMF를 이용해 2개의 컴포넌트로 변환하고 이를 시각화해보았다.
NMF도 SVD와 유사하게 이미지 압축을 통한 패턴 인식, 텍스트의 토픽 모델링 기법, 문서 유사도 및 클러스터링에 잘 사용된다. 또한 영화 추천과 같은 추천 영역에 활발하게 적용이 된다. 사용자의 상품 평가 데이터 세트인 사용자-평가 순위 데이터 세트를 행렬 분해 기법을 통해 분해하면서 사용자가 평가하지 않은 상품에 대한 잠재적인 요소를 추출해 이를 통해 평가 순위를 예측하고 높은 순위로 예측된 상품을 추천해주는 방식이다.
정리
대표적인 차원 축소 알고리즘인 PCA, LDA, SVD, NMF에 대해서 알아보았다. 많은 피처로 이뤄진 데이터 세트를 PCA같은 차원 축소를 통해 더욱 직관적으로 이해할 수 있었다.
무엇보다도 차원 축소는 단순히 피처의 개수를 줄이는 개념보다는 이를 통해 데이터를 잘 설명할 수 있는 잠재적인 요소를 추출하는 것에 큰 의미가 있다. 이 때문에 많은 차원을 가지는 이미지나 텍스트에서 PCA, SVD 등의 차원 축소 알고리즘이 활발하데 사용된다.
PCA는 입력 데이터의 변동성이 가장 큰 축을 구하고, 다시 이 축에 직각인 축을 반복적으로 축소하려는 차원 개수만큼 구한 뒤 입력 데이터를 이 축들에 투영해 차원을 축소하는 방식이다. 이를 위해 입력 데이터의 공분산 행렬을 기반으로 고유 벡터를 생성하고 이렇게 구한 고유 벡터에 입력 데이터를 선형 변환하는 방식이다. LDA는 PCA와 매우 유사한 방식이며 PCA가 입력 데이터 변동성의 가장 큰 축을 찾는 데 반해 LDA는 입력 데이터의 결정 값 클래스를 최대한으로 분리할 수 있는 축을 찾는 방식으로 차원을 축소한다.
SVD와 NMF는 매우 많은 피처 데이터를 가진 고차원 행렬을 두 개의 저차원 행렬로 분리하는 행렬 분해 기법이다. 특히 이러한 행렬 분해를 수행하면서 원본 행렬에서 잠재된 요소를 추출하기 때문에 토픽 모델링이나 추천 시스템에서 활발하게 사용된다.
'Machine Learning' 카테고리의 다른 글
[파이썬 머신러닝 완벽가이드(위키북스)] : Clustering (군집화) Part2 (0) | 2021.12.06 |
---|---|
[파이썬 머신러닝 완벽가이드(위키북스)] : Clustering (군집화) Part1 (0) | 2021.12.01 |
[파이썬 머신러닝 완벽가이드(위키북스)] : Regression 회귀 part4 캐글 주택 가격 예측 실습 (0) | 2021.11.25 |
[파이썬 머신러닝 완벽가이드(위키북스)] : Regression 회귀 part3 로지스틱, 회귀 트리 (0) | 2021.11.25 |
[파이썬 머신러닝 완벽가이드(위키북스)] : Regression 회귀 part2 규제 선형 모델 - 릿지, 라쏘, 엘라스틱넷 (0) | 2021.11.25 |
댓글