차원축소 : 매우 많은 피처로 구성된 다차원 데이터 세트의 차원을 축소해 새로운 차원의 데이터 세트를 생성하는 것
대표적인 차원 축소(Dimension Reduction)
: PCA, LDA, SVD, NMF
차원축소는 피처 선택(feature selection)과 피처 추출(feature extraction)으로 구분됨
차원 축소 알고리즘은 매우 많은 픽셀로 이뤄진 이미지 데이터에서 잠재된 특성을 피처로 도출해 함축적 형태의 이미지 변환과 압축을 수행, 텍스트 문서의 숨겨진 의미를 추출
PCA(principal component analysis)
- 가장 대표적인 차원 축소 기법
- 여러 변수 간에 존재하는 상관관계를 이용해 이를 대표하는 주성분을 추출해 차원을 축소하는 기법
- 분산이 데이터의 특성을 가장 잘 나타내는 것으로 간주하며 가장 높은 분산을 가지는 데이터의 축을 찾아 이 축으로 차원을 축소
- 가장 큰 데이터 변동성을 기반으로 첫 번재 벡터 축을 생성하고 두 번째 축은 이 벡터 축에 직각이 되는 벡터인 직교 벡터를 축으로 한다
입력 데이터의 공분산 행렬이 고유벡터와 고유값으로 분해될 수 있으며, 이렇게 분해된 고유 벡터를 이용해 입력 데이터를 선형 변환하는 방식
스텝
1. 입력 데이터 세트의 공분산 행렬을 생성
2. 공분산 행렬의 고유벡터와 고유값을 계산
3. 고유값이 가장 큰 순으로 k개만큼 고유벡터를 추출
4. 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 변환
사이킷런의 붓꽃 데이터
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
iris=load_iris()
#넘파이 데이터 세트를 판다스 DataFrame으로 변환
columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
irisDF = pd.DataFrame(iris.data, columns=columns)
irisDF['target']=iris.target
irisDF.head(3)
각 품종에 따라 원본 붓꽃 데이터 세트가 어떻게 분포돼 있는지 2차원으로 시각화
#setosa는 세모, versicolor는 네모, virginica는 동그라미로 표현
markers = ['^', 's', 'o']
#setosa의 target 값은 0, versicolor는 1, virginica는 2. 각 target별로 다른 모양으로 산점도로 표시
for i, marker in enumerate(markers):
x_axis_data = irisDF[irisDF['target']==i]['sepal_length']
y_axis_data = irisDF[irisDF['target']==i]['sepal_width']
plt.scatter(x_axis_data, y_axis_data, marker=marker, label=iris.target_names[i])
plt.legend()
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.show()
붓꽃 데이터 세트에 바로 PCA를 적용하기 전에 개별 속성을 함께 스케일링 해야함
PCA는 여러 속성의 값을 연산해야 하므로 속성의 스케일에 영향을 받으므로 각 속성값을 동일한 스케일로 변환하는 것이 필요
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)
iris_pca는 변환된 PCA 데이터 세트를 150*2 넘파이 행렬로 가지고 있음
이를 DataFrame으로 변환한 뒤 데이터 값 확인
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)
print(pca.explained_variance_ratio_)
PCA는 차원 축소를 통해 데이터를 쉽게 인지하는 데 활용할 수 있지만 이보다 더 활발하게 적용되는 영역은 컴퓨터 비전(Computer Vision)분야이다. 트히 얼굴 인식의 경우 Eigen-face라고 불리는 PCA 변환으로 원본 얼굴 이미지를 변환해 사용하는 경우 많음
LDA(linear discriminant analysis)
- 선형 판별 분석법
- PCA와 유사하게 입력 데이터를 저차원 공간에 투영해 차원을 축소하는 기법이지만, 중요한 차이는 LDA는 지도학습 분류에서 사용하기 쉽도록 개별 클래스를 분별할 수 있는 기준을 최대한 유지하면서 차원을 축소
- 입력 데이터의 결정 값 클래스를 최대한으로 분리할 수 있는 축을 찾음
- 공분산 행렬이 아니라 클래스 간 분산과 내부 분산 행렬을 생성한 뒤, 이 행렬에 기반해 고유벡터를 구하고 입력 데이터를 투영
1. 클래스 내부와 클래스 간 분산 행렬을 구한다. 이 두 개의 행렬은 입력 데이터의 결정 값 클래스별로 개별 피처의 평균 벡터를 기반으로 구한다
2. 식을 통해 두 행렬을 고유 벡터로 분해
3. 고유값이 가장 큰 순으로 k개 추출
4. 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새로운 입력 데이터를 변환
붓꽃 데이터 세트에 LDA 적용하기
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)
PCA와 다르게 LDA에서 한 가지 유의해야 할 점은 LDA는 실제로는 PCA와 다르게 비지도 학습이 아닌 지도학습이라는 것
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(iris_scaled, iris.target)
iris_lda = lda.transform(iris_scaled)
print(iris_lda.shape)
PCA로 변환된 데이터와 좌우 대칭 형태로 많이 닮아있음 확인 가능
SVD(singular value decomposition)
- 특이값 분해
- SVD는 정방행렬뿐만 아니라 행과 열의 크기가 다른 행렬에도 적용 가능
from sklearn.decomposition import TruncatedSVD, PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
%matplotlib inline
iris = load_iris()
iris_ftrs = iris.data
#2개의 주요 컴포넌트로 TruncatedSVD 변환
tsvd = TruncatedSVD(n_components=2)
tsvd.fit(iris_ftrs)
iris_tsvd = tsvd.transform(iris_ftrs)
데이터 세트가 스케일링으로 데이터 중심이 동일해지면 사이킷런의 SVD와 PCA는 동일한 변환을 수행한다
이는 PCA가 SVD 알고리즘으로 구현됐음을 의미
SVD는 컴퓨터 비전 영역과 텍스트의 토픽 모델링 기법인 LSA(Latent Semantic Analysis)의 기반 알고리즘
NMF(non-negative matrix factorization)
- 낮은 랭크를 통한 행렬 근사(Low-Rank Approximation) 방식의 변형
- 원본 행렬 내의 모든 원소 값이 모두 양수(0 이상)라는 게 보장되면 좀 더 간단하게 두 개의 기반 양수 행렬로 분해될 수 있는 기법
- 잠재 요소를 특성으로 가지게 됨
NMF도 SVD와 유사하게 이미지 압축을 통한 패턴 인식, 텍스트의 토픽 모델링 기법, 문사 유사도 및 클러스터링에 잘 사용됨, 영화 추천과 같은 추천(Recommendation) 영역에도 활발하게 적용
예) 사용자의 상품 평가 데이터 세트인 사용자-평가 순위(user-Rating) 데이터 세트를 행렬 분해 기법으로 통해 분해하면서 사용자가 평가하지 않은 상품에 대한 잠재적인 요소를 추출해 이를 통해 평가 순위를 예측하고 높은 순위로 예측된 상품을 추천해주는 방식 -> 잠재 요소(Latent Factoring) 기반의 추천 방식
'ML' 카테고리의 다른 글
군집화 실습 - 고객 세그먼테이션 (0) | 2022.11.20 |
---|---|
군집화 (2) | 2022.11.20 |
캐글 주택 가격 : 고급 회귀 기법 (0) | 2022.11.19 |
자전거 대여 수요 예측 (0) | 2022.11.19 |
로지스틱 회귀 (0) | 2022.11.19 |