고차원의 데이터 집합이 주어졌을때, 발생하는 문제점들을 해결하기 위해 차원 축소 활용
데이터들의 차원이 증가함에 따라, 머신러닝 모델의 성능에 영향을 준다.
- 노이즈 증가
- 모델 훈련 시간 증가
- 등등.....
이를 위한 해결책
- feature selection : 중요한 feature들을 선택
- feature extraction : 기존의 feature를 활용하여 새로운 좌표계 생성
✅ 차원축소의 대표적인 방법으로 PCA를 들수 있다.
✅ 벡터의 특이분해를 통해 다차원 벡터를 더 낮은 차원의 벡터공간에 투영
✅ 정확한 설명은 아니지만 쉽게 이해를 해보자면 데이터들 사이의 공분산을 잘 설명할 수 있는 새로운 좌표계를 만들고, 이를 통해 데이터들을 설명하는 과정
✅ dataset - Pima Indians Diabetes Database
https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database?select=diabetes.csv
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]
# 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
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
✅ 차원 축소 이전 원래 dataset
train
score - 0.7743055555555556
test
score - 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개로 변환하였을때
✅ 공부한 곳
데이터 사이언스 스쿨
https://datascienceschool.net/02%20mathematics/03.05%20PCA.html