1. 서론
이 글의 목적은 교육 및 지식 공유가 아니라, 개인적인 개념 정리를 목적으로 합니다.
아직은 전문가 수준의 지식이 없기 때문에, 아래 내용은 참고만 해주시면 감사하겠습니다.^^
선형대수학 관점에서의 PCA의 원리와 데이터 관점에서의 PCA의 의미에 대해 공부하고 있는데,
아직 원리 이해에 어려움이 있네요...ㅎ 특히 수학적인 부분의 이해가 약하다는 생각이 드네요..ㅎ
2. 데이터 관점에서의 PCA의 의미
PCA는 Principle Component Analysis의 약자로 주성분 분석을 뜻하며,
차원축소와 변수추출 기법으로 널리 쓰이고 있다.
보통 우리가 분석하는 데이터는 많은 차원(변수)을 가지고 있는데,
고차원 데이터를 저차원 데이터로 축소시켜 평면상으로 보여주는 것이 차원 축소의 개념이고,
기존 변수(차원)를 조합해서 새로운 변수를 만드는 변수추출 기법으로도 활용하는 것 같다.
기본적인 원리는 데이터의 분산을 최대한 보존하면서 서로 직교하는 축을 찾아,
고차원 공간의 표본들을 직교하는 축에 정사영시켜 저차원으로 변환하는 원리인데...
3. 수학적인 관점에서의 PCA의 원리
수학적인 관점으로 예를 들어 설명하자면
평면상의 2개 벡터의 차원을 축소하기 위해 유사성을 표현하는 공분산 행렬을 구한 후,
공분산 행렬의 고유벡터와 고유값을 구하고, 그 고유벡터에 2개 벡터의 성분을 내적하여
정사영시켜 1차원 벡터로 변환하는 원리인 것 같다. (제대로 설명한건지 아직 확신이 들지 않네요...ㅎ)
4. 결론
무튼 가장 중요한 것은 "어떻게 차원을 잘 낮추느냐" 일 것 같다.
고차원 데이터의 특징을 모두 살리면서 저차원 데이터로 바꾸는 것은 쉽지 않기 때문에
차선책으로 최대한 특징들을 살리면서 차원을 낮추는 방법 중 하나인 PCA를 활용하면 좋을 것 같다.
추가로 머신러닝에서 발생하는 오버피팅 이슈 해결에도 PCA를 많이 사용하는 것 같다.
5. Iris 데이터를 통한 PCA 실습
많은 분들이 사용하는 Iris 데이터에 PCA를 사용해보자.
# iris data로 PCA 실습하기
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
# iris data 가져오기 & DataFrame으로 변환
iris = load_iris()
iris_pd = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_pd['species'] = iris.target
iris_pd.head(3)
# iris data의 특성을 확인해보자
sns.pairplot(iris_pd, hue='species', height=3,
x_vars = ['sepal length (cm)', 'petal width (cm)'],
y_vars = ['petal length (cm)', 'sepal width (cm)']);
# PCA를 이용해서 iris 데이터를 차원축소 및 변수추출 해보자.
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# PCA 결과를 return하는 함수
def get_pca_data(ss_data, n_components=2):
pca = PCA(n_components=n_components, random_state=13)
pca.fit(ss_data)
return pca.transform(ss_data), pca
# iris data를 표준화
iris_ss = StandardScaler().fit_transform(iris.data)
# 축소된 2차원 PCA 주성분 데이터와 pca모델 반환
iris_pca, pca = get_pca_data(iris_ss, 2)
# 2차원 주성분 데이터를 데이터프레임으로 표현
iris_pd_pca = pd.DataFrame(iris_pca, columns=['pca_components_1', 'pca_components_2'])
iris_pd_pca['species'] = iris.target
iris_pd_pca.head(3)
# 2개 속성을 그래프로 나타내보자
sns.pairplot(iris_pd_pca, hue='species', height=5,
x_vars=['pca_components_1'], y_vars=['pca_components_2']);
[기존 Iris 데이터와 차원축소된 Iris 데이터의 비교]
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
# 랜덤포레스트를 함수로 작성하여 Accuracy Score 확인
def rf_score(X, y, cv=5):
rf = RandomForestClassifier(random_state=13, n_estimators=100)
score_rf = cross_val_score(rf, X, y, scoring='accuracy', cv=cv)
print('Acc Score : ', np.mean(score_rf))
# 4개 속성을 가진 기존 iris 데이터 사용
rf_score(iris_ss, iris.target)
# 2개 속성을 가진 차원축소된 iris 데이터 사용
pca_X = iris_pd_pca[['pca_components_1', 'pca_components_2']]
rf_score(pca_X, iris.target)
# Acc Score : 0.96
# Acc Score : 0.9066666666666666
6. PCA를 공부하고 활용하고 느낀점
4개의 속성을 가진 기존 Iris 데이터로 RandomForest모델을 돌렸을 때 Score는 0.96,
2개의 속성으로 차원축소 시킨 Iris 데이터로 RandomForest 모델을 돌렸을 때 Score는 약 0.9067
차원이 축소되면서 Score가 감소하긴 했으나, 여전히 높은 수준의 결과값을 보였다.
이정도 Score를 유지할 수 있다면 PCA를 통한 차원 축소가 유의미한 결과를 가진다고 볼 수 있을 것 같다.
2개의 속성으로 차원축소를 시키면서 데이터 유지 및 관리에도 효율적일 것 같고,
Iris 데이터가 아닌, 대용량 빅데이터를 다룰 때, 시간적인 관점에서의 모델 성능도 우수할 것 같다.
PCA의 원리나 관련 개념들은 딥러닝에서도 활용되기 때문에 폭넓은 이해를 위해 계속해서 보완하면 좋을 것 같다.
'Data Tech > DataScience(데이터과학)' 카테고리의 다른 글
[머신러닝] Ridge & Lasso 회귀 모델 (feat. Bias & Variance & Regularization) (0) | 2024.07.30 |
---|---|
[딥러닝] 3. Scratch for DeepLearning (1) | 2024.05.20 |
[딥러닝] 2. CNN (0) | 2024.05.19 |
[딥러닝] 1. MNIST 카테고리 분류 (0) | 2024.05.19 |
지도학습, 비지도학습, 강화학습의 의미와 정의 (+딥러닝?) (2) | 2024.04.09 |