ML) PCA(주성분분석) - 차원축소

dothouse·2024년 2월 8일
0

ML

목록 보기
8/9

0. 차원의 저주

  • 고차원의 데이터 집합이 주어졌을때, 발생하는 문제점들을 해결하기 위해 차원 축소 활용

  • 데이터들의 차원이 증가함에 따라, 머신러닝 모델의 성능에 영향을 준다.
    - 노이즈 증가
    - 모델 훈련 시간 증가
    - 등등.....

  • 이를 위한 해결책
    - feature selection : 중요한 feature들을 선택
    - feature extraction : 기존의 feature를 활용하여 새로운 좌표계 생성

1. PCA(주성분분석)

✅ 차원축소의 대표적인 방법으로 PCA를 들수 있다.

  • 고차원 데이터 집합이 주어졌을 때 원래의 고차원 데이터와 가장 비슷하면서 더 낮은 차원 데이터를 찾아내는 방법

✅ 벡터의 특이분해를 통해 다차원 벡터를 더 낮은 차원의 벡터공간에 투영

✅ 정확한 설명은 아니지만 쉽게 이해를 해보자면 데이터들 사이의 공분산을 잘 설명할 수 있는 새로운 좌표계를 만들고, 이를 통해 데이터들을 설명하는 과정

2. scikit-learn을 통한 PCA

✅ dataset - Pima Indians Diabetes Database
https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database?select=diabetes.csv

1) PCA

import pandas as pd

pima = pd.read_csv('./data/pima-indians-diabetes.csv', skiprows=9, header=None)
pima.columns = ['P', 'G', 'BP', 'S', 'I', 'BMI', 'D', 'Age', 'Target']

# 정규화
from sklearn.preprocessing import StandardScaler
# Target를 제외한 나머지 열을 정규화
pima_sta = StandardScaler().fit_transform(pima.iloc[:, :-1].values)
from sklearn.decomposition import PCA  
# n_components -> 차원축소에 사용하고자하는 feature수
pca = PCA(n_components=2) 

# pca를 통해 축소된 차원을 반영
pima_pca = pca2.fit_transform(pima_sta)

print(pca2.explained_variance_ratio_)

# 두 개의 feature로 설명 가능한 분산의 비율
[0.26179749 0.21640127]

2) PCA를 적용한 logistic regression

a. PCA 이전

# train / test set
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

X_train, X_test, y_train, y_test = train_test_split(pima_sta, pima.Target, stratify=pima.Target, test_size=0.25, random_state=22)
# PCA 이전 - logistic regression

lr = LogisticRegression(random_state=22)
lr.fit(X_train, y_train)

print('train', lr.score(X_train, y_train)) # 0.7743055555555556
print('test', lr.score(X_test, y_test))    # 0.8072916666666666

b. PCA 적용

from sklearn.decomposition import PCA  
# n_components -> 차원축소에 사용하고자하는 feature수
pca = PCA(n_components=2) 

# pca를 통해 축소된 차원을 반영
pima_pca = pca2.fit_transform(pima_sta)

# PCA를 실시한 dataset으로 다시 train / test set split
X_train, X_test, y_train, y_test = train_test_split(pima_pca, pima.Target, stratify=pima.Target, test_size=0.25, random_state=22)

lr = LogisticRegression(random_state=22)
lr.fit(X_train, y_train)

print('train', lr.score(X_train, y_train)) # 0.7083333333333334
print('test', lr.score(X_test, y_test))    # 0.75

c. logistic regression 결과 해석

✅ 차원 축소 이전 원래 dataset

  • trainscore - 0.7743055555555556

  • testscore - 0.8072916666666666

    ✅ 2개의 요인으로 차원 축소를 한 결과

  • 전체 분산의 약 47% 설명 (0.26179749 + 0.21640127)

  • train score : 0.774 -> 0.708

  • test score : 0.807 -> 0.75

    ✅ 5개의 요인으로 차원 축소를 한 결과

  • 전체 분산의 약 81% 설명

  • train score : 0.774 -> 0.743

  • test score : 0.807 -> 0.776

✅ 8개의 feature를 다 사용하지 않고, 5개로 변환하였을때

  • accuracy 감소
  • 실제 데이터에서는 더 많은 feature와 사례수가 있기 때문에 이러한 차원축소가 도움이 될 수 있음

✅ 공부한 곳

데이터 사이언스 스쿨
https://datascienceschool.net/02%20mathematics/03.05%20PCA.html

profile
새로운 길

0개의 댓글