데이터 분석을 수행할 때 설명변수의 수가 많으면 오히려 과적합이 발생하여 알고리즘 성능이 저하되는 경우가 많습니다. 즉, 데이터의 수에 비해 데이터의 차원이 크면 알고리즘 성능이 떨어지는 '차원의 저주(Curse of Dimensionality)'가 발생하는데 그렇기 때문에 분석을 수행할 때 데이터의 크기와 설명변수의 수를 잘 따져보고 데이터를 잘 설명할 수 있는 변수를 선택 및 추출하여 모델 생성에 사용해야 합니다.
이번 포스팅에는 데이터의 차원을 축소하는 방법 중 하나인 PCA에 대해서 알아보겠습니다.
PCA
Principle Component Analysis: 주성분 분석
주성분 분석은 여러 변수 간에 존재하는 상관관계를 이용하는 차원 축소 방법입니다. 즉, 데이터를 축에 사영했을 때 분산이 가장 높은 축을 찾아 그 축을 새로운 주성분으로 결정하는 방법입니다.
방법은 다음과 같습니다.
제일 먼저 가장 큰 분산을 기반으로 첫 번째 축을 생성하고, 이 벡터 축에 직각이 되는 벡터를 두 번째 축으로 선택합니다. 세 번째 축은 다시 두 번째 축과 직각이 되는 벡터를 축으로 설정합니다. 이렇게 데이터를 충분히 설명할 수 있는 몇 개의 주성분으로 압축하는 과정을 거쳐 최종적으로 주성분을 구하게 됩니다.
(벡터끼리 서로 직각이라는 말은 서로 독립이라는 뜻과 같습니다.)
코드로 알아보겠습니다.
먼저 PCA를 사용하기 위해서는 일반적으로 데이터를 스케일링 합니다. 왜냐하면, 변수 간의 스케일의 차이가 주성분 선정에 영향을 줄 수도 있기 때문입니다.
그 후, sklearn의 PCA 모듈을 가져와서 PCA를 추출해 보겠습니다.
우선 sklearn의 iris 데이터를 가지고 와 데이터프레임으로 만듭니다. 이 때 target class 값을 지정하여 데이터프레임에 컬럼을 추가해 주는 과정도 필요합니다.
그 후, 아래와 같이 수치형 변수만 추출하여 scaling 작업을 거칩니다.
이제 본격적으로 PCA 모듈을 사용해 볼 것입니다. PCA 모듈은 아래와 같이 사용합니다.
from sklearn.decompostition import PCA
pca = PCA(n_components= 생성할 주성분 개수)
pca_fit = pca.fit(x)
우선, 주성분의 개수를 원래 데이터 차원과 동일하게 4로 해 보겠습니다. 그 후, PCA를 수행하여 얻은 결과값 중 explained_variance_ratio_라는 속성을 이용하여 그 후 PCA 주성분 개수를 결정해 보도록 하겠습니다.
- singular_values_: 고유값
- explained_variance_ratio_: 전체 데이터에서 각 주성분이 설명할 수 있는 분산의 비율
위와 같이 얻은 결과 중 explained_variance_ratio_ 속성을 이용하여 그래프를 그려보겠습니다. 이를 'Scree Plot'이라고 하는데, 이는 주성분 각각으로 설명할 수 있는 분산의 정도를 점으로 표시하고 각 점들을 이은 선 입니다. 주성분 개수가 증가할수록 Scree Plot의 기울기(분산의 변화 정도)는 감소합니다. 보통 플롯의 기울기가 급격히 감소하는 지점의 직전까지를 주성분으로 선택합니다.
위 그래프를 통해 주성분 개수가 2개면 꽤 괜찮은 선택이라고 할 수 있을 것 같네요. 다시 2개의 주성분으로 PCA를 학습해 보도록 하겠습니다. 그리고 추출된 PCA 성분으로 각 데이터를 잘 구분하는 지 그림을 그려보도록 하겠습니다.
위와 같이 종속 변수를 잘 설명(분류)하는 산포도를 확인할 수 있습니다. 기존 데이터프레임은 차원이 4였다면, PCA를 통해 차원을 2로 줄여 이차원 평면에서도 시각적으로 나타낼 수 있어 편리한 것 같네요!
출처
[데싸라면, 빨간색 물고기, 자투리코드] 파이썬 한권으로 끝내기: 데이터분석전문가(ADP) + 빅데이터분석기사 실기대비, 시대고시기획(2022), p111-116)
'Data Science > Pandas' 카테고리의 다른 글
결측치 처리 - KNNImputer (0) | 2023.09.01 |
---|---|
Confusion Matrix - 혼동행렬 (0) | 2023.09.01 |
날짜 데이터 핸들링 (datetime) (0) | 2023.08.30 |
데이터 재구조화 (pivot_table, melt) (0) | 2023.08.30 |
Concat, Append와 Join, Merge (0) | 2023.08.30 |