Python/Sklearn

[Sklearn] 파이썬 사이킷런 PCA 구현 및 시각화 예제

jimmy_AI 2022. 2. 12. 15:02
반응형

Python PCA(주성분 분석) 차원 축소 실습 코드

안녕하세요. 이번 시간에는 파이썬의 사이킷런 라이브러리를 활용하여

대표적인 차원 축소 기법인 주성분 분석(PCA)을 구현해보고

설명력 결과 해석 및 시각화를 해보는 실습까지 진행해보도록 하겠습니다.

 

 

데이터셋 불러오기, 정규화

이번에 PCA 차원 축소를 진행해볼 데이터 셋은 사이킷런에서 제공하는 iris 데이터셋입니다.

 

또한, PCA 과정 수행을 위해서는 각 feature의 평균과 편차를 일정하게 맞추는

정규화 과정이 필수적으로 수행되어야 하므로, StandardScaler를 미리 적용하도록 하겠습니다.

 

데이터셋 로드 및 정규화 과정은 아래 코드를 참고해주시면 됩니다.

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np

# 데이터셋 로드
iris = load_iris()
df = pd.DataFrame(data= np.c_[iris.data])

# 데이터셋 정규화
scaler = StandardScaler()    
scaler.fit(df)
df_scaled = scaler.transform(df)

# 데이터 프레임으로 자료형 변환 및 target class 정보 추가
df_scaled = pd.DataFrame(df_scaled, columns= ['sepal length', 'sepal width', 'petal length', 'petal width'])
df_scaled['target'] = iris.target

df_scaled

정규화가 완료된 데이터프레임은 아래와 같이 나타나게 됩니다.

다만, 여기서 target 정보(꽃 종류)는 정규화를 진행하지 않았습니다.

4가지 feature가 평균 0, 표준 편차 1을 기준으로 정규화된 결과를 확인하였습니다.

 

 

PCA 차원 축소 진행

이제, 사이킷런의 PCA 함수를 이용하여 차원 축소를 진행하여 보겠습니다.

원하는 축소된 차원의 수를 n_components 인자에 지정해주시면 됩니다.

 

여기서는 4개의 feature를 2개의 주성분으로 차원 축소해보도록 하겠습니다.

다만, target class 정보가 feature에 포함되지 않도록 유의해주세요.

from sklearn.decomposition import PCA

# 2차원으로 차원 축소, target 정보는 제외
pca = PCA(n_components = 2)
pca.fit(df_scaled.iloc[:,:-1])
 
# pca transform 후 데이터프레임으로 자료형 변경
df_pca = pca.transform(df_scaled.iloc[:,:-1])
df_pca = pd.DataFrame(df_pca, columns = ['component 0', 'component 1'])

df_pca

2차원으로 축소된 결과를 데이터프레임으로 나타내면 아래와 같이 표현됩니다.

반응형

PCA 주성분 설명력 출력

차원 축소된 결과에서 첫 주성분이 가장 데이터 분포에서의 분산에 대한 설명력이 높고,

이후 주성분으로 갈수록 설명력이 점차 낮아지게 됩니다.

 

위에서 학습된 PCA 모듈의 explained_variance_ratio_ 속성을 불러오면

각 주성분에 대한 설명력을 살펴볼 수 있습니다.

 

보통 데이터 차원의 수가 큰 경우에는

총 주성분 설명력 비율의 합이 80~90%를 넘는 정도가 되는 선까지의 정보를

활용하는 경우가 많으니 참고해보세요.

# PCA 주성분 설명력 출력

print(pca.explained_variance_ratio_)
# [0.72962445, 0.22850762]

위의 예시에서는 첫 주성분이 대략 73%, 두번째 주성분이 대략 23%의

분산 설명력을 가져 두 주성분이 4차원의 데이터 분포의 특징 중

약 96%를 설명하고 있음을 알 수 있었습니다.

 

 

PCA 차원 축소 결과 시각화

마지막으로, 위에서 얻은 주성분들의 결과를 가지고 시각화를 진행해보도록 하겠습니다.

2차원의 정보로 축소된 결과는 각 주성분을 x, y축에 아래와 같이 쉽게 투영할 수 있습니다.

 

데이터 분포 요약의 결과를 쉽게 보기위하여 꽃 종류별로 다른 색의 산점도로 나타내보았습니다.

import matplotlib.pyplot as plt

# class target 정보 불러오기 
df_pca['target'] = df_scaled['target']

# target 별 분리
df_pca_0 = df_pca[df_pca['target'] == 0]
df_pca_1 = df_pca[df_pca['target'] == 1]
df_pca_2 = df_pca[df_pca['target'] == 2]

# target 별 시각화
plt.scatter(df_pca_0['component 0'], df_pca_0['component 1'], color = 'orange', alpha = 0.7, label = 'setosa')
plt.scatter(df_pca_1['component 0'], df_pca_1['component 1'], color = 'red', alpha = 0.7, label = 'versicolor')
plt.scatter(df_pca_2['component 0'], df_pca_2['component 1'], color = 'green', alpha = 0.7, label = 'virginica')

plt.xlabel('component 0')
plt.ylabel('component 1')
plt.legend()
plt.show()

두 주성분이 꽃 종류별 feature들의 분포 특징을 제법 잘 잡아내고 있음을 볼 수 있었습니다.