본문 바로가기

Data Science/Machine Learning 구현

[ML] Scikit-learn을 이용한 PCA 구현하기

반응형

이번 포스팅에서는 PCA에 대해 간단하게 알아보고 언제 PCA를 사용해야할지, 그리고 Scikit-learn 라이브러리를 이용해 PCA를 간단하게 구현해보는 내용에 대해 소개하려 한다. PCA에 대한 자세한 이론은 여기를 참고하자. 목차는 다음과 같다.

 

1. PCA란?

2. Scikit-learn 이용해 PCA 구현하기

1. PCA란?

PCA란, Principal Components Analysis로 한국어로는 '주성분 분석'이다. PCA는 feature 개수가 너무 많을 때, 여러 feature들의 내재된(latent) feature를 추출하는 것이다. PCA를 본격적으로 소개하기 전에 feature selection(선택)feature extraction(추출)의 차이점에 대해서 짚고 넘어가자.

 

  • Feature Selection : 특정 feature에 종속성이 강하여 불필요한 feature는 아예 제거하고, 데이터의 특징을 잘 나타내는 주요 feature만 선택하는 것이다.
  • Feature Extraction : 기존 feature를 저차원의 중요 feature로 압축해서 추출하는 것이다. 즉, 기존의 feature를 반영해서 압축 시킨 것이지만 주어진 데이터를 더 잘 설명할 수 있는 내재된 기존과는 다른 새로운 feature로 추출하는 것이다.

그림으로 두 가지의 차이점을 설명하면 다음과 같다.

 

https://www.groundai.com/project/a-scalable-saliency-based-feature-selection-method-with-instance-level-information/1

 

PCA는 이 두 가지 중에서 '추출'에 해당하는 Featuee Extraction 방법 종류 중 하나이다. 간단하게 PCA에 대해 정의하자면 입력 데이터의 공분산 행렬이 고유벡터와 고유값으로 분해되며 이렇게 분해된 고유벡터를 이용해 입력 데이터를 선형 변환하는 방식이다. 주로 추천엔진, 이미지 분류 및 변환(CNN이 등장하기 전 주로 사용됨), 문서 토픽 모델링에 자주 사용된다. 

2. Scikit-learn을 이용해 PCA 구현하기

Scikit-learn을 이용해 실제 데이터에 PCA를 적용해보고 모델링 결과에 대해 살펴보자. 우선 feature간에 상관관계를 확인해봄으로써 PCA를 적용해줄 feature를 살펴보자.

import os
os.chdir('/Users/younghun/Desktop/gitrepo/data')
# header=1 : 1번 인덱스에 칼럼 이름이 들어가 있으니 1번 인덱스를 칼럼으로 인지해!
df = pd.read_excel('default of credit card clients.xls',
                   sheet_name='Data', header=1)

df.rename(columns={'PAY_0':'PAY_1','default payment next month':'default'}, inplace=True)
y_target = df['default']
# ID, default 컬럼 Drop
X_features = df.drop(['ID','default'], axis=1)

# feature간 상관도 시각화
import seaborn as sns
import matplotlib.pyplot as plt

corr = X_features.corr()
plt.figure(figsize=(14,14))
sns.heatmap(corr, annot=True, fmt='.1g')

feature들간의 상관관계

 

위 heatmap을 살펴보면 살색으로 되어 있는 부분의 BILL_AMT로 시작하는 변수들간에 상관관계가 매우 높음을 알 수 있다. 따라서 이 Feature에 대해 PCA를 적용해주면 된다.

 

지금까지 했던 것과는 별개로 원본 데이터에 랜덤포레스트를 모델링한 것 6개의 주성분으로 분석한 데이터셋으로 랜덤포레스트를 모델링한 것 각각의 성능 결과를 비교, 평가해보자.

# 원본 데이터세트와 PCA적용 후 각 모델링 성능 비교
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

rcf = RandomForestClassifier()
scores = cross_val_score(rcf, X_features, y_target,
                        scoring='accuracy', cv=3)
print('원본 데이터셋 - 각 Fold별 정확도 :', scores)
print('원본 데이터셋 - 평균 정확도 :', np.mean(scores))

# Scaling 적용
scaler = StandardScaler()
df_scaled = scaler.fit_transform(X_features)

# PCA
pca = PCA(n_components=6)
df_pca = pca.fit_transform(df_scaled)
scores_pca = cross_val_score(rcf, df_pca, y_target,
                            scoring='accuracy', cv=3)
print('PCA적용 후 데이터셋 - 각 Fold별 정확도 :', np.mean(scores_pca))
print('PCA적용 후 데이터셋 - 평균 정확도 :', np.mean(scores))

결과 평가

 

반응형