본문 바로가기
파이썬

파이썬 강의: Scikit-learn 차원축소 마스터하기

by bio62⭐ 2024. 11. 5.

데이터 과학자를 위한 필수 가이드: 고차원 데이터를 효과적으로 다루는 방법

 

Scikit-learn은 파이썬 기반 머신러닝 라이브러리 중 가장 인기 있고 강력한 도구 중 하나입니다.  다양한 알고리즘과 편리한 기능을 제공하지만, 특히 고차원 데이터를 다룰 때 빛을 발하는 부분이 바로 차원 축소 기능이죠. 이 글에서는 Scikit-learn을 사용하여 차원 축소를 어떻게 효과적으로 수행하는지, 그리고 그 과정에서 흔히 부딪히는 문제점들과 해결책은 무엇인지 자세히 알아보도록 할 것입니다. 차원 축소가 왜 필요한지, 어떤 방법들이 있는지, 그리고 실제로 어떻게 적용하는지, 차근차근 풀어서 설명해 드릴 테니까 끝까지 함께 해주세요! 이 글을 읽고 나면, 여러분도 고차원 데이터 분석 전문가가 되는 길에 한 발짝 더 다가설 수 있을 것입니다! 자, 그럼 시작해 볼까요?

 


차원 축소: 왜 필요할까요? 그리고 어떻게 할까요?

데이터 분석이나 머신러닝 모델링을 할 때, 데이터의 차원이 너무 높으면 여러 가지 문제에 직면하게 됩니다. 일단, 계산량이 엄청나게 증가하죠. 데이터 크기가 커질수록, 특히 차원이 높아질수록 필요한 연산량이 기하급수적으로 늘어나기 때문에, 모델 학습 시간이 엄청 길어질 수밖에 없어요. 게다가 메모리 사용량도 폭발적으로 증가해서, 컴퓨터 자원이 부족해 모델 학습 자체가 불가능해지는 경우도 생겨요. 어휴, 상상만 해도 끔찍하죠?

 

그뿐만 아니라, 차원이 높으면 과적합 문제도 심각해져요. 모델이 훈련 데이터에 너무 과하게 적합되어, 실제 데이터에서는 성능이 엉망이 되는 현상이죠. 마치 학생이 시험 문제를 외워서 풀다가, 조금만 다른 문제가 나오면 멘붕하는 것과 비슷해요. 그래서 실제 성능은 떨어지고, 모델의 일반화 능력(새로운 데이터에 대한 예측 능력)이 낮아지게 됩니다. 결국, 아무리 정교한 모델을 만들어도 실제로는 쓸모없는 모델이 되는 거죠. 안타까운 현실이지만, 이런 문제들을 해결하기 위해 차원 축소 기법이 등장했어요.

 

차원 축소는 말 그대로 데이터의 차원을 줄이는 거예요. 하지만 단순히 데이터를 줄이는 것이 아니라, 데이터의 중요한 정보는 최대한 유지하면서, 불필요하거나 잡음이 많은 정보는 제거하는 것이 핵심입니다. 마치 사진을 압축하는 것과 비슷하다고 생각하면 이해하기 쉬울 거예요. 사진을 압축해도 중요한 정보는 그대로 유지하면서 파일 크기를 줄일 수 있잖아요? 차원 축소도 마찬가지로, 데이터의 본질적인 정보를 보존하면서 차원을 줄여 계산량과 과적합 문제를 해결하는 거죠.

 

그렇다면, 어떻게 차원을 줄일 수 있을까요? 여러 가지 방법이 있지만, Scikit-learn에서는 주성분 분석(PCA)과 t-SNE가 가장 널리 사용되는 기법입니다. PCA는 선형 변환 기법이고, t-SNE는 비선형 변환 기법이에요. 선형과 비선형의 차이가 뭘까요? 선형은 직선으로 표현할 수 있는 관계, 비선형은 곡선으로 표현해야 하는 관계라고 생각하면 돼요. 데이터의 특징에 따라 적절한 기법을 선택해야겠죠. 자세한 내용은 다음 절에서 살펴보도록 할게요!

 


Scikit-learn을 이용한 주성분 분석(PCA): 고차원 데이터의 마법

주성분 분석(Principal Component Analysis, PCA)은 아마 차원 축소 기법 중 가장 유명하고 널리 쓰이는 방법일 것입니다. PCA의 핵심 아이디어는 데이터의 분산을 최대한 보존하면서 차원을 줄이는 거예요. 데이터의 분산이 크다는 것은 데이터가 퍼져있다는 뜻이고, 이는 데이터에 포함된 정보가 많다는 의미로 해석할 수 있죠. PCA는 데이터의 분산을 가장 잘 설명하는 새로운 축(주성분)을 찾아, 데이터를 그 축에 투영하는 방식으로 차원을 줄여요.

 

좀 더 자세히 설명해 드릴게요. 만약 여러분이 100개의 변수를 가지고 있는 데이터를 가지고 있다고 가정해 봐요. PCA는 이 100개의 변수들을 분석해서, 데이터의 분산을 가장 잘 설명하는 몇 개의 새로운 변수(주성분)를 만들어내요. 예를 들어, 2개의 주성분을 만들었다면, 원래 100차원 데이터를 2차원 데이터로 축소한 것이죠. 물론, 정보 손실이 있을 수 있지만, PCA는 정보 손실을 최소화하면서 차원을 줄이도록 설계되었어요. 굉장히 똑똑한 알고리즘이죠?

 

PCA를 Scikit-learn으로 구현하는 것은 매우 간단합니다.  모듈의  클래스를 사용하면 되는데요,  매개변수를 통해 주성분의 개수를 지정할 수 있어요. 주성분의 개수를 얼마나 정해야 할지는 데이터에 따라 다르지만, 보통 설명된 분산 비율(explained variance ratio)을 참고하여 결정해요. 이 비율은 각 주성분이 데이터의 분산을 얼마나 설명하는지를 나타내는 지표로, 보통 95% 이상의 분산을 설명하는 주성분들을 선택하는 것이 일반적입니다. 95%면 충분히 데이터 특징을 잘 잡아낼 수 있겠죠?

 

PCA의 또 다른 장점은 계산 속도가 빠르다는 거예요. 특히, 데이터 크기가 매우 클 때 PCA는 다른 차원 축소 기법들에 비해 압도적으로 빠른 속도로 차원 축소를 수행할 수 있어요. 그래서 대용량 데이터 분석에 매우 적합하죠. 하지만 PCA는 데이터의 선형 관계만 고려하기 때문에, 비선형 관계가 강한 데이터에는 적합하지 않을 수 있다는 점을 유의해야 해요. 비선형 관계가 있다면, t-SNE 같은 비선형 차원 축소 기법을 고려하는 것이 좋습니다.

 


Scikit-learn을 이용한 t-SNE: 비선형 관계를 포착하는 섬세한 기술

t-SNE(t-distributed Stochastic Neighbor Embedding)는 PCA와 달리 비선형 관계를 잘 반영하는 차원 축소 기법입니다. PCA가 데이터의 전반적인 분포를 잘 나타내는 데 초점을 맞춘다면, t-SNE는 데이터 포인트 간의 국지적인 거리 관계를 보존하는 데 중점을 둡니다. 쉽게 말해, 서로 가까이 있는 데이터 포인트들은 저차원 공간에서도 가까이 위치하도록, 멀리 떨어진 데이터 포인트들은 멀리 떨어져 있도록 변환하는 거죠. 그래서 데이터의 군집 구조를 시각적으로 잘 보여주는 효과가 있어요.

 

t-SNE는 특히 고차원 데이터를 시각화할 때 매우 유용합니다. 고차원 데이터는 우리 눈으로 직접 확인하기 어렵잖아요? t-SNE를 사용하면 고차원 데이터를 2차원이나 3차원으로 축소하여 시각화할 수 있기 때문에, 데이터의 패턴이나 군집을 직관적으로 파악할 수 있습니다. 예를 들어, 문서 분류나 이미지 분류 문제에서 t-SNE를 사용하면 서로 비슷한 문서나 이미지들이 저차원 공간에서 가까이 붙어 있는 것을 확인할 수 있고, 이를 통해 데이터의 구조를 이해하는 데 큰 도움이 될 수 있어요. 정말 신기하죠?

 

하지만 t-SNE도 단점이 있어요. 계산 속도가 PCA에 비해 매우 느리고, 매개변수 설정에 따라 결과가 크게 달라질 수 있기 때문에 주의가 필요해요. 특히,  매개변수는 t-SNE의 성능에 큰 영향을 미치는데, 이 값을 적절하게 설정하는 것이 중요합니다.  값이 너무 작으면 국지적인 구조만 반영하고, 너무 크면 전반적인 구조만 반영할 수 있어요. 그래서 적절한 값을 찾기 위해 여러 번 실험해보는 것이 좋습니다. 어떤 값을 선택해야 하는지 고민이시라면, 데이터의 크기와 데이터의 분포를 고려해서 여러 값을 시도해보는 것을 추천드려요.

 

t-SNE는 PCA와는 다른 목적을 가지고 있습니다. PCA는 차원 축소를 통해 데이터 분석과 모델링의 효율성을 높이는 데 초점을 맞춘다면, t-SNE는 주로 시각화를 위한 차원 축소 기법으로 사용됩니다. 그러니까, PCA는 데이터 분석의 전반적인 과정에 사용될 수 있지만, t-SNE는 주로 데이터 탐색이나 시각화 단계에서 사용하는 것이 일반적입니다. 두 기법의 특징을 잘 이해하고, 데이터 분석 목적에 맞는 기법을 선택하는 것이 중요하겠죠.

 


실전 예제: Iris 데이터셋으로 PCA와 t-SNE 적용하기

이제, 실제 데이터를 사용하여 PCA와 t-SNE를 적용해 보는 실전 예제를 보여드릴게요. 여기서는 유명한 Iris 데이터셋을 사용할 건데요, 이 데이터셋은 붓꽃의 꽃받침 길이와 너비, 꽃잎 길이와 너비 등 4개의 특징을 가지고 있어요. 이 4차원 데이터를 PCA와 t-SNE를 사용하여 2차원으로 축소하고, 결과를 비교해 보도록 하겠습니다. 자, 함께 따라 해 보시죠!

 

먼저, 필요한 라이브러리를 import하고 Iris 데이터셋을 불러와야 해요. 그리고, 데이터 전처리 과정으로 데이터를 표준화해 줍니다. 표준화는 데이터의 평균을 0으로, 표준 편차를 1로 만들어주는 과정인데, PCA를 적용하기 전에 필수적인 단계입니다. 왜냐하면 PCA는 데이터의 스케일에 민감하기 때문이에요. 스케일이 다르면 주성분의 방향이 왜곡될 수 있거든요. 이렇게 표준화된 데이터에 PCA와 t-SNE를 적용하면, 각각 2차원으로 축소된 데이터를 얻을 수 있습니다.

 


다음은 실제 코드와 결과입니다.

 

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# Iris 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target

# 데이터 표준화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# PCA 적용
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# t-SNE 적용
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)

# 결과 시각화
plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.title('PCA')

plt.subplot(1, 2, 2)
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis')
plt.title('t-SNE')

plt.show()

#설명된 분산 비율 출력
print(pca.explained_variance_ratio_)

 코드를 실행하면 PCA와 t-SNE를 통해 2차원으로 축소된 Iris 데이터셋의 산점도가 그려집니다. 각 점의 색깔은 붓꽃의 종류를 나타내요. PCA와 t-SNE 결과를 비교해보면, PCA는 데이터의 전반적인 분포를 잘 보여주지만, t-SNE는 각 종류의 붓꽃들이 더 명확하게 구분되는 것을 확인할 수 있어요.

 

PC1 0.9246 0.9246
PC2 0.0530 0.9776

주성분 설명된 분산 비율 누적 설명된 분산 비율

 

위 표에서 보듯이, 첫 번째 주성분(PC1)이 데이터 분산의 약 92%, 두 번째 주성분(PC2)이 약 5%를 설명하고 있으며, 두 주성분을 합치면 전체 분산의 약 97%를 설명하는 것을 알 수 있습니다. 이 결과를 바탕으로, Iris 데이터셋의 경우 4차원 데이터를 2차원으로 축소해도 데이터의 중요한 정보를 거의 손실 없이 유지할 수 있다는 것을 알 수 있습니다. 물론, 이것은 Iris 데이터셋의 특징일 뿐이고, 다른 데이터셋에서는 다를 수 있다는 것을 유의해야 합니다.

 

자주 묻는 질문 (FAQ)

Q1: PCA와 t-SNE 중 어떤 기법을 사용해야 할까요?

 

A1: 데이터의 특성과 분석 목적에 따라 선택해야 합니다. 데이터의 선형 관계가 중요하고 차원 축소 후에도 해석 가능성을 유지해야 한다면 PCA가 적합합니다. 반면, 데이터의 비선형 관계를 시각적으로 확인하고 군집 구조를 파악하는 것이 목표라면 t-SNE가 더 적합합니다. 때로는 두 기법을 모두 사용하여 상호 보완적으로 분석하는 것도 좋은 방법입니다.

 

Q2: PCA에서 주성분의 개수는 어떻게 결정하나요?

 

A2: 주성분의 개수는 설명된 분산 비율을 확인하여 결정합니다. 일반적으로 95% 이상의 분산을 설명하는 주성분을 선택합니다. 하지만, 데이터의 특성이나 분석 목적에 따라 다른 기준을 적용할 수도 있습니다. 예를 들어, 시각화를 위해 2차원 또는 3차원으로 축소하는 경우에는 설명된 분산 비율보다는 시각적인 결과를 고려하여 주성분의 개수를 결정할 수 있습니다.

 

Q3: t-SNE의 perplexity 매개변수는 어떻게 설정해야 하나요?

 

A3: perplexity 매개변수는 t-SNE 알고리즘의 성능에 큰 영향을 미칩니다. 일반적으로 데이터 포인트 개수의 제곱근 근처 값을 사용하는 것이 좋습니다. 하지만, 최적의 perplexity 값은 데이터에 따라 다르므로, 여러 값을 시도해보고 가장 좋은 결과를 얻는 값을 선택해야 합니다. 여러 값으로 실험을 해보고, 결과를 비교 분석하는 것이 중요합니다. 결과 시각화를 통해 가장 좋은 결과를 보여주는 perplexity 값을 직접 확인하는 것이 가장 확실한 방법입니다.

 

마무리

 

이 글이 Scikit-learn을 이용한 차원 축소에 대한 이해를 높이는 데 도움이 되었기를 바랍니다.  궁금한 점이나 추가적으로 다루었으면 하는 내용이 있다면 댓글로 남겨주세요!

 

키워드: 파이썬, 머신러닝, Scikitlearn, 차원축소, PCA, 주성분분석, tSNE, 데이터과학, 데이터분석, 고차원데이터, 설명된분산, perplexity, 데이터전처리, 과적합, 모델링