-
[머신러닝] PCA와 feature selection 과의 비교머신러닝 배우기 2023. 12. 12. 15:17
머신러닝/딥러닝을 할 때, 데이터가 너무 많은데 하필 또 계산량이 많은 알고리즘(예, 거리 기반 알고리즘)을 적용해야할 때가 있습니다. 또는 데이터는 많지만 독립변수가 종속변수와 상관관계가 적을 때, 괜히 계산 리소스만 잡아먹기도 하고 모델이 일반화하기 어렵기도 합니다.
그럴 때면 피쳐를 줄이기 위해 Feature selection 을 하거나 PCA 방법을 사용하여 차원을 축소하곤 합니다. 이 두 가지 방법은 어떻게 다르고 PCA 기법이 무엇인지에 대해 알아보도록 하겠습니다.
▶︎ Feature selection과 PCA 비교하기
feature selection PCA 개념 독립변수 중에 종속변수와의 관련이 적은 변수들을 제거하거나 다중공선성이 큰 독립변수들을 제거하는 등 모델의 성능과 복잡성을 위해 덜 중요한 피쳐를 제거하는 방법 데이터의 분산을 최대화하는 방향으로 데이터의 주성분을 찾아 데이터를 새로운 좌표계로 변환하여 차원을 축소하는 기법 장점 - 머신러닝 모델의 성능을 향상시킴
- 피쳐 간의 상관관계를 고려하여 중요한 피쳐를 선택함으로써 다중공선성을 감소시킴
- 모델의 해석력이 증가함. 직관적이고 해석하기 쉬움
- 계산량이 줄어들고, 모델이 더 간단해짐- 주요 구조를 포착하여 주요 특성을 강조할 수 있음
- 불필요한 정보나 노이즈를 제거하는데 사용 가능
- 고차원 데이터의 시각화에 유용함단점 - 피쳐간 상호작용은 고려하지 않고 독립적으로 선택되기 때문에, 두 피쳐가 함께 있어야 중요한 정보를 줄 때면 모델이 중요한 특성을 잡아내기 힘들 수 있습니다.
이러한 상황이 있다면 feature enginnering으로 파생변수를 만드는 것도 좋은 방법입니다.- 주성분은 기존 특성들의 선형 조합으로 표현되기 때문에, 직접적으로 해석하기가 어려움
- 데이터의 분산을 최대화하는 방향으로 변환 과정을 거쳤기 때문에 그래도 정보의 손실은 불가피함
- 비선형 데이터에 사용하기 어려움
- 이상치에 방향으로 주성분이 영향을 받을 수 있음▶︎ PCA이란?
→ 비지도 학습의 차원축소 기법 중 하나로, 데이터의 분산을 최대화하는 방향(주성분)으로 새로운 좌표축을 찾아 이를 기반으로 데이터를 변환하는 방식
→ 데이터의 분산이 가장 큰 축을 찾아 첫번째 principal component, 첫번째 축에 직교하는 축 중 분산이 가장 큰 축을 찾아 두번째 principal component 반복하면서 원본 데이터의 정보를 최대한 살리면서 차원을 낮추는 것이다.
→ 선형대수의 꽃 PCA. 공분산 행렬, 고유값과 고유벡터, 데이터 변환 등 많은 선형대수 기법들이 쓰인다.
▶︎ 주성분 선택 기준은?
→ 고유값은 해당 주성분이 데이터의 분산을 설명하는 정도를 나타내는데, 고유값이 큰 주성분일수록 해당 주성분이 데이터의 중요한 특성을 잘 나타낸다고 해석할 수 있다. 이를 누적하여 나타내면, 누적 설명 분산을 확인할 수 있는데 누적 설명 분산이 일정 이상이면 해당 개수의 주성분을 선택할 수 있다. 예를 들어, 주성분이 95%이상의 분산을 설명하길 원하면, 누적 설명 분산이 95% 이상 되는 지점까지 주성분을 선택하면 된다.
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from sklearn import decomposition from sklearn import datasets import warnings warnings.filterwarnings("ignore") iris = datasets.load_iris() x = iris.data y = iris.target # PCA 모델 만들어서 학습시키고 적용하기 model = decomposition.PCA(n_components=3) model.fit(x) x = model.transform(x) # 새로운 축이 데이터 셋의 분산을 얼마나 설명할 수 있는지 확인 model.explained_variance_ratio_ # Result # array([0.92461621, 0.05301557, 0.01718514]) # 0.92461621 : 첫 번째 principal component가 원본 데이터 분산의 92.46%를 설명한다는 의미 # 0.05301557 : 두 번째 principal component가 원본 데이터 분산의 5.3%를 설명한다는 의미 # 설명된 분산 정보를 바탕으로 몇 개까지의 principal component를 사용할지 의사결정할 수 있음. # 95% 이상의 variance 를 설명하기 위한 축의 갯수를 확인하기 첫 번째 방법 np.argmax(np.cumsum(model.explained_variance_ratio_) >= 0.95 ) + 1 # 95% 이상의 variance 를 설명하기 위한 축의 갯수를 확인하기 두 번째 방법 model = decomposition.PCA(n_components=0.95) model.fit(x) x = model.transform(x) x # 보통은 90% 또는 95% 분산을 설명할 수 있으면 OK # 하지만 차원이 너무 많지 않다면, 원본 데이터 전체를 사용하는 것이 나을 수도 있음. 왜냐하면 PCA를 사용하면 정보의 손실이 어쩔 수 없이 일어나기 때문에
'머신러닝 배우기' 카테고리의 다른 글
불균형 데이터의 문제와 해결 방법, 평가지표 (0) 2023.12.28 카테고리컬 변수 인코딩하는 세가지 방법 (원핫 인코딩, 라벨 인코딩, 바이너리 인코딩) (1) 2023.12.17 [머신러닝] 클러스터링의 대표, K-means Algorithm (1) 2023.12.12 [머신러닝] HPO 최적의 하이퍼 파라미터 찾기 GridSearch 예제 (0) 2023.12.11 [머신러닝] Feature Scaling 피쳐 스케일링. 언제 어떤 Scaler를 써야할까? (Min-Max, 표준화, Robust Scaling) (0) 2023.12.11