: 매우 많은 피처로 구성된 다차원 세트의 차원을 축소해 새로운 차원의 데이터 세트를 생성하는 것
: 변수 간 상관관계를 이용해 이를 대표하는 주성분을 추출해 차원을 축소하는 방법
첫 번째 벡터 축 : 가장 큰 데이터 변동성(Variance)을 기반으로 생성
두 번째 벡터 축 : 첫 번째 벡터 축에 직각이 되는 벡터(직교 벡터)를 축으로 함
세 번째 벡터 축 : 다시 두 번째 축과 직각이 되는 벡터를 설정하는 방식으로 축 생성
- 선형대수 관점 : 입력 데이터의 공분산 행렬(Covariance Matrix)을 고유값 분해하고, 이렇게 구한 고유벡터에 입력 데이터를 선형 변환하는 것
PCA의 주성분 : 위에서 말하는 고유벡터. 입력 데이터의 분산이 가장 큰 방향을 나타낸다.
고유값(eigenvalue) : 고유벡터의 크기. 입력 데이터의 분산을 나타냄
선형 변환 : 특정 벡터에 행렬 A를 곱해 새로운 벡터로 변환하는 것, 특정 벡터를 하나의 공간(행렬을 공간으로 가정)에서 다른 공간으로 투영하는 개념
고유 벡터 : 행렬A를 곱하더라도 방향이 변하지 않고, 그 크기만 변하는 벡터
분산 : 한 개의 특정한 변수의 데이터 변동을 의미
공분산 : 두 변수 간의 변동을 의미
공분산 행렬 : 여러 변수와 관련된 공분산을 포함하는, 정방 행렬 & 대칭 행렬
X | Y | Z | |
---|---|---|---|
X | 3.0 | -0.71 | -0.24 |
Y | -0.71 | 4.5 | 0.28 |
Z | -0.24 | 0.28 | 0.91 |
정방 행렬(Diagonal Matrix) : 열과 행이 같은 행렬
대칭 행렬(Symmetric Matrix) : 정방 행렬 중에서 대각 원소를 중심으로 원소값이 대칭되는 행렬, 대
공분산 행렬의 분해
= 고유벡터의 직교 행렬 고유값 정방행렬 고유벡터 직교행렬의 전치 행렬
- 는 번째 고유 벡터
- 는 번째 고유벡터의 크기(고유값)
- 는 가장 분산이 큰 방향을 가진 고유 벡터
- 는 에 수직이면서, 그 다음으로 분산이 큰 방향을 가진 고유벡터
PCA : 입력 데이터의 공분산 행렬이 고유벡터와 고유값으로 분해될 수 있으며, 이렇게 분해된 고유벡터를 이용해 입력 데이터를 선형 변환하는 방식
수행
PCA : 입력 데이터의 공분산 행렬(Covariance Matrix)을 고유값 분해하고, 이렇게 구한 고유벡터(주성분)에 입력 데이터를 선형 변환하는 것
공분산 행렬의 분해
= 고유 벡터 : 행렬이 작용하는 힘의 방향
= 고유값 : 입력데이터의 분산 & 고유 벡터의 크기
는 가장 분산이 큰 방향을 가진 고유 벡터, 는 에 수직이면서, 그 다음으로 분산이 큰 방향을 가진 고유벡터
from sklearn.preprocessing import StandardScaler
# Target 값을 제외한 모든 속성 값을 StandardScaler를 이용하여 표준 정규 분포를 가지는 값들로 변환
iris_scaled = StandardScaler().fit_transform(irisDF.iloc[:, :-1])
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
#fit( )과 transform( ) 을 호출하여 PCA 변환 데이터 반환
pca.fit(iris_scaled)
iris_pca = pca.transform(iris_scaled)
print(iris_pca.shape)
# PCA 환된 데이터의 컬럼명을 각각 pca_component_1, pca_component_2로 명명
pca_columns=['pca_component_1','pca_component_2']
irisDF_pca = pd.DataFrame(iris_pca, columns=pca_columns)
irisDF_pca['target']=iris.target
irisDF_pca.head(3)
pca.explained_variance_ratio_
> [0.72962445 0.22850762]
>> 원본 데이터의 0.95 변동성을 설명할 수 있음
df.corr()
로 각 속상간의 상관도를 구한 뒤, heatmap으로 보기: PCA와 유사하지만, 지도 학습의 분류에서 사용하기 쉽도록 개별 클래스를 분별할 수 있는 기준을 최대한 유지하면서 차원 축소
= 고유 벡터 : 행렬이 작용하는 힘의 방향
= 고유값 : 입력데이터의 분산 & 고유 벡터의 크기
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
iris = load_iris()
iris_scaled = StandardScaler().fit_transform(iris.data)
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(iris_scaled, iris.target) # 지도학습이라, fit할 때, 클래스 결정값 (y) 넣어야함
iris_lda = lda.transform(iris_scaled)
print(iris_lda.shape)