개발일기

기초 수학 - PCA(주성분 분석) 본문

Deep Learning, Machine Learning/기초 수학

기초 수학 - PCA(주성분 분석)

Flashback 2024. 5. 1. 18:59
728x90
반응형

PCA(주성분 분석)

PCA(Principal Component Analysis)는 다차원으로 구성된 데이터를 분석할 때 사용하는 머신러닝 알고리즘이다. 데이터는 기본적으로 여러 차원으로 구성되어 있다. 각 차원은 데이터의 특성을 담고 있는데 상대적으로 덜 중요한 데이터를 담고 있는 차원이 존재한다. 이와 반대로 중요한 데이터를 담고 있는 차원 또한 존재한다. PCA는 덜 중요한 차원의 데이터를 압축하여 차원을 축소시켜 나간다. 이 과정을 통해 생성된 새로운 데이터 세트는 중요한 데이터를 압축하여 담고 있으며 데이터 분석을 진행할 때 효율적으로 분석을 진행할 수 있다. 쉽게 말하면 10차원 데이터를 3차원으로 축소시켜 표현한다고 할 수 있다.

 

Iris 예제

Sklearn에서 제공하는 데이터 셋으로 PCA를 이해를 도울 수 있다. 기본 제공되는 데이터 세트에서 붓꽃 데이터를 통해 확인해보자.

from sklearn import datasets
iris = datasets.load_iris() # 붓꽃관련 데이터 세트

print("Shape: ", iris.data.shape) # 데이터 차원 확인
print("Features: ", iris.get('feature_names')) # 특성 이름(열 이름)

"""
Shape:  (150, 4)
Features:  ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
"""

sklearn을 통해 데이터 세트를 가져온다. 이 데이터 세트는 3가지 붓꽃에 대해 4개의 특성을 가진 데이터 샘플로 구성되어 있다.

data.shape: 데이터 세트의 차원을 출력한다. (150, 4)가 나오는데 150행 4열로 데이터로 구성되어 있다는 뜻이며 열은 데이터의 특성이고 행은 데이터 묶음이다. 즉 A라는 꽃에 각 열에 해당하는 특성이 존재하며 이러한 꽃의 종류가 150개가 있다는 의미이다.

get(’feature_names’): 데이터 세트의 특성을 출력한다. 총 4개가 나오는데 데이터 세트의 열 개수와 동일하다. 여기서 sepal은 꽃받침, petal은 꽃잎을 의미한다.

이제 데이터를 2개의 주성분으로 표현하고자 한다. 주성분을 2개로 설정하면 x, y 그래프로 시각화 할 수 있어 데이터 분석이 용이하기에 2개로 설정한다.

 

PCA 적용

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

pca = PCA(n_components=2) # 2개의 주성분
X = pca.fit_transform(iris.data) # PCA 알고리즘 적용

print("PCA Shape: ", X.shape) # PCA 적용된 차원
print(X[0:10, :]) # 데이터

print(plt.scatter(X[:, 0], X[:, 1])) # iris.data[0:10, :] # 10개의 붓꽃 데이터

"""
PCA Shape:  (150, 2)
[[-2.68412563  0.31939725]
 [-2.71414169 -0.17700123]
 [-2.88899057 -0.14494943]
 [-2.74534286 -0.31829898]
 [-2.72871654  0.32675451]
 [-2.28085963  0.74133045]
 [-2.82053775 -0.08946138]
 [-2.62614497  0.16338496]
 [-2.88638273 -0.57831175]
 [-2.6727558  -0.11377425]]
"""

주요한 성분 2개로 데이터 특성을 압축하니 2차원으로 데이터가 축소된다. 데이터를 출력하면 2개의 열만 나오는 것을 확인할 수 있다. 또한 그래프로 출력하면 150개의 데이터가 x, y 좌표에 표시된다. 그래프에 나타난 데이터를 기반으로 데이터의 타겟을 예측할 수 있지만 간단하게 색상을 추가하여 어떤 타겟을 나타내는지 확인해보자.

 

타겟 분류

print("Target Name: ", iris.target_names)
print(plt.scatter(X[:, 0], X[:, 1], c=iris.target))

"""
Target Name:  ['setosa' 'versicolor' 'virginica']
"""

Iris의 타겟은 세 종류로 정해져있다. 한 종류당 50개의 데이터 샘플을 가지며 순서대로 나열되어 있다. 2개의 주성분으로 3종류의 붓꽃을 일정한 패턴이 보이도록 분류할 수 있다.

 


참고 사이트:

https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html

 

The Iris Dataset

This data sets consists of 3 different types of irises’ (Setosa, Versicolour, and Virginica) petal and sepal length, stored in a 150x4 numpy.ndarray The rows being the samples and the columns being...

scikit-learn.org

 

https://www.datacamp.com/tutorial/principal-component-analysis-in-python

 

https://colab.research.google.com/drive/1l3ITSIU7zqv1sFEM5zlkvO6Nf24yNx-g?usp=sharing

 

PCA.ipynb

Colab notebook

colab.research.google.com

 

728x90
반응형
Comments