co-code 님의 블로그

차원 축소 본문

python

차원 축소

co-code 2026. 5. 19. 19:00
  • PCA
    • 차원 축소 기법 : feature의 개수가 줄어든다.
    • 고차원 데이터(다수의 feature를 가진 데이터셋)를 상관관계가 없는 새로운 축으로 변환
    • 데이터의 분산을 최대한 보존하면서 차원을 줄여서 시각화
    • parameter(매개변수)
      • n_components
        • 기본값 : None
        • 주성분의 개수 또는 비율로 설정
        • None : 모든 주성분을 유지
        • int : 선택할 주성분의 개수
        •  float(0 ~ 1) : 누적 설명 분산 비율을 기준으로 필요한 주성분의 개수를 선택
        • 'mle' : 자동으로 최적 차원의 수 측정 (샘플의 개수 < feature의 개수 인 경우에만 사용이 가능)
      • whiten
        • 기본값 : False
        • 주성분 벡터를 단위 분산으로 정규화를 할 것인가 지정
        • 데이터의 정규화 효과
      • svd_solver
        • 기본값 : 'auto'
        • 분해 방식 지원
        • 'auto' : 데이터의 크기에 따라서 자동 선택
        • 'full' : 정확한 SVD 계산 (작은 데이터에서 사용)
        • 'randomized' : 확률적 근사 알고리즘 (대규모 데이터에서 유용)
      • 속성
        • components_ : 선택된 주성분 벡터
        • explained_variance_ : 각 주성분이 설명하는 분산의 값
        • explained_variance_ratio_ 
          • 각 주성분이 설명하는 분산의 비율
          • 합계가 1에 가까울수록 원래 분산을 잘 보존
        • singular_values_ : 선택된 주성분에 대응하는 특이값
        • noise_variance_ : 유지하지 않은 차원에서의 분산 추정
      • 메서드
        • fit(X, y) : 주성분을 학습
        • transform(X) : 학습된 주성분 축을 기준으로 하여 새로운 데이터 변환
        • fit_transform(X, y) : PCA학습 + 변환
        • get_covariance() : PCA로 추정된 공분산 행렬 변환
        • get_precision() : PCA로 추정된 정밀도 행렬 변환
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
#iris 데이터 로드
iris=pd.read_csv('../csv/iris.csv')
iris


X=iris.drop('species',axis=1)
y=iris['species']

#PCA 객체 생성
pca=PCA()

X_pca=pca.fit_transform(X, y)

pd.DataFrame(X_pca)

  • t-SNE
    • 비선형 차원 축소 기법으로 고차원의 데이터를 국소 구조를 보존하면서 2차원 또는 3차원 시각화를 하기 위해 사용
    • 고차원 데이터의 경우에는 거리 기반 유사도 (가우시안 분포를 이용한 계산)
    • 저차원의 경우에는 확률적으로 비슷하게 재현 (t-분포를 이용한 계산)
      • t-분포를 사용하는 이유는 멀리 떨어진 점 간의 차이를 완화시키기 위한 방법
    • 거리 계산 방법
      • 유클리드거리 (Euclidean) : 기본적인 거리 계산 방식 (직선의 거리) > 수치형 데이터에서 사용
      • 맨해튼 거리 (Manhatten) : 직각 축 기반 거리
      • 체비셰프 거리 (Chebyshev) : 최대의 축 차이 기반 거리
      • 코사인 거리(유사도) (Cosine) : 벡터 방향 기반 거리 -> 자연어 데이터에서 사용
      • 마할라노비스 거리 (Mahalanobis) : 변수 간의 상관 반영
    • parameter(매개변수)
      • n_components
        • 기본값 :2
        • 축소할 차원의 개수
      • perplexity
        • 기본값 : 30
        • 이웃의 수 제어 (군집 크기에 민감)
        • 보통 5 ~ 50 정도의 값을 사용
        • 값이 작은 경우 작은 구조, 값이 큰 경우 전체의 구조
        • 일반적으로 '샘플의 개수 / 3'
        • 너무 큰 값을 설정하면 전체를 포함하는 형태가 될 수 있다.
      • early_exggeration
        • 기본값 : 12
        • 초기 학습에서 군집 간의 거리를 지정 (분리 촉진)
      • learning_rate
        • 기본값 : 'auto'
        • 학습의 속도
        • 너무 작게 지정하면 수렴이 느려질 수 있음
        • 너무 크게 지정하면 군집이 왜곡될 수 있음
        • 100 ~ 1000 정도의 값을 사용
      • max_iter
        • 기본값 : 1000
        • 전체 학습의 반복 횟수
      • n_iter_without_progress
        • 기본값 : 300
        • 개선이 없을 때 조기 종료의 기준
      • metric
        • 기본값 : 'euclidean'
        • 거리 계산 방식
    • 속성
      • embedding_ : 변환된 저차원 데이터를 반환
      • kl_divergence_ : 최종 KL 발산 값을 반환 (작을수록 원래의 구조와 유사)
    • 메서드
      • fit() : 데이터를 학습
      • transform() : 데이터를 저차원으로 변환
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler
from sklearn.manifold import TSNE
#digits 데이터를 로드
digits=load_digits()

pd.DataFrame(digits.data)


#64차원의 데이터를 2차원으로 변경
tsne = TSNE(
    n_components=2,
    perplexity=40,
    random_state=42,
    n_jobs=-1
)